Code Optimization, for loop

1 visualización (últimos 30 días)
Yusuke Kadowaki
Yusuke Kadowaki el 28 de Sept. de 2017
Editada: Christoph F. el 29 de Sept. de 2017
Is it possible to make this code faster?
%
RevPSD = zeros(size(X));
for m = Tmin + 1:size(X,2)
for i = Tmin:Tmax
if m - i <= 0
break
else
RevPSD(:,m) = RevPSD(:,m) + exp(-2*delta*i*hop/fs)*(Xpsd(:,m-i));
end
end
end
  2 comentarios
Christoph F.
Christoph F. el 28 de Sept. de 2017
Two suggestions:
The inner loop only loops from Tmin to (m-1). The extra comparison of m and i inside the loop could be removed if the loop condition is changed, e.g.
for i = Tmin:(m-1)
RevPSD(:,m) = RevPSD(:,m) + exp(-2*delta*i*hop/fs)*(Xpsd(:,m-i));
end
The values of the term
exp(-2*delta*i*hop/fs)
only depend on i can could be pre-calculated for every possibly value of i outside the loop. e.g.
exptable = exp(-2*delta*(Tmin:Tmax)*hop/fs);
for m = Tmin + 1:size(X,2)
for i = Tmin:(m-1)
RevPSD(:,m) = RevPSD(:,m) + exptable(i-Tmin+1)*(Xpsd(:,m-i));
end
end
Jan
Jan el 28 de Sept. de 2017
@Christoph F: Please post this in the answer sections.

Iniciar sesión para comentar.

Respuesta aceptada

Christoph F.
Christoph F. el 28 de Sept. de 2017
Two suggestions:
The inner loop only loops from Tmin to (m-1). The extra comparison of m and i inside the loop could be removed if the loop condition is changed, e.g.
for i = Tmin:(m-1)
RevPSD(:,m) = RevPSD(:,m) + exp(-2*delta*i*hop/fs)*(Xpsd(:,m-i));
end
The values of the term
exp(-2*delta*i*hop/fs)
only depend on i can could be pre-calculated for every possibly value of i outside the loop. e.g.
exptable = exp(-2*delta*(Tmin:Tmax)*hop/fs);
for m = Tmin + 1:size(X,2)
for i = Tmin:(m-1)
RevPSD(:,m) = RevPSD(:,m) + exptable(i-Tmin+1)*(Xpsd(:,m-i));
end
end
  2 comentarios
Yusuke Kadowaki
Yusuke Kadowaki el 29 de Sept. de 2017
Thanks a lot Christoph. The second one worked a bit.
Christoph F.
Christoph F. el 29 de Sept. de 2017
Editada: Christoph F. el 29 de Sept. de 2017
Looking at the expression more closely, the whole term
exp(-2*delta*i*hop/fs)*(Xpsd(:,m-i))
only depends on m and i. I assume that with some creative thinking, the inner loop could be completely removed and replaced with adding a matrix to RevPSD.
The general idea is to use built-in MatLab matrix/vector functions (add, multiply, sum, etc) instead of loops whenever possible, and not to calculate expressions repeatedly that only need to be calculated once.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre ループと条件付きステートメント en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!