Speeding up a loop

조회 수: 3 (최근 30일)
Swisslog
Swisslog 2013년 1월 17일
I have made a simple loop that works fine when dealing with small datasets, but takes ages to run when L is 10^6 in size - which unfortunately is the size I need to work with. I'm sure you can tell by the code itself I'm a matlab newbie, so any ideas on how this can be sped up would be very much appreciated. I've read about vectorisation but cannot work out how to vectorise this code.
C=cumsum(S);
L=length(C);
X=zeros(1,L)';
for i=1:L;
if C(i)>min(C(i:L));
X(i);
else
X(i)=1;
end
end
  댓글 수: 4
Swisslog
Swisslog 2013년 1월 17일
편집: Swisslog 2013년 1월 17일
Hi Rick,
I'm dealing with column vectors. I have a column of random numbers (S), which I add up C=(cumsum(S). I want to identify from C intervals where C is increasing (marked as 1 in X), and intervals where it is decreasing (marked as 0 in X). Importantly, if C is decreasing, I also want to set to 0 those values immediately before the decrease which are greater than the minimum value attained during the suceeding decrease - hence: if C(i)>min(C(i:L)). The code works precisely as I want it to, but just takes forever (~1 hour) when Length(S)=10^6.
P.S. As a slight aside, in the parlance of fractals: the aim of this code is esentially to construct a 1D cantor set (X) from a random series (S). In this sense C is akin to a devils staircase
Jan
Jan 2013년 1월 17일
Is the wanted property of C directly related to the sign of the corresponding element of S?

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

채택된 답변

Jan
Jan 2013년 1월 17일
편집: Jan 2013년 1월 17일
The main work is done in the repeated determination of the minimum. But this can be avoided easily:
% Cummumaltive minimum in backward direktion:
minC = zeros(size(C));
v = C(end);
for ii = numel(C):-1:1
if C(ii) < v
v = C(ii);
end
minC(ii) = v;
end
X = zeros(L, 1);
X(C <= minC) = 1;
Sorry, I cannot test this currently and I have the feeling that the logic is not correct. But at least the general idea could be helpful.
Btw.: This line wastes time only:
X(i);

추가 답변 (1개)

Swisslog
Swisslog 2013년 1월 17일
Thanks Jan, This seems to have done the trick - much faster and I've learned a lot, cheers

카테고리

Help CenterFile Exchange에서 Fractals에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by