给定一组点的特征和SVD找到最佳拟合平面

dus*_*max 7 c++ math eigen

给定3D空间中的一组N个点,我试图使用SVD和Eigen找到最佳拟合平面.

我的算法是:

  1. 中心数据点(0,0,0)左右.
  2. 形成3xN点坐标矩阵.
  3. 计算矩阵的SVD.
  4. 将对应于最小奇异值的最小奇异向量设置为平面的法线.
  5. 设置从原点到平面的距离为正常∙质心.

我无法弄清楚如何使用Eigen的SVD模块来找到对应于点坐标矩阵的最小奇异值的最小奇异向量.

到目前为止,我有这个代码(算法的步骤1,2和5):

Eigen::Matrix<float, 3, 1> mean = points.rowwise().mean();
const Eigen::Matrix3Xf points_centered = points.colwise() - mean;

int setting = Eigen::ComputeThinU | Eigen::ComputeThinV;
Eigen::JacobiSVD<Eigen::Matrix3Xf> svd = points_centered.jacobiSvd(setting);

Eigen::Vector3d normal = **???**

double d = normal.dot(mean);
Run Code Online (Sandbox Code Playgroud)

bil*_*llx 4

表示U = svd.matrixU()、向量U.col(0)U.col(1)定义平面的底面并且U.col(2)垂直于平面。

U.col(0)还定义了具有最大标准偏差的方向。