C++ 为什么我在使用特征值3求逆矩阵时会得到错误的答案

C++ 为什么我在使用特征值3求逆矩阵时会得到错误的答案,c++,eigen3,C++,Eigen3,我用eigen3求矩阵的逆,但逆是错的。 我试过几个例子,但下面的例子是错误的 #include <iostream> #include <Eigen/Dense> using namespace Eigen; using namespace std; int main(){ Matrix3d Mat1; Mat1 << 99.999999999999972 ,-29024.672261149386 ,29024.848775176863,-29024

我用eigen3求矩阵的逆,但逆是错的。 我试过几个例子,但下面的例子是错误的

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main(){
    Matrix3d Mat1;
Mat1 << 99.999999999999972 ,-29024.672261149386 ,29024.848775176863,-29024.672261149386, 8629880.2300641891 ,-8629930.2299046051,29024.848775176863,-8629930.2299046051 , 8629980.2300641891 ;
cout << "Mat1=\n" << Mat1 << endl;
   Matrix3d Mat2=Mat1.inverse();
cout << "Mat1逆矩阵:\n" << Mat2 << endl;
cout << "Mat1*Mat2:\n" << Mat1*Mat2 << endl;
cout << "Mat2*Mat1:\n" << Mat2*Mat1 << endl;
cout << "Mat1行列式:\n" << Mat1.determinant() << endl;

the result is:
Mat1=
         100     -29024.7      29024.8
    -29024.7  8.62988e+06 -8.62993e+06
     29024.8 -8.62993e+06  8.62998e+06
Mat1逆矩阵:
    44.3313    -12557.7    -12557.8
   -12557.7 3.58199e+06 3.58201e+06
   -12557.8 3.58201e+06 3.58204e+06
Mat1*Mat2:
           1 -0.000198364  0.000823975
    -80.0958     0.785156    -0.242188
     80.0963   -0.0634151     0.972687
Mat2*Mat1:
           1     -80.0958      80.0963
-0.000198364     0.785156      -0.0625
 0.000818345    -0.243301     0.972687
Mat1行列式:
5.73875
#包括
#包括
使用名称空间特征;
使用名称空间std;
int main(){
Matrix3d-Mat1;

Mat1试着用伪逆来代替。这个问题可能是精度问题,正如@paddy所说

我从你那里得到了密码


也许你的矩阵是不可逆的,或者你遇到了精度问题。行列式并不是一个很好的指标,表明矩阵的条件有多好。最后两行(或列)Mat1的
几乎是相反的,这是条件较差的标志。行列式不是0,所以它应该是可逆的。当我使用伪逆代替@ignacio所说的,我得到了一个完全不同的答案。新矩阵mul原始矩阵得到了一个单位矩阵。哪个结果是正确的?精度有什么问题确切的意思是?你能解释一下吗@paddy@donglou浮点不能只表示任何值。当你把大的值乘以非常小的值时,你会得到一个不稳定的结果,这与严格的数学结果截然不同。直接标准化的求逆方法对于发生这些运算的矩阵是不精确的t本身是不精确的,因为,比方说,我们从第一行取一个值,乘以下一行的2x2矩阵的行列式,然后你必须除以这个不精确的值,依此类推。@Swift-fridy Pie,我知道了,谢谢。根据定义,使用伪逆得到了正确的结果。这意味着我应该选择它吗?如果矩阵值s随机数,我应该选择哪种方法?伪逆方程是逆的近似值,它也用于最小二乘法。所以你得到的结果是“最接近的”一个是解析逆。@donglou在随机矩阵上使用逆的事实本身是可疑的。可以使用的一个标准可以是行列式的绝对值。如果它低于某个值或非常高,那么分析逆的结果可能比近似的结果精度低。但更好的情况是当martix得到s一些物理或几何意义。例如,如果它是各向同性空间变换的矩阵,它可能被转换成一对缩放矩阵和余弦矩阵,后者由其性质、行列式非零和所有大小为1的列定义。
#include <Eigen/QR>    
Eigen::MatrixXd A = ... // fill in A
Eigen::MatrixXd pinv = A.completeOrthogonalDecomposition().pseudoInverse();
Mat3*Mat1:
       1  3.05176e-05 -3.05176e-05
       0            1   -0.0078125
 2.88524e-05   -0.0137121      1.00454
Mat1*Mat3:
 1.00004   -0.0101929   -0.0101624
-3.05176e-05      1.00781            0
 5.83113e-05   -0.0134087     0.996313