diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-08-01 16:23:30 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-08-01 16:23:30 +0200 |
commit | c2ff44cbf3c58045a38120d28316a992c0cc0d57 (patch) | |
tree | 1c34fb784a6ad7ad9a7174ff2629be12b0f8d2e7 /Eigen/src/SparseCore/SparseAssign.h | |
parent | 2a3c3c49a19572b544b22820065c673cfac9bc04 (diff) |
Make assignment from general EigenBase object call evaluator, and support dense X= sparse
Diffstat (limited to 'Eigen/src/SparseCore/SparseAssign.h')
-rw-r--r-- | Eigen/src/SparseCore/SparseAssign.h | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/Eigen/src/SparseCore/SparseAssign.h b/Eigen/src/SparseCore/SparseAssign.h index c2091ee49..0a29cb32f 100644 --- a/Eigen/src/SparseCore/SparseAssign.h +++ b/Eigen/src/SparseCore/SparseAssign.h @@ -172,9 +172,9 @@ struct storage_kind_to_shape<Sparse> { struct Sparse2Sparse {}; struct Sparse2Dense {}; -template<> struct AssignmentKind<SparseShape,SparseShape> { typedef Sparse2Sparse Kind; }; -template<> struct AssignmentKind<SparseShape,SparseTriangularShape> { typedef Sparse2Sparse Kind; }; -template<> struct AssignmentKind<DenseShape,SparseShape> { typedef Sparse2Dense Kind; }; +template<> struct AssignmentKind<SparseShape, SparseShape> { typedef Sparse2Sparse Kind; }; +template<> struct AssignmentKind<SparseShape, SparseTriangularShape> { typedef Sparse2Sparse Kind; }; +template<> struct AssignmentKind<DenseShape, SparseShape> { typedef Sparse2Dense Kind; }; template<typename DstXprType, typename SrcXprType> @@ -252,7 +252,24 @@ struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse, Scalar> template< typename DstXprType, typename SrcXprType, typename Functor, typename Scalar> struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Dense, Scalar> { - static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar> &/*func*/) + static void run(DstXprType &dst, const SrcXprType &src, const Functor &func) + { + eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); + typedef typename SrcXprType::Index Index; + + typename internal::evaluator<SrcXprType>::type srcEval(src); + typename internal::evaluator<DstXprType>::type dstEval(dst); + const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags&RowMajorBit) ? src.rows() : src.cols(); + for (Index j=0; j<outerEvaluationSize; ++j) + for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i) + func.assignCoeff(dstEval.coeffRef(i.row(),i.col()), i.value()); + } +}; + +template< typename DstXprType, typename SrcXprType, typename Scalar> +struct Assignment<DstXprType, SrcXprType, internal::assign_op<typename DstXprType::Scalar>, Sparse2Dense, Scalar> +{ + static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar> &) { eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); typedef typename SrcXprType::Index Index; |