How to speed up a for loop ?

1 次查看(过去 30 天)
I have a matrix A n*3 of normal, I want to calculate the angles as shown in the code
angle=zeros(length(A),1);
for i = 1 : length(A)
n=A(i,:);
angle(i)=asin((n(3))/(sqrt(n(1).^2+n(2).^2+n(3).^2)));
end
It works but since I am dealing with really big matrices I need to speed this up. I tried this way, but it doesn't works.
angle=asin(A(:,3))/(sqrt(A(:,3).^2+A(:,2).^2+A(:,1).^2));

采纳的回答

George
George 2016-10-6
Are you sure this is correct?
angle=asin(A(:,3))/(sqrt(A(:,3).^2+A(:,2).^2+A(:,1).^2));
That's doing matrix division. In your example, because of your loop, you are doing elementwise division. Fso
angle=asin(A(:,3)) ./ (sqrt(A(:,3).^2+A(:,2).^2+A(:,1).^2));

更多回答(3 个)

Massimo Zanetti
Massimo Zanetti 2016-10-6
Operate on rows, not columns:
angle=asin(A(3,:))/(sqrt(A(3,:).^2+A(2,:).^2+A(1,:).^2));
This will work.
  1 个评论
Guillaume
Guillaume 2016-10-6
编辑:Guillaume 2016-10-6
No it won't. The / should be ./
There is also no issue operating on columns or rows (whatever that mean).

请先登录,再进行评论。


Guillaume
Guillaume 2016-10-6
编辑:Guillaume 2016-10-6
It looks like A is a 2D matrix with a variable number of rows and 3 columns. If so, does not use length for getting the number of rows as it will return the number of columns if you have less than 3 rows. Use size(A, 1) to get the number of rows.
No loop is needed to get your result:
angle = asin(A(:, 3) ./ sqrt(sum(A.^2, 2)))
Your issue is that you want to do elementwise division so you need ./ instead of /.
I've also simplified your square root expression.

elias GR
elias GR 2016-10-6
编辑:elias GR 2016-10-6
If A have 3 rows and n columns, try that:
angle=asin(A(3,:))./(sqrt(A(3,:).^2+A(2,:).^2+A(1,:).^2));
  2 个评论
Sleh Eddine Brika
Sleh Eddine Brika 2016-10-6
Sorry just a typo, A is n*3 matrix
elias GR
elias GR 2016-10-6
编辑:elias GR 2016-10-6
Furthermore, I think that the equation that you use is not correct for 3D vectors.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by