Apply function on several matrices without for loop

1 回表示 (過去 30 日間)
Guillaume
Guillaume 2017 年 10 月 9 日
コメント済み: Guillaume 2017 年 10 月 9 日
Hi all,
I have hundred 3x3 rotation matrices stored in a 100x9 matrix. I would like to compute the corresponding rotation vectors using the Rodrigues convention. The desired output would be a 100x3 matrix.
Currently, I have written a function with a for loop that reads the 9 parameters of each rotation matrix line by line and fills in the corresponding rotation vector line by line.
function [rot_vectors] = rotationMatricesToVectors(rot_matrices)
nb_rotations = size(rot_matrices,1);
rot_vectors = zeros(nb_rotations,3);
for i = 1:nb_rotations
R = [...
rot_matrices(i,1) rot_matrices(i,2) rot_matrices(i,3);
rot_matrices(i,4) rot_matrices(i,5) rot_matrices(i,6);
rot_matrices(i,7) rot_matrices(i,8) rot_matrices(i,9)];
rot_vectors(i,:) = rotationMatrixToVector(R);
end
end
I was wondering if there is a more elegant way to write this function, in particular to avoid the for loop.
Thank you!
Guillaume
  4 件のコメント
Matt J
Matt J 2017 年 10 月 9 日
@Guillaume2,
Good point, although I don't think the transposition should matter, ultimately. The rotation axes are the same both for a rotation matrix R and its transpose.
Guillaume
Guillaume 2017 年 10 月 9 日
Hi Matt, Guillaume,
Thanks for the comments! As you suggested, I am going to change the indexing (column by column instead of row by row).
rotationMatrixToVector is actually a built-in function:
https://fr.mathworks.com/help/vision/ref/rotationmatrixtovector.html

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

回答 (1 件)

Matt J
Matt J 2017 年 10 月 9 日
編集済み: Matt J 2017 年 10 月 9 日
I doubt this will be faster than a for loop, but it does get rid of it.
function [rot_vectors] = rotationMatricesToVectors(rot_matrices)
nb_rotations = size(rot_matrices,1);
Rstack=reshape(rot_matrices.',3,3,[]);
K=kron(speye(nb_rotations),ones(3));
K(K>0)=Rstack(:);
[v,~]=eigs(K,1);
rot_vectors=reshape(v,3,[]).';

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by