Fix bugs reported by Timothy Hunter:

* CholeskyWithoutSqrt with 1x1 matrices
 * .part<Diagonal>()
Updated unit tests to handle these cases
This commit is contained in:
Gael Guennebaud 2008-09-03 20:52:26 +00:00
parent e14aa8c8aa
commit c29c7b0ea9
4 changed files with 9 additions and 2 deletions

View File

@ -96,6 +96,12 @@ void CholeskyWithoutSquareRoot<MatrixType>::compute(const MatrixType& a)
m_isPositiveDefinite = true; m_isPositiveDefinite = true;
const RealScalar eps = ei_sqrt(precision<Scalar>()); const RealScalar eps = ei_sqrt(precision<Scalar>());
if (size<=1)
{
m_matrix = a;
return;
}
// Let's preallocate a temporay vector to evaluate the matrix-vector product into it. // Let's preallocate a temporay vector to evaluate the matrix-vector product into it.
// Unlike the standard Cholesky decomposition, here we cannot evaluate it to the destination // Unlike the standard Cholesky decomposition, here we cannot evaluate it to the destination
// matrix because it a sub-row which is not compatible suitable for efficient packet evaluation. // matrix because it a sub-row which is not compatible suitable for efficient packet evaluation.

View File

@ -88,7 +88,7 @@ template<typename MatrixType, unsigned int Mode> class Part
inline Scalar coeff(int row, int col) const inline Scalar coeff(int row, int col) const
{ {
if(Flags & LowerTriangularBit ? col>row : row>col) if( (Flags & LowerTriangularBit) && (col>row) || (Flags & UpperTriangularBit) && (row>col) )
return (Flags & SelfAdjointBit) ? ei_conj(m_matrix.coeff(col, row)) : (Scalar)0; return (Flags & SelfAdjointBit) ? ei_conj(m_matrix.coeff(col, row)) : (Scalar)0;
if(Flags & UnitDiagBit) if(Flags & UnitDiagBit)
return col==row ? (Scalar)1 : m_matrix.coeff(row, col); return col==row ? (Scalar)1 : m_matrix.coeff(row, col);

View File

@ -79,7 +79,6 @@ template<typename MatrixType> void cholesky(const MatrixType& m)
} }
#endif #endif
if (rows>1)
{ {
CholeskyWithoutSquareRoot<SquareMatrixType> cholnosqrt(symm); CholeskyWithoutSquareRoot<SquareMatrixType> cholnosqrt(symm);
VERIFY(cholnosqrt.isPositiveDefinite()); VERIFY(cholnosqrt.isPositiveDefinite());

View File

@ -81,6 +81,8 @@ template<typename MatrixType> void triangular(const MatrixType& m)
m1.template part<Eigen::Lower>() = (m2.transpose() * m2).lazy(); m1.template part<Eigen::Lower>() = (m2.transpose() * m2).lazy();
VERIFY_IS_APPROX(m3.template part<Eigen::Lower>(), m1); VERIFY_IS_APPROX(m3.template part<Eigen::Lower>(), m1);
VERIFY_IS_APPROX(m3.template part<Diagonal>(), m3.diagonal().asDiagonal());
m1 = MatrixType::Random(rows, cols); m1 = MatrixType::Random(rows, cols);
for (int i=0; i<rows; ++i) for (int i=0; i<rows; ++i)
while (ei_abs2(m1(i,i))<1e-3) m1(i,i) = ei_random<Scalar>(); while (ei_abs2(m1(i,i))<1e-3) m1(i,i) = ei_random<Scalar>();