aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/SparseCore/SparseAssign.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2014-06-25 17:23:52 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2014-06-25 17:23:52 +0200
commitb868bfb84a4a86231bb338e9bcf08afd882d32dc (patch)
tree29f019cbbe4f5821fc41c6f2358961fc99c7c7e0 /Eigen/src/SparseCore/SparseAssign.h
parent3b19b466a7609fd381db2c53569d4d1d1621dbfc (diff)
Make operator=(EigenBase<>) uses the new assignment mechanism and introduce a generic EigenBase to EigenBase assignment kind based on the previous evalTo mechanism.
Diffstat (limited to 'Eigen/src/SparseCore/SparseAssign.h')
-rw-r--r--Eigen/src/SparseCore/SparseAssign.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/Eigen/src/SparseCore/SparseAssign.h b/Eigen/src/SparseCore/SparseAssign.h
index d4434e0ae..86a0b08c5 100644
--- a/Eigen/src/SparseCore/SparseAssign.h
+++ b/Eigen/src/SparseCore/SparseAssign.h
@@ -167,8 +167,10 @@ struct storage_kind_to_shape<Sparse> {
};
struct Sparse2Sparse {};
+struct Sparse2Dense {};
template<> struct AssignmentKind<SparseShape,SparseShape> { typedef Sparse2Sparse Kind; };
+template<> struct AssignmentKind<DenseShape,SparseShape> { typedef Sparse2Dense Kind; };
template<typename DstXprType, typename SrcXprType>
@@ -242,6 +244,24 @@ struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse, Scalar>
}
};
+// Sparse to Dense assignment
+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*/)
+ {
+ eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
+ typedef typename SrcXprType::Index Index;
+
+ dst.setZero();
+ typename internal::evaluator<SrcXprType>::type srcEval(src);
+ typename internal::evaluator<DstXprType>::type dstEval(dst);
+ for (Index j=0; j<src.outerSize(); ++j)
+ for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i)
+ dstEval.coeffRef(i.row(),i.col()) = i.value();
+ }
+};
+
} // end namespace internal
#endif // EIGEN_TEST_EVALUATORS