プログラムで C++ Eigen 3 ライブラリを使用しています。特に、2 つの固有疎行列を乗算し、結果を別の固有疎行列に格納する必要があります。しかし、固有疎行列の一部のエントリが 1e-13 より小さい場合、結果の対応するエントリは小さい数値ではなく 0 になることに気付きました。疎単位行列 a と別の疎行列 b を乗算するとします。b の左上のエントリ、つまり b(0,0) が 1e-13 より小さい場合 (9e-14 など)、結果の左上のエントリ c=a*b、つまり c(0,0)、 9e-14 ではなく 0 です。
ここに私がテストするコードがあります、
#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 のソース コードをデバッグしましたが、行列で 2 つの数値が乗算されている場所が見つかりませんでした。何か案が?