Use structured diagonal product in SparseInverse libeigen/eigen!2488 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
diff --git a/unsupported/Eigen/src/SparseExtra/SparseInverse.h b/unsupported/Eigen/src/SparseExtra/SparseInverse.h index b9e1c55..31561e7 100644 --- a/unsupported/Eigen/src/SparseExtra/SparseInverse.h +++ b/unsupported/Eigen/src/SparseExtra/SparseInverse.h
@@ -171,7 +171,7 @@ { RowMatrixType DU = slu.matrixU().toSparse(); invD = DU.diagonal().cwiseInverse(); - Upper = (invD.asDiagonal() * DU).template triangularView<StrictlyUpper>(); + Upper = invD.asDiagonal() * DU.template triangularView<StrictlyUpper>(); } MatrixType Lower = slu.matrixL().toSparse().template triangularView<StrictlyLower>();
diff --git a/unsupported/test/sparse_extra.cpp b/unsupported/test/sparse_extra.cpp index 4bf5452..18f1881 100644 --- a/unsupported/test/sparse_extra.cpp +++ b/unsupported/test/sparse_extra.cpp
@@ -173,6 +173,7 @@ template <typename Scalar> void check_sparse_inverse() { typedef SparseMatrix<Scalar> MatrixType; + typedef SparseMatrix<Scalar, RowMajor> RowMatrixType; Matrix<Scalar, -1, -1> A; A.resize(1000, 1000); @@ -210,6 +211,12 @@ } VERIFY_IS_APPROX_OR_LESS_THAN(sumdiff, 1e-10); + + RowMatrixType DU = slu.matrixU().toSparse(); + Matrix<Scalar, Dynamic, 1> invD = DU.diagonal().cwiseInverse(); + RowMatrixType scaled_before_view = (invD.asDiagonal() * DU).template triangularView<StrictlyUpper>(); + RowMatrixType view_before_scaled = invD.asDiagonal() * DU.template triangularView<StrictlyUpper>(); + VERIFY_IS_APPROX(scaled_before_view, view_before_scaled); } EIGEN_DECLARE_TEST(sparse_extra) {