Vectorize this for loop

1 回表示 (過去 30 日間)
Michael Fink
Michael Fink 2011 年 5 月 31 日
Hey everyone,
I have identified the following for-loop to be a time-eater in my program and I'm looking to find a more efficient solution, possibly vectorizing the whole thing.
What I have is a tool path that consists of - x,y,z coordinates - o1,o2,o3 which are the orientation vector components - t as the time vector
Now I want to calculate the coodinates of an eccentric movement orthogonal to the orientation with frequency fecc and radius recc to that toolpath. For that I have come up with the following code:
for i=1:length(t)
v=null([o1(:,i) o2(:,i) o3(:,i)]); %Create orthogonal vectors in circle plane
xecc=recc*(sin(fecc*t)*v(1,1)+cos(fecc*t)*v(1,2)); %x of circle in 3D
yecc=recc*(sin(fecc*t)*v(2,1)+cos(fecc*t)*v(2,2)); %y of circle in 3D
zecc=recc*(sin(fecc*t)*v(3,1)+cos(fecc*t)*v(3,2)); %z of circle in 3D
end
This works fine but takes a lot of time (some paths include up to 100k points). Is there any way to vectorize this or increase efficiency by other means?
Thanks in advance!
Michael
I attached an example so you see what this is about. Cyan is x,y,z and Red is x+xecc, y+yecc, z+zecc: http://img836.imageshack.us/img836/750/examplekp.jpg
  2 件のコメント
Jan
Jan 2011 年 5 月 31 日
I assume there is a missing ( in the "xecc=recc*sin(" line.
Michael Fink
Michael Fink 2011 年 5 月 31 日
yeah thanks, I corrected it now

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

採用された回答

Robert Cumming
Robert Cumming 2011 年 5 月 31 日
did you use
profile on
profile viewer
to ID where the time is lost?
You could pull the
sin(fecc*t)
cos(fecc*t)
outside the loop since you are doing the calculation everytime when the result is always the same (no dependence on t(i).
  1 件のコメント
Michael Fink
Michael Fink 2011 年 5 月 31 日
no just used tic toc to measure the time spent in the loop

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

その他の回答 (2 件)

Jan
Jan 2011 年 5 月 31 日
At first start with the standard method to accelerate loops: Move all repeated calculations outside!
s = sin(fecc * t);
c = cos(fecc * t);
for i=1:length(t)
v = null([o1(:,i), o2(:,i), o3(:,i)]);
xecc = recc * (s * v(1,1) + c * v(1,2));
yecc = recc * (s * v(2,1) + c * v(2,2));
zecc = recc * (s * v(3,1) + c * v(3,2));
end
But now I'm confused: the values for xecc, yecc and zecc are overwritten in each iteration. Then the loop is not necessary at all. This makes a further vectorization hard...
  1 件のコメント
Michael Fink
Michael Fink 2011 年 5 月 31 日
i think that was part of the problem because every iteration the whole vector is recalculated

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


Michael Fink
Michael Fink 2011 年 5 月 31 日
thanks to both of you for the fast replies. I changed the code to
xecc=zeros(1,length(t));
yecc=zeros(1,length(t));
zecc=zeros(1,length(t));
c_sin=recc*sin(fecc*t);
c_cos=recc*cos(fecc*t);
for i=1:length(t)
v=null([o1(:,i) o2(:,i) o3(:,i)]);
xecc(i)=c_sin(i)*v(1,1)+c_cos(i)*v(1,2);
yecc(i)=c_sin(i)*v(2,1)+c_cos(i)*v(2,2);
zecc(i)=c_sin(i)*v(3,1)+c_cos(i)*v(3,2);
end
that took me from Elapsed time is 9.421981 seconds. to Elapsed time is 0.1321981 seconds.
Thanks!!

カテゴリ

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

Community Treasure Hunt

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

Start Hunting!

Translated by