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) {