首页 > 解决方案 > 特征库,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

谢谢!

标签: c++c++11linear-algebraeigen

解决方案


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

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

所以最接近的旋转RC

R = U * V.transpose();

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

q = R * p;

现在,您是否感兴趣R或它的倒数R.transpose()==V.transpose()*U取决于您。

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


推荐阅读