mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-14 04:35:57 +08:00
bug #1669: fix PartialPivLU/inverse with zero-sized matrices.
This commit is contained in:
parent
a2a07e62b9
commit
8a06c699d0
@ -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();
|
||||||
|
@ -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)) );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user