diff --git a/Eigen/src/Sparse/TriangularSolver.h b/Eigen/src/Sparse/TriangularSolver.h index 8948ae45e..390d0174b 100644 --- a/Eigen/src/Sparse/TriangularSolver.h +++ b/Eigen/src/Sparse/TriangularSolver.h @@ -43,8 +43,11 @@ struct ei_solve_triangular_selector { lastVal = it.value(); lastIndex = it.index(); + if(lastIndex == i) + break; tmp -= lastVal * other.coeff(lastIndex,col); } + if (Lhs::Flags & UnitDiagBit) other.coeffRef(i,col) = tmp; else diff --git a/test/sparse_solvers.cpp b/test/sparse_solvers.cpp index 8ce4e2264..3d7f5b91e 100644 --- a/test/sparse_solvers.cpp +++ b/test/sparse_solvers.cpp @@ -68,12 +68,20 @@ template void sparse_solvers(int rows, int cols) VERIFY_IS_APPROX(refMat2.template marked().solveTriangular(vec2), m2.template marked().solveTriangular(vec3)); + // lower - transpose + initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords); + VERIFY_IS_APPROX(refMat2.template marked().transpose().solveTriangular(vec2), + m2.template marked().transpose().solveTriangular(vec3)); + // upper initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords); VERIFY_IS_APPROX(refMat2.template marked().solveTriangular(vec2), m2.template marked().solveTriangular(vec3)); - // TODO test row major + // upper - transpose + initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords); + VERIFY_IS_APPROX(refMat2.template marked().transpose().solveTriangular(vec2), + m2.template marked().transpose().solveTriangular(vec3)); } // test LLT