How to vectorize a for-loop?

3 ビュー (過去 30 日間)
Samuel Hammarberg
Samuel Hammarberg 2013 年 5 月 18 日
Hello!
I would appreaciate any help vectorizing the for loop below. The problem i cannot solve is how to take out the constants from wdrive and multiply it with the rest, according to the loop below. I want to become better at vectorizing my MATLAB code so I would really appreciate any help! Thanks alot!
%S and R are square matrices (404*404).
%fc is a column vector
wdrive=0:1:800;
a2=zeros(2*dofs,(length(wdrive)));
b2=zeros(2*dofs,(length(wdrive)));
Amp=zeros(1,length(wdrive));
SRS=S*(R\S);
SRfc=S*(R\fc);
for i=1:length(wdrive)
a2(:,i)=(wdrive(i)^2*SRS+R)\(fs-wdrive(i)*SRfc);
b2(:,i)=(R)\(fc+wdrive(i)*S*a2(:,i));
Amp(i)=sqrt(a2(dofs-1,i)^2+b2(dofs-1,i)^2);
end
  2 件のコメント
Matt J
Matt J 2013 年 5 月 18 日
What is "fs"?
Samuel Hammarberg
Samuel Hammarberg 2013 年 5 月 18 日
Ops! Forgot to specify that. Fc is a column vector with the same size as Fs.

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

採用された回答

Matt J
Matt J 2013 年 5 月 18 日
編集済み: Matt J 2013 年 5 月 18 日
I don't think you can vectorize everything, but you can cut down on the operations done inside the loop,
Rfc=R\fc;
SRS=S*(R\S);
SRfc=S*(Rfc);
rhs=bsxfun(@minus,fs,SRfc*wdrive);
for i=1:length(wdrive)
a2(:,i)=(wdrive(i)^2*SRS+R)\rhs(:,i);
end
b2=Rfc+R\S*bsxfun(@times, wdrive, a2);
Amp=abs(a2(dofs-1,:)+i*b2(dofs-1,:));
  5 件のコメント
Matt J
Matt J 2013 年 5 月 19 日
The for-loop isn't slowing you down significantly. You just have a lot of matrix inversions
(wdrive(i)^2*SRS+R)
to do. There's no simplification to this that I can see, unless there is some special structure in S and R that you haven't mentioned.
Matt J
Matt J 2013 年 5 月 19 日
You could also try parfor, if you have the Parallel Computing Toolbox.

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

その他の回答 (1 件)

Samuel Hammarberg
Samuel Hammarberg 2013 年 5 月 18 日
編集済み: Matt J 2013 年 5 月 19 日
Relocated to Comment by Matt J

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by