c++ - 特征库,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
。同样,与存储布局无关。
推荐阅读
- c++ - LPCWSTR 错误 C++ 类型参数与类型参数不兼容
- r - How to find out if a subset of variable is more statistically significant for the dependent variable than another level of the same variable
- oracle - 如何解决问题更改表修改列提交不起作用
- angular - 在 Angular 10 中正确使用 Observable,值永远不会改变
- html - CSS Grid 模板区域未呈现应有的方式
- c++ - What does this question means by decrease key method?
- reactjs - React 路由器的 useLocation 抛出了一个无效的钩子使用错误,我不明白为什么
- javascript - JS 变革者
- certificate - 扩展 ClickOnce 的 Sha256 测试证书
- php - PHPUnit - 测试没有抛出异常?