How to replace For loops?

47 ビュー (過去 30 日間)
Liron Sabatani
Liron Sabatani 2020 年 4 月 13 日
コメント済み: Liron Sabatani 2020 年 4 月 14 日
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;
  1 件のコメント
Liron Sabatani
Liron Sabatani 2020 年 4 月 13 日
Thank you very much!!!

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by