How to replace For loops?

13 views (last 30 days)
Liron Sabatani
Liron Sabatani on 13 Apr 2020
Commented: Liron Sabatani on 14 Apr 2020
I wrote an code with a lots of For loops. I want to replace them and to use functions instead.
wich functions do the same actions?
The code:
w0=(2*pi)/2001;
ak1=zeros(1,2001); %initializing the coeffecients array
%calculating Fourier coeffecients
for k=0:1:2000
s=0;
for n1= 1:1:2001
s=a(n1)*exp(-1i*k*w0*(n1-1001))+s;
end
ak1(k+1)=(1/N)*real(s);
end
Thank's for helping ,
Liron
  2 Comments
dpb
dpb on 13 Apr 2020
Try vectorize on your expressions as starter...
Then just replace the loops with a vector expression for the variable that is in the loop...
Liron Sabatani
Liron Sabatani on 13 Apr 2020
thank you very much about your answer!
I tried to vectorize but I don't succeed to get rid from all the for loops..
That's what I did:
for k=0:1:2000
n1= (1:1:2001);
s=sum(a(n1).*exp(-1i*k*w0*(n1-1001)));
ak1(k+1)=(1/N)*real(s);
end

Sign in to comment.

Accepted Answer

Ameer Hamza
Ameer Hamza on 13 Apr 2020
Edited: Ameer Hamza on 13 Apr 2020
No functions are needed to replace the for loop in your current code. Just matrix operations are enough.
rng(0);
w0=(2*pi)/2001;
a = rand(1,2001); % missing from your posted code
N = 2001;
n1= 1:1:2001;
k=(0:1:2000)';
s = a*exp(-1i*k*w0*(n1-1001)).';
ak1=(1/N)*real(s);
Test if the output is correct
% your code
rng(0);
w0=(2*pi)/2001;
ak1=zeros(1,2001); %initializing the coeffecients array
a = rand(1,2001); % missing from your posted code
N = 2001;
%calculating Fourier coeffecients
for k=0:1:2000
s=0;
for n1= 1:1:2001
s=a(n1)*exp(-1i*k*w0*(n1-1001))+s;
end
ak1(k+1)=(1/N)*real(s);
end
% my code
s = a*exp(-1i*k*w0*(n1-1001)).';
ak2=(1/N)*real(s); % variable name changed to ak2 for comparison
Result:
>> isequal(ak1,ak2)
ans =
logical
1
  5 Comments
Ameer Hamza
Ameer Hamza on 14 Apr 2020
Following code vectorize it
rng(0);
w0=(2*pi)/2001;
a = rand(1,2001); % missing from your posted code
N = 2001;
n1= 1:1:2001;
k=(0:1:2000)';
s = a*exp(-1i*k*w0*(n1-1001)).';
ak1=(1/N)*real(s);
k=0:1:2000;
ck=ak1.*(1-exp(-1i.*k*w0)); %calculating ck Fourier coeffecients
n3=(1:1:2001)';
k=(0:1:2000);
s4=ck*exp(1i.*w0*(n3-1001)*k).';
c(n3)=real(s4);
Liron Sabatani
Liron Sabatani on 14 Apr 2020
again thank you!! I got the way to do this:)

Sign in to comment.

More Answers (1)

David Hill
David Hill on 13 Apr 2020
Edited: David Hill on 13 Apr 2020
No loops except arrayfun loop.
w0=(2*pi)/2001;
n1=1:2001;
k=0:2000;
s=arrayfun(@(x)sum(a(n1).*exp(-1i*x*w0.*(n1-1001))),k);
ak1=real(s)/N;

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!