bug #1669: fix PartialPivLU/inverse with zero-sized matrices.

This commit is contained in:
Gael Guennebaud 2019-01-29 10:27:13 +01:00
parent a2a07e62b9
commit 8a06c699d0
2 changed files with 21 additions and 1 deletions

View File

@ -511,7 +511,10 @@ void PartialPivLU<MatrixType>::compute()
// the row permutation is stored as int indices, so just to be sure: // the row permutation is stored as int indices, so just to be sure:
eigen_assert(m_lu.rows()<NumTraits<int>::highest()); eigen_assert(m_lu.rows()<NumTraits<int>::highest());
m_l1_norm = m_lu.cwiseAbs().colwise().sum().maxCoeff(); if(m_lu.cols()>0)
m_l1_norm = m_lu.cwiseAbs().colwise().sum().maxCoeff();
else
m_l1_norm = RealScalar(0);
eigen_assert(m_lu.rows() == m_lu.cols() && "PartialPivLU is only for square (and moreover invertible) matrices"); eigen_assert(m_lu.rows() == m_lu.cols() && "PartialPivLU is only for square (and moreover invertible) matrices");
const Index size = m_lu.rows(); const Index size = m_lu.rows();

View File

@ -105,6 +105,22 @@ template<typename MatrixType> void inverse(const MatrixType& m)
} }
} }
template<typename Scalar>
void inverse_zerosized()
{
Matrix<Scalar,Dynamic,Dynamic> A(0,0);
{
Matrix<Scalar,0,1> b, x;
x = A.inverse() * b;
}
{
Matrix<Scalar,Dynamic,Dynamic> b(0,1), x;
x = A.inverse() * b;
VERIFY_IS_EQUAL(x.rows(), 0);
VERIFY_IS_EQUAL(x.cols(), 1);
}
}
EIGEN_DECLARE_TEST(inverse) EIGEN_DECLARE_TEST(inverse)
{ {
int s = 0; int s = 0;
@ -118,6 +134,7 @@ EIGEN_DECLARE_TEST(inverse)
s = internal::random<int>(50,320); s = internal::random<int>(50,320);
CALL_SUBTEST_5( inverse(MatrixXf(s,s)) ); CALL_SUBTEST_5( inverse(MatrixXf(s,s)) );
TEST_SET_BUT_UNUSED_VARIABLE(s) TEST_SET_BUT_UNUSED_VARIABLE(s)
CALL_SUBTEST_5( inverse_zerosized<float>() );
s = internal::random<int>(25,100); s = internal::random<int>(25,100);
CALL_SUBTEST_6( inverse(MatrixXcd(s,s)) ); CALL_SUBTEST_6( inverse(MatrixXcd(s,s)) );