线性代数方程 Ax 的最小二乘解 = 由 在本征C++中
Least Squares Solution of Linear Algerbraic Equation Ax = By in Eigen C++
我有一组矩阵形式的线性代数方程,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有点矫枉过正。
相关文章:
- 当我们将数据从 ax 移动到端口地址时会发生什么
- 线性代数方程 Ax 的最小二乘解 = 由 在本征C++中
- 以线性最小二乘方式求解系统 Ax=b,具有复元素和下三角形平方 A 矩阵
- 当仅恒定项之一变化时,线性系统AX = B的有效解决方案
- 稀疏带状 Ax=b 的批量 CUDA 解决方案,用于各种 b
- C++ 用于求解复杂线性系统 Ax=b 的库
- 需要帮助解决稀疏 ax=b
- 对抛物线的坐标 (x,y) 进行排序 y=ax^2+bx+c x=x1,x2,x3, x4.根据 y 坐标
- QT:使用qcustomplot绘制ax^2+bx+c
- AX = 0 的非竞争解决方案,使用特征 c++
- 使用 UMFPACK 求解 Ax =B
- 是带有 RAX/EAX/AX/AL/AH 寄存器作为目的地的携带速度更快的补充
- 如何找到给定方程 ax + by = c 的最大值 (x+y),其中 a,b,c 是常数,x , y >= 0 并且都是整数?
- 计算多项式ax 3 + bx2 + cx + d的程序,对于给定的a,b,c和d,使用最少的运算次数
- 本征在其线性代数Ax=b中能否使用双精度以上?
- 犰狳:求解Ax=b分配堆
- 如何在c++中实现Y = aX + Y
- 用boost 1_58求解稀疏矩阵Ax=B