C++ 如何将特征雅可比奇异值分解与特征仿射矩阵结合使用

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

问题:我试图使用特征JacobiSVD模块计算旋转矩阵的奇异值分解,以计算旋转矩阵的单值分解

预期:我应该能够将我的Eigen::Affine3d类型的旋转矩阵传递给svd方法,然后使用svd中的U和V生成Eigen::Affine3d类型的新旋转矩阵

观察到的svd方法不将我的tSixDof矩阵作为可接受的参数

问题为什么我不能使用仿射矩阵作为输入?是否有更好的方法执行此操作

// 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();
};