Improving the performance of a for loop in Matlab
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Yodish
am 19 Jul. 2017
Bearbeitet: Yodish
am 20 Jul. 2017
Hello,
I am trying to improve the speed of the following for loop in Matlab. As it is now is incredibly slow. Maybe vectorizing? But one vector slides on the other and constantly changes.
for m = 1:size(phi,1) - (constant)/2
phi(m) = phi(m).*(mean(conj(phi(1+m:(constant)/2+m))));
end
Thanks!
2 Kommentare
dpb
am 19 Jul. 2017
What are phi and constant? Is phi actually complex; and even if so,
mean(conj(x)) --> conj(mean(x))
so can be outside the loop.
Akzeptierte Antwort
David Goodmanson
am 20 Jul. 2017
Bearbeitet: David Goodmanson
am 20 Jul. 2017
Hello Yodish,
'one vector slides on the other'. This is basically convolution, and since you are finding a mean it is convolution with a vector of ones, of length constant/2. Since the code is not iterative, all the means can be found first.
N = 10000;
constant = 5000;
phi_orig = rand(1,N)+i*rand(1,N);
tic % first way
phi = phi_orig;
for m = 1:length(phi) - (constant)/2
phi(m) = phi(m).*(mean(conj(phi(1+m:(constant)/2+m))));
end
toc
tic % second way
phi2 = phi_orig;
c2 = constant/2;
A = conv(phi2,ones(1,c2),'valid')/c2; % means
A(1) = [];
sA = length(A);
phi2(1:sA) = phi2(1:sA).*conj(A);
toc
d = max(abs(phi2-phi)) % should be zero
In your code I used length(phi) rather than size(phi,1) so that phi could be either a row vector or a column vector.
1 Kommentar
Weitere Antworten (0)
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!