C++ 为什么我在使用特征值3求逆矩阵时会得到错误的答案
我用eigen3求矩阵的逆,但逆是错的。 我试过几个例子,但下面的例子是错误的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
#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