mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-31 17:22:07 +08:00
bug #632: add support for "dense +/- sparse" operations. The current implementation is based on SparseView to make the dense subexpression compatible with the sparse one.
This commit is contained in:
parent
d4a9e61569
commit
15084cf1ac
@ -60,6 +60,8 @@ namespace internal {
|
|||||||
|
|
||||||
|
|
||||||
// Generic "sparse OP sparse"
|
// Generic "sparse OP sparse"
|
||||||
|
template<typename XprType> struct binary_sparse_evaluator;
|
||||||
|
|
||||||
template<typename BinaryOp, typename Lhs, typename Rhs>
|
template<typename BinaryOp, typename Lhs, typename Rhs>
|
||||||
struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IteratorBased, IteratorBased>
|
struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IteratorBased, IteratorBased>
|
||||||
: evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
|
: evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
|
||||||
@ -428,6 +430,34 @@ SparseMatrixBase<Derived>::cwiseProduct(const MatrixBase<OtherDerived> &other) c
|
|||||||
return typename CwiseProductDenseReturnType<OtherDerived>::Type(derived(), other.derived());
|
return typename CwiseProductDenseReturnType<OtherDerived>::Type(derived(), other.derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename SparseDerived, typename DenseDerived>
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_sum_op<typename DenseDerived::Scalar>, const SparseDerived, const SparseView<DenseDerived,true> >
|
||||||
|
operator+(const SparseMatrixBase<SparseDerived> &a, const MatrixBase<DenseDerived> &b)
|
||||||
|
{
|
||||||
|
return a.derived() + SparseView<DenseDerived,true>(b.derived());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename DenseDerived, typename SparseDerived>
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_sum_op<typename DenseDerived::Scalar>, const SparseView<DenseDerived,true>, const SparseDerived>
|
||||||
|
operator+(const MatrixBase<DenseDerived> &a, const SparseMatrixBase<SparseDerived> &b)
|
||||||
|
{
|
||||||
|
return SparseView<DenseDerived,true>(a.derived()) + b.derived();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename SparseDerived, typename DenseDerived>
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_difference_op<typename DenseDerived::Scalar>, const SparseDerived, const SparseView<DenseDerived,true> >
|
||||||
|
operator-(const SparseMatrixBase<SparseDerived> &a, const MatrixBase<DenseDerived> &b)
|
||||||
|
{
|
||||||
|
return a.derived() - SparseView<DenseDerived,true>(b.derived());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename DenseDerived, typename SparseDerived>
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_difference_op<typename DenseDerived::Scalar>, const SparseView<DenseDerived,true>, const SparseDerived>
|
||||||
|
operator-(const MatrixBase<DenseDerived> &a, const SparseMatrixBase<SparseDerived> &b)
|
||||||
|
{
|
||||||
|
return SparseView<DenseDerived,true>(a.derived()) - b.derived();
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_SPARSE_CWISE_BINARY_OP_H
|
#endif // EIGEN_SPARSE_CWISE_BINARY_OP_H
|
||||||
|
@ -192,6 +192,11 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
VERIFY_IS_APPROX(refM4.cwiseProduct(m3), refM4.cwiseProduct(refM3));
|
VERIFY_IS_APPROX(refM4.cwiseProduct(m3), refM4.cwiseProduct(refM3));
|
||||||
// VERIFY_IS_APPROX(m3.cwise()/refM4, refM3.cwise()/refM4);
|
// VERIFY_IS_APPROX(m3.cwise()/refM4, refM3.cwise()/refM4);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(refM4 + m3, refM4 + refM3);
|
||||||
|
VERIFY_IS_APPROX(m3 + refM4, refM3 + refM4);
|
||||||
|
VERIFY_IS_APPROX(refM4 - m3, refM4 - refM3);
|
||||||
|
VERIFY_IS_APPROX(m3 - refM4, refM3 - refM4);
|
||||||
|
|
||||||
// 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