Vectorizing a loop that calculates cosd on every element?
2 次查看(过去 30 天)
显示 更早的评论
Hi. I have radiation data for every minute of a day that is spectrally resolved so each minute contains several wavelengths. I want to project this radiation on a tilted plane with a nested for loop that looks like this:
for minute=1:1440 %minute during day
for beta = 1:length(Tilt) %tilt of surface
for lambda = 1:length(DirectNormal) %wavelength of incoming light
TiltedDirect(minute,beta,lambda)=DirectNormal(lambda,minute)*cosd(AOFINCEQ15(minute,beta));
end
end
end
And what I want to do is go through all minutes of the day and all the tilts (minute and beta) on an element by element basis. BUT I want to perform the same cosine calculation on all wavelengths within that minute and tilt, so I don’t really need to go through all the lambda values per element as I am now. And since I have over 2000 lambdas the loop is incredibly slow. I know very little about vectorization but I assume this would be an ideal situation to vectorize by performing the cosine on all lambda values at the same time. But I can’t figure out how to write that in the code.
Could someone advise me?
Thanks!
0 个评论
采纳的回答
David Young
2015-3-16
You don't need vectorization to avoid computing the cosine on every iteration through the lambda loop - just put the calculation outside:
TiltedDirect = zeros(1440, length(Tilt), size(DirectNormal,1));
for minute = 1:1440 %minute during day
for beta = 1:length(Tilt) %tilt of surface
c = cosd(AOFINCEQ15(minute,beta));
for lambda = 1:size(DirectNormal,1) %wavelength of incoming light
TiltedDirect(minute,beta,lambda) = DirectNormal(lambda,minute) * c;
end
end
end
Note that I've also changed length to size - you can't guarantee that length will give the size of the right dimensions. I've also preallocated TiltedDirect , which will help efficiency.
By the way, are you sure you want AOFINCEQ15(minute,beta) and not AOFINCEQ15(minute,Tilt(beta))?
If you'd still like to vectorize the inner loop, you can do this
TiltedDirect = zeros(1440, length(Tilt), size(DirectNormal,1));
for minute = 1:1440 %minute during day
for beta = 1:length(Tilt) %tilt of surface
c = cosd(AOFINCEQ15(minute,beta));
TiltedDirect(minute,beta,:) = DirectNormal(:, minute) * c;
end
end
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!