How to replace For loops?

46 次查看(过去 30 天)
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 个评论
dpb
dpb 2020-4-13
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 2020-4-13
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

请先登录,再进行评论。

采纳的回答

Ameer Hamza
Ameer Hamza 2020-4-13
编辑:Ameer Hamza 2020-4-13
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 个评论
Ameer Hamza
Ameer Hamza 2020-4-14
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 2020-4-14
again thank you!! I got the way to do this:)

请先登录,再进行评论。

更多回答(1 个)

David Hill
David Hill 2020-4-13
编辑:David Hill 2020-4-13
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;

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by