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

0 votos

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 Centro de ayuda y File Exchange.

Preguntada:

el 28 de Sept. de 2017

Editada:

el 29 de Sept. de 2017

Community Treasure Hunt

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

Start Hunting!