필터 지우기
필터 지우기

speed up for cycle?

조회 수: 2 (최근 30일)
matteo avanzi
matteo avanzi 2017년 12월 5일
답변: Steven Lord 2017년 12월 5일
i have this for cycle.
G=Bic+dif+Ri;
for i=1:size(G);
if -h_s(i) < T < h_s(i); % if true is day
G(i)=Bic(i)+dif(i)+Ri(i); % [w/m^2] radiazione globale su una superficie comunque orientata
else
G(i)=0;
end
end
i tried pre allocating in a G=zeros(31536000) but it exceeds the max value, so i tried pre allocating in a vector G=Bic+dif+Ri; but it needs a long time. 31536000 is the size of G.
Is there a method to have a fast process? or it just depend form my PC?
thanks
  댓글 수: 1
Adam
Adam 2017년 12월 5일
편집: Adam 2017년 12월 5일
G=zeros(31536000);
would attempt to create a square matrix of 31536000 * 31536000 which is massive.
If you have 31536000 elements then you should presize as
G = zeros( 1,31536000 );
or
G = zeros( 31536000,1 );
Also:
for i=1:size(G)
is not a good way to program a loop - it will simply take the first output of size and ignore the rest. If this is what you want then:
for i=1:size(G,1)
would be a clearer way to show that. Or if G is a vector then
for i=1:numel(G)
is a lot better.

댓글을 달려면 로그인하십시오.

답변 (1개)

Steven Lord
Steven Lord 2017년 12월 5일
G=Bic+dif+Ri;
This IS your preallocation of G. After executing this line, G is at its final size. You never add nor remove an element in your for loop.
for i=1:size(G);
if -h_s(i) < T < h_s(i); % if true is day
This doesn't do what you think it does. This is equivalent to the following, with the variable name shortened to make it a bit shorter.
if (-h < T) < h; % if true is day
I'll show four examples of why this doesn't work the way you think it does.
Let T = 1, h = 2. T is between -h and h so you expect this to return true. -2 < 1 is true and true < 2 is true so it does return true.
Let T = -0.5, h = 0.75. T is between -h and h so you expect this to return true. -0.75 < -0.5 is true and true < 0.75 is false so it returns false.
Let T = 2, h = 1.5. T is not between -h and h so you expect this to return false. -1.5 < 2 is true and true < 1.5 is true so it returns true.
Let T = 2, h = 0.5. T is not between -h and h so you expect this to return false. -0.5 < 2 is true and true < 0.5 is false so it returns false.
Instead use (-h < T) & (T < h).
G(i)=Bic(i)+dif(i)+Ri(i); % [w/m^2] radiazione globale su una superficie comunque orientata
else
G(i)=0;
end
end
You can vectorize the computation using linear indexing. You've already computed the first part of your if statement, so all you need to do is reject those elements that are "out of bounds".
G=Bic+dif+Ri;
listOfNonDay = (-h < T) & (T < h);
G(listOfNonDay) = 0;

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by