自己的图书馆,雅各比SVD

问题描述 投票:0回答:1

我试图估计两组点之间的3D旋转矩阵,我想通过计算协方差矩阵的SVD,比如C来做到这一点,如下所示:

U,S,V = svd(C)
R = V * U^T

在我的情况下,C3x3。我正在使用Eigen的JacobiSVD模块,我最近才发现它以列主格式存储矩阵。所以这让我感到困惑。

所以,当使用Eigen时,我应该这样做:V*U.transpose()还是V.transpose()*U

另外,旋转是准确的,直到改变对应于最小奇异值的U列的符号,使得R的行列式为正。假设最小奇异值的索引是minIndex

因此,当行列式为负数时,由于列主要混淆,我应该这样做:

U.col(minIndex) *= -1 or U.row(minIndex) *= -1

谢谢!

c++ c++11 linear-algebra eigen
1个回答
2
投票

这与存储行主要或列主要的矩阵无关。 svd(C)给你:

U * S.asDiagonal() * V.transpose() == C

所以最接近的R旋转到C是:

R = U * V.transpose();

如果你想将R应用于点p(存储为列向量),那么你可以:

q = R * p;

现在,您是否感兴趣R或其逆R.transpose()==V.transpose()*U由您决定。

奇异值缩放U的列,因此您应该反转列以获得det(U)=1。同样,与存储布局无关。

© www.soinside.com 2019 - 2024. All rights reserved.