aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/SparseCore/SparseAssign.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2014-08-01 16:23:30 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2014-08-01 16:23:30 +0200
commitc2ff44cbf3c58045a38120d28316a992c0cc0d57 (patch)
tree1c34fb784a6ad7ad9a7174ff2629be12b0f8d2e7 /Eigen/src/SparseCore/SparseAssign.h
parent2a3c3c49a19572b544b22820065c673cfac9bc04 (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.h25
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;