gpt4 book ai didi

c++ - Eigen 库,雅可比 SVD

转载 作者:行者123 更新时间:2023-11-28 01:23:25 29 4
gpt4 key购买 nike

我正在尝试估计两组点之间的 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 或 U.row(minIndex) *= -1

谢谢!

最佳答案

这与存储行优先或列优先矩阵无关。 svd(C) 为您提供:

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

所以最接近 RC 的旋转是:

R = U * V.transpose();

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

q = R * p;

现在您是对 R 还是它的逆 R.transpose()==V.transpose()*U 感兴趣,由您决定。

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

关于c++ - Eigen 库,雅可比 SVD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105475/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com