Получение matrixL и matrixU из Eigen :: SuperLU? - PullRequest
0 голосов
/ 28 ноября 2018

Мне нужно получить матрицы L и U из Eigen :: SuperLU.Метод matrixU () возвращает UMatrixType.Когда я вызываю этот метод, я получаю следующую ошибку

: невозможно преобразовать из 'Eigen::SparseMatrix<std::complex<double>,0,int>' в 'const Eigen::TriangularView<Eigen::SparseMatrix<std::complex<double>,0,int>,2> &'.

Если я заменю UMatrixType на LUMAtrixType в SuperLUSupport.h, все компилируется, но следующий код не дает ожидаемого результата.

using  SpMatc = Eigen::SparseMatrix<std::complex<double>>;
Eigen::MatrixXcd matDense = Eigen::MatrixXd::Identity(n, n);
matDense(13, 15) = std::complex<double>(5., 3.);
matDense(8, 11) = std::complex<double>(3., 9.);
SpMatc mat = matDense.sparseView();
Eigen::VectorXcd b = Eigen::VectorXcd::Random(n);
mat.makeCompressed();
Eigen::SuperLU<SpMatc> slu;
slu.compute(mat);
Eigen::VectorXcd y = slu.solve(b);  
const auto& matL = slu.matrixL();
const auto& matU = slu.matrixU();
auto permutationMatrixP = Eigen::PermutationMatrix<Eigen::Dynamic>(slu.permutationP());
auto permutationMatrixQ = Eigen::PermutationMatrix<Eigen::Dynamic>(slu.permutationQ());
Eigen::VectorXcd res = permutationMatrixP*b;
matL.triangularView<Eigen::Lower | Eigen::UnitDiag>().solveInPlace(res);
matU.triangularView<Eigen::Upper>().solveInPlace(res);              
Eigen::VectorXcd finalRes = permutationMatrixQ.inverse() * res;         
Eigen::VectorXcd diff = finalRes - y;
Assert::IsTrue(!finalRes.isApprox(y));

Если я заменю Eigen :: SuperLU на Eigen :: SparseLU, результат будет в порядке.

...