aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-12-14 10:25:21 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-12-14 10:25:21 +0100
commit7a9988ebb6e87da84134901c568c00a5cb561809 (patch)
tree29958cf762066b360bbf04937437122abee1a423
parent9facdaf7b9fa65d7f669af0bfabd34e23698f446 (diff)
fix spasre triangular solve for row major lower matrices
-rw-r--r--Eigen/src/Sparse/TriangularSolver.h2
-rw-r--r--test/sparse_solvers.cpp10
2 files changed, 11 insertions, 1 deletions
diff --git a/Eigen/src/Sparse/TriangularSolver.h b/Eigen/src/Sparse/TriangularSolver.h
index 2c5b485b0..d24756ba1 100644
--- a/Eigen/src/Sparse/TriangularSolver.h
+++ b/Eigen/src/Sparse/TriangularSolver.h
@@ -52,6 +52,8 @@ struct ei_sparse_solve_triangular_selector<Lhs,Rhs,Mode,LowerTriangular,RowMajor
{
lastVal = it.value();
lastIndex = it.index();
+ if(lastIndex==i)
+ break;
tmp -= lastVal * other.coeff(lastIndex,col);
}
if (Mode & UnitDiagBit)
diff --git a/test/sparse_solvers.cpp b/test/sparse_solvers.cpp
index 24107977c..b88fa1cc9 100644
--- a/test/sparse_solvers.cpp
+++ b/test/sparse_solvers.cpp
@@ -73,7 +73,15 @@ template<typename Scalar> void sparse_solvers(int rows, int cols)
VERIFY_IS_APPROX(refMat2.template triangularView<UpperTriangular>().solve(vec2),
m2.template triangularView<UpperTriangular>().solve(vec3));
- // TODO test row major
+ // lower - transpose
+ initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);
+ VERIFY_IS_APPROX(refMat2.template marked<LowerTriangular>().transpose().solveTriangular(vec2),
+ m2.template marked<LowerTriangular>().transpose().solveTriangular(vec3));
+
+ // upper - transpose
+ initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);
+ VERIFY_IS_APPROX(refMat2.template marked<UpperTriangular>().transpose().solveTriangular(vec2),
+ m2.template marked<UpperTriangular>().transpose().solveTriangular(vec3));
SparseMatrix<Scalar> matB(rows, rows);
DenseMatrix refMatB = DenseMatrix::Zero(rows, rows);