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.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
mat1*mat2 不应该是单位矩阵吗?
解决方案
尝试改用伪逆。正如@paddy 所说,这个问题可能是一个精度问题。
从这里得到代码
#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
推荐阅读
- microsoft-teams - 如何在 ms 团队中为我的应用程序的清单添加隐私政策
- kotlin - Swagger 与 Spring webflux 依赖构建问题
- android - 导航抽屉获取新布局
- c# - 如何动态获取模型中特定键的值?
- c - 这是 C18 基本开关盒吗?
- angular - Angular如何处理多个HTTP调用
- python - 如何在python中增加或减少数字时设置限制?
- api - 放心是自动化 3000 多个 Rest Api 测试用例的好工具吗?
- c# - 如何等待任务完全完成?
- openapi - Atlassian Swagger 请求验证器 - Spring MVC 问题