diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-07-02 23:04:46 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-07-02 23:04:46 +0200 |
commit | 998455a5707e1312d3058672d6d337a20158d86e (patch) | |
tree | 6d69322ac18ed90460599050dab87aa3e8a5d80e /test/cholesky.cpp | |
parent | 0a8e4712d1f3cfe8830783f59c6c9987ea34701c (diff) |
LDLT is not rank-revealing, so we should not attempt to use the biggest diagonal elements as thresholds.
Diffstat (limited to 'test/cholesky.cpp')
-rw-r--r-- | test/cholesky.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/test/cholesky.cpp b/test/cholesky.cpp index 569318f83..9aa7da7bb 100644 --- a/test/cholesky.cpp +++ b/test/cholesky.cpp @@ -68,6 +68,7 @@ template<typename MatrixType> void cholesky(const MatrixType& m) Index cols = m.cols(); typedef typename MatrixType::Scalar Scalar; + typedef typename NumTraits<Scalar>::Real RealScalar; typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType; typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType; @@ -207,6 +208,25 @@ template<typename MatrixType> void cholesky(const MatrixType& m) vecX = ldltlo.solve(vecB); VERIFY_IS_APPROX(A * vecX, vecB); } + + // check matrices with wide spectrum + if(rows>=3) + { + RealScalar s = (std::min)(16,std::numeric_limits<RealScalar>::max_exponent10/8); + Matrix<Scalar,Dynamic,Dynamic> a = Matrix<Scalar,Dynamic,Dynamic>::Random(rows,rows); + Matrix<RealScalar,Dynamic,1> d = Matrix<RealScalar,Dynamic,1>::Random(rows); + for(int k=0; k<rows; ++k) + d(k) = d(k)*std::pow(RealScalar(10),internal::random<RealScalar>(-s,s)); + SquareMatrixType A = a * d.asDiagonal() * a.adjoint(); + // Make sure a solution exists: + vecX.setRandom(); + vecB = A * vecX; + vecX.setZero(); + ldltlo.compute(A); + VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix()); + vecX = ldltlo.solve(vecB); + VERIFY_IS_APPROX(A * vecX, vecB); + } } // update/downdate |