自己的图书馆,Jacobi SVD
Eigen library, Jacobi SVD
我正在尝试估计两组点之间的 3D 旋转矩阵,我想通过计算协方差矩阵的 SVD 来做到这一点,比如 C
,如下所示:
U,S,V = svd(C)
R = V * U^T
C
在我的例子中是 3x3
。我为此使用了 Eigen 的 JacobiSVD 模块,我最近才发现它以列优先格式存储矩阵。所以这让我感到困惑。
那么,在使用 Eigen 时,我应该这样做:
V*U.transpose()
或 V.transpose()*U
?
此外,旋转是准确的,直到改变U中最小奇异值对应的列的符号,使得R的行列式为正。假设最小奇异值的索引是 minIndex
.
那么当行列式为负数时,由于列主要混淆,我应该怎么做:
U.col(minIndex) *= -1 or U.row(minIndex) *= -1
谢谢!
这与存储行优先或列优先矩阵无关。 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
。同样,与存储布局无关。
我正在尝试估计两组点之间的 3D 旋转矩阵,我想通过计算协方差矩阵的 SVD 来做到这一点,比如 C
,如下所示:
U,S,V = svd(C)
R = V * U^T
C
在我的例子中是 3x3
。我为此使用了 Eigen 的 JacobiSVD 模块,我最近才发现它以列优先格式存储矩阵。所以这让我感到困惑。
那么,在使用 Eigen 时,我应该这样做:
V*U.transpose()
或 V.transpose()*U
?
此外,旋转是准确的,直到改变U中最小奇异值对应的列的符号,使得R的行列式为正。假设最小奇异值的索引是 minIndex
.
那么当行列式为负数时,由于列主要混淆,我应该怎么做:
U.col(minIndex) *= -1 or U.row(minIndex) *= -1
谢谢!
这与存储行优先或列优先矩阵无关。 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
。同样,与存储布局无关。