证明AX=0的最小二乘解是ATA最小特征值对应的特征向量

坑爹的,csdn没法编辑公式,我只能在word上写好截图了。




因此,如果能构造AX=0,则最小二乘解就直接求ATA的最小特征解就可以了,这里举一个平面拟合的例子:

假如有一束点云,如何从点云里把平面求出来。啥也不说了,上代码吧:

Bool ComplanationFit(Geometries::Coordinate *pPoints, Int32 nPointcount, Double tolerance)
{
if ((pPoints == NULL) || (nPointcount < 4) || (tolerance < 0.0))
{
return false;
}
/*
* 解XTX的特征值
*/
Eigen::MatrixXd X = Eigen::MatrixXd::Zero(nPointcount, 4);
for (Int32 i = 0; i < nPointcount; i++)
{
Coordinate c = pPoints[i];
X(i, 0) = c.x;
X(i, 1) = c.y;
X(i, 2) = c.z;
X(i, 3) = 1.0;
}
Eigen::MatrixXd XTX = X.transpose() * X;


Eigen::EigenSolver<Eigen::MatrixXd> es(XTX);


std::complex<Double> d[4];
  d[0] = es.eigenvalues()[0];
d[1] = es.eigenvalues()[1];
d[2] = es.eigenvalues()[2];
d[3] = es.eigenvalues()[3];


int iMin = 0; double dMax = DBL_MAX;
for (int i = 0; i < 4; i++)
{
if (d[i].real() < dMax)
{
iMin = i;
dMax = d[i].real();
}
}
Eigen::VectorXcd V = es.eigenvectors().col(iMin);
//平面方程
double dA = V(0).real();
double dB = V(1).real();
double dC = V(2).real();
double dD = V(3).real();


//投射到该平面
for (int i = 0; i < nPointcount; i++)
{
double x = pPoints[i].x;
double y = pPoints[i].y;
double z = pPoints[i].z;
double t = (dA * x + dB * y + dC * z + dD) / (dA * dA + dB * dB + dC * dC);


pPoints[i].x = x - dA * t;
pPoints[i].y = y - dB * t;
pPoints[i].z = z - dC * t;
}
return true;
}




  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神气爱哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值