How to speed up a for loop ?

1 Ansicht (letzte 30 Tage)
Sleh Eddine Brika
Sleh Eddine Brika am 6 Okt. 2016
Bearbeitet: elias GR am 6 Okt. 2016
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));

Akzeptierte Antwort

George
George am 6 Okt. 2016
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));
  1 Kommentar
Sleh Eddine Brika
Sleh Eddine Brika am 6 Okt. 2016
Thanks, I didn't thought about that

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (3)

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

Melden Sie sich an, um zu kommentieren.


Guillaume
Guillaume am 6 Okt. 2016
Bearbeitet: Guillaume am 6 Okt. 2016
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 am 6 Okt. 2016
Bearbeitet: elias GR am 6 Okt. 2016
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 Kommentare
Sleh Eddine Brika
Sleh Eddine Brika am 6 Okt. 2016
Sorry just a typo, A is n*3 matrix
elias GR
elias GR am 6 Okt. 2016
Bearbeitet: elias GR am 6 Okt. 2016
Furthermore, I think that the equation that you use is not correct for 3D vectors.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by