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
댓글 수: 5
추가 답변 (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!