Я использую библиотеку C ++ Eigen 3 в своей программе.В частности, мне нужно умножить две собственные разреженные матрицы и сохранить результат в другую собственную разреженную матрицу.Тем не менее, я заметил, что если некоторые записи в собственной разреженной матрице меньше 1e-13, соответствующая запись в результате будет 0 вместо небольшого числа.Скажем, я умножаю разреженную единичную матрицу a и другую разреженную матрицу b.Если максимальная запись b, то есть b (0,0) меньше, чем 1e-13, например 9e-14, верхняя запись результата c = a * b, то есть c (0,0),0 вместо 9e-14.
Вот код, который я тестирую,
#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
01
a2
1 0
0 1
b2
9e-14 0
0 1
c2
9e-14 0
0 1
Вы можете видеть, что умножение плотных матриц хорошо, но результат разреженных матрицнеправильно в верхней левой записи, и b имеет странный выходной формат.
Я отладил исходный код Eigen, но не смог найти, где два числа умножены в матрице.Есть идеи?