help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Reducing for loop


From: Oliver Heimlich
Subject: Re: Reducing for loop
Date: Wed, 25 Mar 2015 21:40:54 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.5.0

Am 25.03.2015 um 21:09 schrieb Dr.-Ing. Dieter Jurzitza:
Dear listmembers,
I am using a for loop as follows. I have an array, say A, containing numelem
elements.

Now I want to fill array B with elements as follows:

B(1)=A(1)

for i=2:numelem
    B(i)=B(i-1)+A(i);
endfor

In order to get this vectorized I tried to write something like

B(1)=A(1) # IMHO no way around ...

# apparently does not work ...
for i=2:n
    B=A(i)+B(i-1);
endfor

What am I doing wrong here? Apparently using the indexed left - side array on
the right side is causing trouble ... Many thanks for any explanation in
advance,
take care

Dieter,

after vectorization you will have no for-loop anymore. Instead you have a single assignment, which updates the whole array at once.

> for i=2:numelem
>     B(i)=B(i-1)+A(i);
> endfor

Lets solve this step by step. If you did B=B+A, this would compute the sum of B and A element-wise and be equivalent to:
for i=1:numelem
    B(i)=B(i)+A(i);
endfor

You do not want the sum of n elements, but the sum of n-1 elements. You can achieve this by working on subsets of the arrays with range indices:

B(2:end) = B(2:end) + A(2:end);
… which is equivalent to …
for i=2:numelem
    B(i)=B(i)+A(i);
endfor

Last, you want to shift indices of the first addend, which is also possible:

B(2:end) = B((2:end) - 1) + A(2:end);
or alternatively
B(2:end) = B(1:end - 1) + A(2:end);

and not forget: B(1)=A(1);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]