Мне нужно получить матрицы 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, результат будет в порядке.