use*_*834 2 c++ matrix matrix-inverse eigen
我正在使用Eigen(与c ++一起使用的自由线性代数包)并试图反转一个小矩阵.遵循官方的Eigen文档后,我得到以下内容:
#include <iostream>
using namespace std;
#include <Eigen/LU>
#include <Eigen/Dense>
using namespace Eigen;
Matrix3d k = Matrix3d::Random();
cout << "Here is the matrix k:" << endl << k << endl;
cout << "Its inverse is:" << endl << k.inverse() << endl;
cout << "The product of the two (supposedly the identity) is:" << endl << k.inverse()*k << endl;
Run Code Online (Sandbox Code Playgroud)
这给了我正确的答案.但是,如果不是随机分配矩阵,如果我创建一个矩阵然后自己分配所有值,它会给我错误的反转.例如,以下代码将给出错误的反转.
Matrix3d m;
Matrix3d mi;
for (int i = 0; i < 3; ++ i)
for (int j = 0; j < 3; ++ j)
m (i, j) = i + 3.0*j;
std::cout << "m is " << m << std::endl;
mi = m.inverse();
std::cout << "mi is " << mi << std::endl;
std::cout << "product of m and m_inverse is " << (mi*m) << std::endl;
Run Code Online (Sandbox Code Playgroud)
我希望能够反转我自己分配了值的矩阵.谁能告诉我这里发生了什么?为什么Eigen会这样做?
Mik*_*son 11
你的矩阵是这样的:
0 3 6
1 4 7
2 5 8
Run Code Online (Sandbox Code Playgroud)
如果从row2和row3中减去row1,则得到:
0 3 6
1 1 1
2 2 2
Run Code Online (Sandbox Code Playgroud)
然后,从row3中减去2*row2,得到:
0 3 6
1 1 1
0 0 0
Run Code Online (Sandbox Code Playgroud)
这意味着矩阵是奇异的!这意味着矩阵不能倒置!
你选择矩阵的方式非常不幸.