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 个评论

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
@Christoph F: Please post this in the answer sections.

请先登录,再进行评论。

 采纳的回答

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 个评论

Thanks a lot Christoph. The second one worked a bit.
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.

请先登录,再进行评论。

更多回答(0 个)

类别

在 帮助中心 和 File Exchange 中查找有关 ループと条件付きステートメント 的更多信息

Community Treasure Hunt

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

Start Hunting!