mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 08:39:37 +08:00
bug #1238: fix SparseMatrix::sum() overload for un-compressed mode.
This commit is contained in:
parent
c4bd3b1f21
commit
2c1b56f4c1
@ -30,7 +30,10 @@ typename internal::traits<SparseMatrix<_Scalar,_Options,_Index> >::Scalar
|
|||||||
SparseMatrix<_Scalar,_Options,_Index>::sum() const
|
SparseMatrix<_Scalar,_Options,_Index>::sum() const
|
||||||
{
|
{
|
||||||
eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
|
eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
|
||||||
return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
|
if(this->isCompressed())
|
||||||
|
return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
|
||||||
|
else
|
||||||
|
return Base::sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename _Scalar, int _Options, typename _Index>
|
template<typename _Scalar, int _Options, typename _Index>
|
||||||
|
@ -157,18 +157,15 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
initSparse<Scalar>(density, refM3, m3);
|
initSparse<Scalar>(density, refM3, m3);
|
||||||
initSparse<Scalar>(density, refM4, m4);
|
initSparse<Scalar>(density, refM4, m4);
|
||||||
|
|
||||||
|
if(internal::random<bool>())
|
||||||
|
m1.makeCompressed();
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1*s1, refM1*s1);
|
VERIFY_IS_APPROX(m1*s1, refM1*s1);
|
||||||
VERIFY_IS_APPROX(m1+m2, refM1+refM2);
|
VERIFY_IS_APPROX(m1+m2, refM1+refM2);
|
||||||
VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3);
|
VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3);
|
||||||
VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2));
|
VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2));
|
||||||
VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2);
|
VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2);
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1*=s1, refM1*=s1);
|
|
||||||
VERIFY_IS_APPROX(m1/=s1, refM1/=s1);
|
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1+=m2, refM1+=refM2);
|
|
||||||
VERIFY_IS_APPROX(m1-=m2, refM1-=refM2);
|
|
||||||
|
|
||||||
if(SparseMatrixType::IsRowMajor)
|
if(SparseMatrixType::IsRowMajor)
|
||||||
VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0)));
|
VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0)));
|
||||||
else
|
else
|
||||||
@ -197,6 +194,14 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
VERIFY_IS_APPROX(refM4 - m3, refM4 - refM3);
|
VERIFY_IS_APPROX(refM4 - m3, refM4 - refM3);
|
||||||
VERIFY_IS_APPROX(m3 - refM4, refM3 - refM4);
|
VERIFY_IS_APPROX(m3 - refM4, refM3 - refM4);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1.sum(), refM1.sum());
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1*=s1, refM1*=s1);
|
||||||
|
VERIFY_IS_APPROX(m1/=s1, refM1/=s1);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1+=m2, refM1+=refM2);
|
||||||
|
VERIFY_IS_APPROX(m1-=m2, refM1-=refM2);
|
||||||
|
|
||||||
// test aliasing
|
// test aliasing
|
||||||
VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1));
|
VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1));
|
||||||
VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval()));
|
VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval()));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user