C++ 如何将特征雅可比奇异值分解与特征仿射矩阵结合使用
问题:我试图使用特征JacobiSVD模块计算旋转矩阵的奇异值分解,以计算旋转矩阵的单值分解 预期:我应该能够将我的Eigen::Affine3d类型的旋转矩阵传递给svd方法,然后使用svd中的U和V生成Eigen::Affine3d类型的新旋转矩阵 观察到的svd方法不将我的tSixDof矩阵作为可接受的参数 问题为什么我不能使用仿射矩阵作为输入?是否有更好的方法执行此操作C++ 如何将特征雅可比奇异值分解与特征仿射矩阵结合使用,c++,computer-vision,eigen,svd,C++,Computer Vision,Eigen,Svd,问题:我试图使用特征JacobiSVD模块计算旋转矩阵的奇异值分解,以计算旋转矩阵的单值分解 预期:我应该能够将我的Eigen::Affine3d类型的旋转矩阵传递给svd方法,然后使用svd中的U和V生成Eigen::Affine3d类型的新旋转矩阵 观察到的svd方法不将我的tSixDof矩阵作为可接受的参数 问题为什么我不能使用仿射矩阵作为输入?是否有更好的方法执行此操作 // Resolve numerical errors in the rotation matrix by imple
// Resolve numerical errors in the rotation matrix by implementing the
// orthogonal procrustes problem algorithm.
void SixDof::resolveRotation()
{
//initial SixDof
SixDof tSixDof;
Eigen::Index n = tSixDof.rows();
Eigen::Index m = tSixDof.rows();
Eigen::Matrix3d U;
Eigen::Matrix3d V;
Eigen::Matrix3d R;
Eigen::JacobiSVD<Eigen::Matrix3d> svd(tSixDof.rotation()
Eigen::ComputeFullU | Eigen::ComputeFullV);
U = svd.matrixU();
V = svd.matrixV();
R = U*V.transpose();
//Resolved SixDof
tSixDof.rotation() = R;
}
3x3旋转矩阵不是仿射3D变换。来自文档:“通用仿射变换由变换类表示,该变换类内部为(Dim+1)^2矩阵。”。要执行调整噪声旋转矩阵M的Procrustes,需要使用3x3特征矩阵(存储M)调用svd 谢谢,是的,我现在意识到了这一点,我现在使用的方法是tSixDof.rotation(),而不是tSixDof。但是,我不知道如何设置六自由度使用的漫游矩阵的元素。有什么想法吗?你的问题不清楚,因为你没有给出六自由度的类定义。我只是添加了定义。谢谢你的帮助。我真的不会扩展仿射类。您的签名表明您没有向它添加任何额外的有用功能,最好避免将特征类型子类化。如果你的仿射变换矩阵是A,你可以通过A.matrix()得到有噪声的旋转分量。block(0,0,3,3)谢谢你A.matrix()。block(0,0,3,3)是我需要的!
class SixDof : public Eigen::Affine3d
{
public:
SixDof();
SixDof(const Eigen::Affine3d& aOther);
void resolveRotation();
};