本文涵盖内容:
基于最小二乘法的空间任意方向的圆柱拟合,
以及矩阵求广义逆小知识,分为两个方法实现,一个是Eigen库和自编算法。
最小二乘拟合为发散型题。实现方法千千万,矩阵求逆只是其中一个方法。
20200329主要介绍,Eigen库矩阵求广义逆方法,后续内容慢慢更新
1.Eigen库基础知识
https://blog.csdn.net/caomin1hao/article/details/81358911
2.Eigen求逆算法
/*
*
* Eigen 求解广义逆
*
*/
Eigen::MatrixXd pinv(Eigen::MatrixXf A)
{
Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeFullU | Eigen::ComputeFullV);//M=USV*
double pinvtoler = 0.00001; //tolerance
int row = A.rows();
int col = A.cols();
int k = row>col?col:row;
//int k = min(row,col);
Eigen::MatrixXd X = Eigen::MatrixXd::Zero(col,row);
Eigen::MatrixXd singularValues_inv = svd.singularValues();//奇异值
Eigen::MatrixXd singularValues_inv_mat = Eigen::MatrixXd::Zero(col, row);
for (long i = 0; i<k; ++i) {
if (singularValues_inv(i) > pinvtoler)
singularValues_inv(i) = 1.0 / singularValues_inv(i);
else singularValues_inv(i) = 0;
}
for (long i = 0; i < k; ++i)
{
singularValues_inv_mat(i, i) = singularValues_inv(i);
}
X=(svd.matrixV())*(singularValues_inv_mat)*(svd.matrixU().transpose());//X=VS+U*
return X;
}
3.普通数据与Eigen数据交换
圆柱面方程