Jacobi SVD的Eigen图书馆



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

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

C在我的情况下是3x3。我正在使用本特征的jacobisvd模块为此,直到我最近才发现它以列尺寸的格式存储矩阵。所以这让我感到困惑。

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

此外,旋转是准确的,以更改与最小奇异值相对应的u列的符号,因此r的决定因素为正。假设最小的单数值的索引是minIndex

因此,当决定因素为负面时,由于列的主要混乱,我应该这样做:

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

谢谢!

这与存储的row-major或列专业的矩阵无关。svd(C)给您:

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

因此,最近的旋转 R to C是:

R = U * V.transpose();

如果要将R应用于点p(存储为列矢量),则可以:

q = R * p;

现在您是否有兴趣R还是其逆R.transpose()==V.transpose()*U取决于您。

单数值缩放U的列,因此您应该倒转列获取det(U)=1。同样,与存储布局无关。

相关内容

  • 没有找到相关文章

最新更新