mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
bug #1358: fix compilation for sparse += sparse.selfadjointView();
This commit is contained in:
parent
e67397bfa7
commit
11b492e993
@ -621,6 +621,22 @@ protected:
|
|||||||
* Implementation of SparseMatrixBase and SparseCwise functions/operators
|
* Implementation of SparseMatrixBase and SparseCwise functions/operators
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
template<typename Derived>
|
||||||
|
template<typename OtherDerived>
|
||||||
|
Derived& SparseMatrixBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
|
||||||
|
{
|
||||||
|
call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
return derived();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Derived>
|
||||||
|
template<typename OtherDerived>
|
||||||
|
Derived& SparseMatrixBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
|
||||||
|
{
|
||||||
|
call_assignment(derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
return derived();
|
||||||
|
}
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_STRONG_INLINE Derived &
|
EIGEN_STRONG_INLINE Derived &
|
||||||
|
@ -265,6 +265,11 @@ template<typename Derived> class SparseMatrixBase
|
|||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
Derived& operator-=(const DiagonalBase<OtherDerived>& other);
|
Derived& operator-=(const DiagonalBase<OtherDerived>& other);
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
Derived& operator+=(const EigenBase<OtherDerived> &other);
|
||||||
|
template<typename OtherDerived>
|
||||||
|
Derived& operator-=(const EigenBase<OtherDerived> &other);
|
||||||
|
|
||||||
Derived& operator*=(const Scalar& other);
|
Derived& operator*=(const Scalar& other);
|
||||||
Derived& operator/=(const Scalar& other);
|
Derived& operator/=(const Scalar& other);
|
||||||
|
|
||||||
|
@ -222,14 +222,43 @@ template< typename DstXprType, typename SrcXprType, typename Functor>
|
|||||||
struct Assignment<DstXprType, SrcXprType, Functor, SparseSelfAdjoint2Sparse>
|
struct Assignment<DstXprType, SrcXprType, Functor, SparseSelfAdjoint2Sparse>
|
||||||
{
|
{
|
||||||
typedef typename DstXprType::StorageIndex StorageIndex;
|
typedef typename DstXprType::StorageIndex StorageIndex;
|
||||||
|
typedef internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> AssignOpType;
|
||||||
|
|
||||||
template<typename DestScalar,int StorageOrder>
|
template<typename DestScalar,int StorageOrder>
|
||||||
static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
|
static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const AssignOpType&/*func*/)
|
||||||
{
|
{
|
||||||
internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), dst);
|
internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: the handling of += and -= in sparse matrices should be cleanup so that next two overloads could be reduced to:
|
||||||
|
template<typename DestScalar,int StorageOrder,typename AssignFunc>
|
||||||
|
static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const AssignFunc& func)
|
||||||
|
{
|
||||||
|
SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
|
||||||
|
run(tmp, src, AssignOpType());
|
||||||
|
call_assignment_no_alias_no_transpose(dst, tmp, func);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename DestScalar,int StorageOrder>
|
||||||
|
static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src,
|
||||||
|
const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>& /* func */)
|
||||||
|
{
|
||||||
|
SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
|
||||||
|
run(tmp, src, AssignOpType());
|
||||||
|
dst += tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename DestScalar,int StorageOrder>
|
||||||
|
static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src,
|
||||||
|
const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>& /* func */)
|
||||||
|
{
|
||||||
|
SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
|
||||||
|
run(tmp, src, AssignOpType());
|
||||||
|
dst -= tmp;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename DestScalar>
|
template<typename DestScalar>
|
||||||
static void run(DynamicSparseMatrix<DestScalar,ColMajor,StorageIndex>& dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
|
static void run(DynamicSparseMatrix<DestScalar,ColMajor,StorageIndex>& dst, const SrcXprType &src, const AssignOpType&/*func*/)
|
||||||
{
|
{
|
||||||
// TODO directly evaluate into dst;
|
// TODO directly evaluate into dst;
|
||||||
SparseMatrix<DestScalar,ColMajor,StorageIndex> tmp(dst.rows(),dst.cols());
|
SparseMatrix<DestScalar,ColMajor,StorageIndex> tmp(dst.rows(),dst.cols());
|
||||||
|
@ -431,6 +431,14 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
m3 = m2.template selfadjointView<Lower>();
|
m3 = m2.template selfadjointView<Lower>();
|
||||||
VERIFY_IS_APPROX(m3, refMat3);
|
VERIFY_IS_APPROX(m3, refMat3);
|
||||||
|
|
||||||
|
refMat3 += refMat2.template selfadjointView<Lower>();
|
||||||
|
m3 += m2.template selfadjointView<Lower>();
|
||||||
|
VERIFY_IS_APPROX(m3, refMat3);
|
||||||
|
|
||||||
|
refMat3 -= refMat2.template selfadjointView<Lower>();
|
||||||
|
m3 -= m2.template selfadjointView<Lower>();
|
||||||
|
VERIFY_IS_APPROX(m3, refMat3);
|
||||||
|
|
||||||
// selfadjointView only works for square matrices:
|
// selfadjointView only works for square matrices:
|
||||||
SparseMatrixType m4(rows, rows+1);
|
SparseMatrixType m4(rows, rows+1);
|
||||||
VERIFY_RAISES_ASSERT(m4.template selfadjointView<Lower>());
|
VERIFY_RAISES_ASSERT(m4.template selfadjointView<Lower>());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user