我在我的程序中使用了C++的Eigen 3库。特别是,我需要将两个Eigen稀疏矩阵相乘,并将结果存储到另一个Eigen稀疏矩阵中。然而,我注意到如果Eigen稀疏矩阵的某些条目小于1e-13,则结果中对应的条目将为0而不是一个小数。假设我将一个稀疏单位矩阵a与另一个稀疏矩阵b相乘。如果b的左上角条目,即b(0,0),小于1e-13,例如9e-14,则结果c=a*b的左上角条目,即c(0,0),将为0而不是9e-14。
以下是我测试的代码:
这里是奇怪的输出结果:
a
1 0
0 1
b
非零元素:
(9e-14,0) (1,1)
列指针:
0 1 $
9e-14 0
0 1
c
0 0
0 1
a2
1 0
0 1
b2
9e-14 0
0 1
c2
9e-14 0
0 1
你可以看到,密集矩阵的乘法结果没问题,但稀疏矩阵的结果在左上角的条目中出现错误,并且 b 的输出格式很奇怪。
我调试了 Eigen 的源代码,但找不到两个数字在矩阵中相乘的位置。有什么想法吗?
以下是我测试的代码:
#include <iostream>
#include <math.h>
#include <Eigen/Sparse>
#include <Eigen/Dense>
#include <Eigen/Eigen>
#include <Eigen/Dense>
#include <Eigen/LU>
using namespace std;
using namespace Eigen;
int main() {
DynamicSparseMatrix<double, RowMajor> a(2,2);
DynamicSparseMatrix<double, ColMajor> b(2,2);
DynamicSparseMatrix<double, RowMajor> c(2,2);
a.coeffRef(0,0) = 1;
a.coeffRef(1,1) = 1;
b.coeffRef(0,0) = 9e-14;
b.coeffRef(1,1) = 1;
cout << "a" << endl;
cout << a << endl;
cout << "b" << endl;
cout << b << endl;
c = a * b;
cout << "c" << endl;
cout << c << endl;
Matrix<double, Dynamic, Dynamic> a2(2,2);
Matrix<double, Dynamic, Dynamic> b2(2,2);
Matrix<double, Dynamic, Dynamic> c2(2,2);
a2(0,0) = 1;
a2(1,1) = 1;
b2(0,0) = 9e-14;
b2(1,1) = 1;
cout << "a2" << endl;
cout << a2 << endl;
cout << "b2" << endl;
cout << b2 << endl;
c2 = a2 * b2;
cout << "c2" << endl;
cout << c2 << endl;
return 1;
}
这里是奇怪的输出结果:
a
1 0
0 1
b
非零元素:
(9e-14,0) (1,1)
列指针:
0 1 $
9e-14 0
0 1
c
0 0
0 1
a2
1 0
0 1
b2
9e-14 0
0 1
c2
9e-14 0
0 1
你可以看到,密集矩阵的乘法结果没问题,但稀疏矩阵的结果在左上角的条目中出现错误,并且 b 的输出格式很奇怪。
我调试了 Eigen 的源代码,但找不到两个数字在矩阵中相乘的位置。有什么想法吗?