How to replace For loops?
14 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Liron Sabatani
am 13 Apr. 2020
Kommentiert: Liron Sabatani
am 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 Kommentare
dpb
am 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...
Akzeptierte Antwort
Ameer Hamza
am 13 Apr. 2020
Bearbeitet: Ameer Hamza
am 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 Kommentare
Ameer Hamza
am 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);
Weitere Antworten (1)
David Hill
am 13 Apr. 2020
Bearbeitet: David Hill
am 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;
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!