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
Jan
Jan 2017년 9월 28일
@Christoph F: Please post this in the answer sections.

댓글을 달려면 로그인하십시오.

 채택된 답변

Christoph F.
Christoph F. 2017년 9월 28일

0 개 추천

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

Yusuke Kadowaki
Yusuke Kadowaki 2017년 9월 29일
Thanks a lot Christoph. The second one worked a bit.
Christoph F.
Christoph F. 2017년 9월 29일
편집: Christoph F. 2017년 9월 29일
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에서 ループと条件付きステートメント에 대해 자세히 알아보기

질문:

2017년 9월 28일

편집:

2017년 9월 29일

Community Treasure Hunt

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

Start Hunting!