Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

How to vectorize a for-loop?

Asked by Samuel Hammarberg on 18 May 2013

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 Comments

Matt J on 18 May 2013

What is "fs"?

Samuel Hammarberg on 18 May 2013

Ops! Forgot to specify that. Fc is a column vector with the same size as Fs.

Samuel Hammarberg

Products

No products are associated with this question.

2 Answers

Answer by Matt J on 18 May 2013
Edited by Matt J on 18 May 2013
Accepted answer

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 Comments

Matt J on 19 May 2013

Samuel Hammarberg commented:

It would still be sweet if you, somehow, could get rid of the for loop altogether. So if some one could crack that, that would be great!

Thank you very much!

Matt J on 19 May 2013

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 on 19 May 2013

You could also try parfor, if you have the Parallel Computing Toolbox.

Matt J
Answer by Samuel Hammarberg on 18 May 2013
Edited by Matt J on 19 May 2013

Relocated to Comment by Matt J

0 Comments

Samuel Hammarberg

Contact us