How to speed up a for loop ?
Afficher commentaires plus anciens
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));
Réponse acceptée
Plus de réponses (3)
Massimo Zanetti
le 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.
1 commentaire
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.
If A have 3 rows and n columns, try that:
angle=asin(A(3,:))./(sqrt(A(3,:).^2+A(2,:).^2+A(1,:).^2));
Catégories
En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!