线性代数方程 Ax 的最小二乘解 = 由 在本征C++中

Least Squares Solution of Linear Algerbraic Equation Ax = By in Eigen C++

本文关键字:C++ Ax 代数方程 小二 线性      更新时间:2023-10-16

我有一组矩阵形式的线性代数方程,Ax=By。其中 A36x20 的矩阵,x 是大小为 20 的向量,B36x13 的,y13x1的。等级(A)=20。因为系统是超定的(方程的数量比变量多),所以最小二乘解是可能的,即;x = (A^TA)^-1A^TBy.我想要解决方案,以便将残余误差e = Ax-By 最小化。

使用Eigen/Dense C++库,我制定了所有矩阵等。我尝试了此页面上描述的方法特征教程!

我想本页中描述的方法仅适用于平方矩阵。因为当它尝试运行它时会出错。

 x = A.jacobiSvd( ComputeThinU | ComputeThinV ).solve(B*y);

错误

 /usr/include/eigen3/Eigen/src/SVD/JacobiSVD.h: In member function 'const    
 Eigen::internal::solve_retval<Eigen::JacobiSVD<MatrixType, QRPreconditioner>, Rhs> 
 Eigen::JacobiSVD<MatrixType, QRPreconditioner>::solve(const 
 Eigen::MatrixBase<OtherDerived>&) const [with Rhs = 
 Eigen::GeneralProduct<Eigen::Matrix<float, 36, 13>, Eigen::Matrix<double, -1, 1>, 4>; 
 _MatrixType = Eigen::Matrix<float, 36, 20>; int QRPreconditioner = 2]':
 /usr/include/eigen3/Eigen/src/SVD/JacobiSVD.h:658:5: warning: control reaches end of  
 non-void function [-Wreturn-type]
 make[2]: *** [src/CMakeFiles/spacebot_actuationKinematics.dir 
 /ActuationKinematics.cpp.o] Error 1
 make[1]: *** [src/CMakeFiles/spacebot_actuationKinematics.dir/all] Error 2
 make: *** [all] Error 2

似乎您的求解(B*y)中的矩阵乘法有问题; 部分。 尝试单独执行 B*y 并使用 solve(result); 相反。

Eigen::GeneralProduct<Eigen::Matrix<float, 36, 13>, Eigen::Matrix<double, -1, 1>, 4>

这句话让我产生了这种怀疑。它说 y 变量的大小为 -1x1,因此您的程序无论如何都不会运行,因为它不能与矩阵相乘。

另外,教程说...

A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl;

我不知道 Eigen 究竟是如何工作的,但这似乎是问题所在。

如文档中所述,ComputeThin*选项仅适用于Dynamic大小的矩阵。对于固定大小,必须使用 ComputeFull* 。尽管如此,在您的情况下,最好使用Dynamic大小的矩阵,即 MatrixXf .固定大小的矩阵只对非常小的矩阵有意义。

最后,ColPivHouseholderQR 可能是最小二乘求解的更好选择。SVD有点矫枉过正。