特征库的矩阵逆函数返回NaN
Matrix inverse function of Eigen library returns NaN
这是一个新创建的具有相同问题的示例。两个矩阵"firstMultiplyMat"answers"a"具有相同的值,但以不同的方式指定。然而,每一个的倒数都是不同的。无法获取"firstMultiplyMat"的逆矩阵,而"a"具有正确计算的逆矩阵。
#include<iostream>
#include<stdio.h>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
using Eigen::MatrixXd;
struct MemberLocation{
int id;
double x;
double y;
};
int main(){
//Attributes
int M = 2 ;//anchor
int N = 2 ;//nonanchor
int NA = 4;
int p = 0;
int numOfIterations =2;
MemberLocation *member1 = new MemberLocation[M];
MemberLocation *member2 = new MemberLocation[N];
MatrixXd neighbourdistanceEst(M,N);
MatrixXd neighbourdistanceDeriv(M,NA);
MatrixXd distanceDerivTranspose(NA,M);
MatrixXd firstMultiplyMat(NA,NA);
MatrixXd firstMultiplyMatInverse(NA,NA);
//Structs initilaization
member1[0].id = 5;
member1[0].x = 9.31301;
member1[0].y = 19.3955;
member1[1].id = 2;
member1[1].x = 46.6279;
member1[1].y = 0.00571905;
member2[0].id = 4;
member2[0].x = 11.7718;
member2[0].y = 7.99507;
member2[1].id = 6;
member2[1].x = 23.6158;
member2[1].y = 3.80408;
// Filling "neighbourdistanceDeriv" matrix
for (int i = 1 ; i < numOfIterations ; i++ ){
for (int j = 0 ; j < M ; j++){
for (int k = 0 ; k < N ; k++){
int id1 = member2[k].id;
int id2 = member1[j].id;
double xDiff = member2[k].x - member1[j].x;
double yDiff = member2[k].y - member1[j].y;
double distance = pow(xDiff,2) + pow(yDiff,2);
neighbourdistanceEst(j,k) = sqrt(distance);
neighbourdistanceDeriv(j,p) = xDiff / neighbourdistanceEst(j,k);
neighbourdistanceDeriv(j,p+1) = yDiff / neighbourdistanceEst(j,k);
p+=2;
}
p = 0;
}
}
// operations on "neighbourdistanceDeriv" matrix
distanceDerivTranspose = neighbourdistanceDeriv.transpose();
firstMultiplyMat = distanceDerivTranspose*neighbourdistanceDeriv;
firstMultiplyMatInverse = firstMultiplyMat.inverse();
// printing "firstMultiplyMat" matrix and its inverse
std::cout << "firstMultiplyMat:n" << firstMultiplyMat << std::endl;
std::cout << "inverse of firstMultiplyMat:n" << firstMultiplyMatInverse << std::endl<< std::endl;
// fixed array with same values obtained in "neighbourdistanceDeriv" matrix at runtime
MatrixXd a(4,4);
MatrixXd b(4,4);
a(0,0) = 0.994532;
a(0,1) = -0.423853;
a(0,2)= 1.10423 ;
a(0,3) = -0.314096;
a(1,0) = -0.423853 ;
a(1,1) = 1.00547 ;
a(1,2) = -0.881237 ;
a(1,3) = 0.756726 ;
a(2,0) = 1.10423 ;
a(2,1) = -0.881237;
a(2,2) = 1.43045;
a(2,3) = -0.658827;
a(3,0) = -0.314096;
a(3,1) = 0.756726 ;
a(3,2) = -0.658827;
a(3,3) = 0.569549 ;
b = a.inverse();
std::cout << "matrix a :n" << a <<std::endl;
std::cout << "inverse of matrix a :n" << b << std::endl;
//std::cout<<"hi n";
return 0;
}
输出:
firstMultiplyMat:
0.994534 -0.423857 1.10423 -0.314099
-0.423857 1.00547 -0.881237 0.756725
1.10423 -0.881237 1.43045 -0.658827
-0.314099 0.756725 -0.658827 0.569548
inverse of firstMultiplyMat:
-nan -nan -nan -nan
-nan -nan -nan -nan
-nan -nan -nan -nan
-nan -inf -inf inf
matrix a :
0.994532 -0.423853 1.10423 -0.314096
-0.423853 1.00547 -0.881237 0.756726
1.10423 -0.881237 1.43045 -0.658827
-0.314096 0.756726 -0.658827 0.569549
inverse of matrix a :
-119414 -1681.81 132361 89489.1
-1681.81 942762 10176.4 -1.24175e+06
132361 10176.4 -146638 -110149
89489.1 -1.24175e+06 -110149 1.57177e+06
矩阵firstMultiplyMat本身在内存方面很好;如果你把你放入的值推到里面,它就会正确地反转。您的问题在于firstMultiplyMat中的值,这些值与打印的值不完全相同,因为打印的内容被截断。
从本质上讲,你的矩阵可能不是可逆的。你可以通过不计算倒数,而是使用QR求解器来解决这个问题,例如:
HouseholderQR<MatrixXd> qr(A);
x = qr.solve(b); // computes A^-1 * b
有关HouseholderQR的更多信息,请点击此处
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量