How to implement this without using for?

5 ビュー (過去 30 日間)
Bernard Küsel
Bernard Küsel 2011 年 5 月 6 日
This is my code:
function Y=FCOS(win)
N=size(win,2)-1;
teta=2*pi/N;
d=2*pi/N;
win1=win(:,1:N);
win2=win(:,2:N+1);
C1=0; C2=0;
for j=1:N
C1=C1+(2/N)*win1(:,j)*cos(j*teta);
C2=C2+(2/N)*win2(:,j)*cos(j*teta);
end
Yc=C1;
Ys=(C1*cos(d)-C2)/sin(d);
Y=complex(Yc,Ys);
My idea was to do the following:
C1=2/N*sum(win1.*cos((1:N)*teta),2);
C2=2/N*sum(win2.*cos((1:N)*teta),2);
But it will only work if my variable 'win' has only 1 line. For this to work, I would have to use, instead of (1:N), [1:N; 1:N; 1:N ... ;1:N], where this matrix should have the same number of lines as 'win'. But I can only think of a way of doing this with a for.
Anyone have a better solution?

採用された回答

Sean de Wolski
Sean de Wolski 2011 年 5 月 6 日
Close!
Use bsxfun:
C1 = sum(2/N*bsxfun(@times,win1,cos((1:N)*teta)),2);
C2 = sum(2/N*bsxfun(@times,win2,cos((1:N)*teta)),2);
And to make it faster do the cos(1:N)*teta only once:
cosnxteta = cos((1:N)*teta));
C1 = sum(2/N*bsxfun(@times,win1,cosnxteta,2);
C2 = sum(2/N*bsxfun(@times,win2,cosnxteta,2);
  3 件のコメント
Sean de Wolski
Sean de Wolski 2011 年 5 月 6 日
repmat(1:N,[ntimes,1]); %But this can often be avoided with bsxfun!
Bernard Küsel
Bernard Küsel 2011 年 5 月 6 日
Thanks for the tips!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMATLAB についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by