我有一组矩阵形式的线性代数方程,Ax=By。其中 A 是 36x20
的矩阵,x 是大小为 20
的向量,B 是 36x13
的,y 是13x1
的。等级(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有点矫枉过正。