diff options
author | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2011-09-11 06:30:53 +0100 |
---|---|---|
committer | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2011-09-11 06:30:53 +0100 |
commit | 6b006772f1c8083df609d70218f5848bce7dfc28 (patch) | |
tree | 0e2db2d2d77187ee7567cd2664d8611f9f27f927 /test/cholesky.cpp | |
parent | 59b83c14fd2bec0b8c8afa7a2fa0357af7f0f827 (diff) |
Fix LDLT::solve() if matrix singular but solution exists (bug #241).
Clarify this in docs and add regression test.
Diffstat (limited to 'test/cholesky.cpp')
-rw-r--r-- | test/cholesky.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/test/cholesky.cpp b/test/cholesky.cpp index b2139563b..35f5a3b68 100644 --- a/test/cholesky.cpp +++ b/test/cholesky.cpp @@ -266,6 +266,22 @@ template<typename MatrixType> void cholesky_cplx(const MatrixType& m) } } +// regression test for bug 241 +template<typename MatrixType> void cholesky_bug241(const MatrixType& m) +{ + eigen_assert(m.rows() == 2 && m.cols() == 2); + + typedef typename MatrixType::Scalar Scalar; + typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType; + + MatrixType matA; + matA << 1, 1, 1, 1; + VectorType vecB; + vecB << 1, 1; + VectorType vecX = matA.ldlt().solve(vecB); + VERIFY_IS_APPROX(matA * vecX, vecB); +} + template<typename MatrixType> void cholesky_verify_assert() { MatrixType tmp; @@ -292,6 +308,7 @@ void test_cholesky() for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( cholesky(Matrix<double,1,1>()) ); CALL_SUBTEST_3( cholesky(Matrix2d()) ); + CALL_SUBTEST_3( cholesky_bug241(Matrix2d()) ); CALL_SUBTEST_4( cholesky(Matrix3f()) ); CALL_SUBTEST_5( cholesky(Matrix4d()) ); s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE); |