我有一组矩阵形式的线性代数方程, Ax = By 。其中 A 是36x20
的矩阵且 x 是大小为20
的向量, B 为{{1} }和 y 是36x13
。的秩(A)= 20 即可。因为系统是超定的(方程的数量多于变量),所以最小二乘解是可能的,i,e; x =(A ^ TA)^ - 1A ^ TBy 。我想要解决方案,以便最小化剩余误差e = Ax-By。
使用13x1
C ++库我已经制定了所有矩阵等我尝试了本页描述的方法
Eigen Tutorial!
我想本页描述的方法仅适用于方形矩阵。因为当它试图运行它时会出错。
Eigen/Dense
错误
x = A.jacobiSvd( ComputeThinU | ComputeThinV ).solve(B*y);
答案 0 :(得分:0)
在你的求解(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是如何运作的,但这似乎是问题所在。
答案 1 :(得分:0)
如文档中所述,ComputeThin*
选项仅适用于Dynamic
大小的矩阵。对于固定尺寸,您必须使用ComputeFull*
。不过,在您的情况下,最好使用Dynamic
大小矩阵,即MatrixXf
。固定大小的矩阵只适用于非常小的矩阵。
最后,ColPivHouseholderQR可能是最小二乘解决方案的更好选择。 SVD有点矫枉过正。