Asked by Sleh Eddine Brika
on 6 Oct 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));

Answer by George
on 6 Oct 2016

Accepted Answer

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));

Answer by Massimo Zanetti
on 6 Oct 2016

Operate on rows, not columns:

angle=asin(A(3,:))/(sqrt(A(3,:).^2+A(2,:).^2+A(1,:).^2));

This will work.

Answer by Guillaume
on 6 Oct 2016

Edited by Guillaume
on 6 Oct 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.

Sign in to comment.

Answer by elias GR
on 6 Oct 2016

Edited by elias GR
on 6 Oct 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));

Sleh Eddine Brika
on 6 Oct 2016

Sorry just a typo, A is n*3 matrix

elias GR
on 6 Oct 2016

Furthermore, I think that the equation that you use is not correct for 3D vectors.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.