# a question on for loop statement

1 view (last 30 days)
ektor on 16 May 2019
Commented: Luna on 17 May 2019
Dear all,
I have this for loop
T=1000;
k=0.1;
u=rand(T,1);
a = zeros(T,1);
a(1) =u(1)+ k*0.01;
for t=2:T
a(t) = u(t,1) + k*a(t-1);
end
Is there a faster way of obtaining a? Maybe if I avoid loop?

Show 1 older comment
madhan ravi on 16 May 2019
Luna T is 1000
Adam Danz on 16 May 2019
This is the tricky part: *a(t-1)
Short answer to "is there a faster way": Probably not.
There's probably a way to avoid the loop by replacing it with a convoluted, unreadable, jumble of functions but I doubt it will be as fast and it will not be as intuitive. If your loop works for you, keep it. It's simple, clean, and fast.
Luna on 16 May 2019
I agree with Adam I have tried with both T = 1000 and T = 1000000.
The time perfomances are below:
T = 1000 -> Elapsed time is 0.051244 seconds.
T = 1000000 -> Elapsed time is 0.073614 seconds.
The for loop is already as fast as it could be and the simplest solution.

Jos (10584) on 16 May 2019
This is filtering.
T=10; % smaller example
k=0.1;
u=rand(T,1);
a = zeros(T,1);
a(1) =u(1)+ k*0.01; % i do not get this addition ...
for t=2:T
a(t) = u(t,1) + k*a(t-1);
end
% filtering -> aa
uu = u ;
uu(1) = uu(1) + k*0.01 ; % implement offset?
aa = filter(1, [1 -k], uu) ;
% do they produce the same result?
isequal(a, aa) % YES

Adam Danz on 16 May 2019
No, the loop is still faster. As Jos mentioned, there's overhead computations in filter() that aren't needed in your loop.
It's a MYTH that loops are always slower than alternatives.
If you want something neat and tidy, use Jos' solution. If you want something that will save you fractions of microseconds and something you already understand, use your loop.
Jos (10584) on 17 May 2019
btw, regarding execution time, you should also include the pre-allocation of the array :-D
Luna on 17 May 2019
+1 Jos :)