12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library 22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra. 32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2008-2014 Gael Guennebaud <gael.guennebaud@inria.fr> 52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla 72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed 82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_SPARSEASSIGN_H 112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_SPARSEASSIGN_H 122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen { 142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> 162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename OtherDerived> 172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangDerived& SparseMatrixBase<Derived>::operator=(const EigenBase<OtherDerived> &other) 182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang internal::call_assignment_no_alias(derived(), other.derived()); 202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return derived(); 212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> 242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename OtherDerived> 252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangDerived& SparseMatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other) 262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // TODO use the evaluator mechanism 282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang other.evalTo(derived()); 292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return derived(); 302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename OtherDerived> 342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline Derived& SparseMatrixBase<Derived>::operator=(const SparseMatrixBase<OtherDerived>& other) 352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // by default sparse evaluation do not alias, so we can safely bypass the generic call_assignment routine 372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang internal::Assignment<Derived,OtherDerived,internal::assign_op<Scalar,typename OtherDerived::Scalar> > 382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang ::run(derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>()); 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return derived(); 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> 432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline Derived& SparseMatrixBase<Derived>::operator=(const Derived& other) 442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang internal::call_assignment_no_alias(derived(), other.derived()); 462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return derived(); 472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct storage_kind_to_evaluator_kind<Sparse> { 532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef IteratorBased Kind; 542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> 572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct storage_kind_to_shape<Sparse> { 582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef SparseShape Shape; 592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Sparse2Sparse {}; 622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Sparse2Dense {}; 632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<SparseShape, SparseShape> { typedef Sparse2Sparse Kind; }; 652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<SparseShape, SparseTriangularShape> { typedef Sparse2Sparse Kind; }; 662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<DenseShape, SparseShape> { typedef Sparse2Dense Kind; }; 672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<DenseShape, SparseTriangularShape> { typedef Sparse2Dense Kind; }; 682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename DstXprType, typename SrcXprType> 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangvoid assign_sparse_to_sparse(DstXprType &dst, const SrcXprType &src) 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename DstXprType::Scalar Scalar; 742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef internal::evaluator<DstXprType> DstEvaluatorType; 752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef internal::evaluator<SrcXprType> SrcEvaluatorType; 762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SrcEvaluatorType srcEvaluator(src); 782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const bool transpose = (DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit); 802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Index outerEvaluationSize = (SrcEvaluatorType::Flags&RowMajorBit) ? src.rows() : src.cols(); 812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if ((!transpose) && src.isRValue()) 822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // eval without temporary 842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.resize(src.rows(), src.cols()); 852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.setZero(); 862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.reserve((std::max)(src.rows(),src.cols())*2); 872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (Index j=0; j<outerEvaluationSize; ++j) 882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.startVec(j); 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it) 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar v = it.value(); 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.insertBackByOuterInner(j,it.index()) = v; 942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.finalize(); 972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // eval through a temporary 1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang eigen_assert(( ((internal::traits<DstXprType>::SupportedAccessPatterns & OuterRandomAccessPattern)==OuterRandomAccessPattern) || 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (!((DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit)))) && 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang "the transpose operation is supposed to be handled in SparseMatrix::operator="); 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang enum { Flip = (DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit) }; 1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang DstXprType temp(src.rows(), src.cols()); 1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang temp.reserve((std::max)(src.rows(),src.cols())*2); 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (Index j=0; j<outerEvaluationSize; ++j) 1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang temp.startVec(j); 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it) 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar v = it.value(); 1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang temp.insertBackByOuterInner(Flip?it.index():j,Flip?j:it.index()) = v; 1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang temp.finalize(); 1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst = temp.markAsRValue(); 1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Generic Sparse to Sparse assignment 1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename DstXprType, typename SrcXprType, typename Functor> 1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse> 1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) 1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang assign_sparse_to_sparse(dst.derived(), src.derived()); 1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Generic Sparse to Dense assignment 1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename DstXprType, typename SrcXprType, typename Functor> 1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SrcXprType, Functor, Sparse2Dense> 1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(DstXprType &dst, const SrcXprType &src, const Functor &func) 1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(internal::is_same<Functor,internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> >::value) 1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.setZero(); 1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang internal::evaluator<SrcXprType> srcEval(src); 1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang resize_if_allowed(dst, src, func); 1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang internal::evaluator<DstXprType> dstEval(dst); 1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags&RowMajorBit) ? src.rows() : src.cols(); 1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (Index j=0; j<outerEvaluationSize; ++j) 1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i) 1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang func.assignCoeff(dstEval.coeffRef(i.row(),i.col()), i.value()); 1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Specialization for "dst = dec.solve(rhs)" 1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// NOTE we need to specialize it for Sparse2Sparse to avoid ambiguous specialization error 1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename DstXprType, typename DecType, typename RhsType, typename Scalar> 1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, Solve<DecType,RhsType>, internal::assign_op<Scalar,Scalar>, Sparse2Sparse> 1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef Solve<DecType,RhsType> SrcXprType; 1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &) 1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index dstRows = src.rows(); 1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index dstCols = src.cols(); 1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) 1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.resize(dstRows, dstCols); 1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang src.dec()._solve_impl(src.rhs(), dst); 1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Diagonal2Sparse {}; 1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<SparseShape,DiagonalShape> { typedef Diagonal2Sparse Kind; }; 1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename DstXprType, typename SrcXprType, typename Functor> 1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Sparse> 1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename DstXprType::StorageIndex StorageIndex; 1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename DstXprType::Scalar Scalar; 1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef Array<StorageIndex,Dynamic,1> ArrayXI; 1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef Array<Scalar,Dynamic,1> ArrayXS; 1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template<int Options> 1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(SparseMatrix<Scalar,Options,StorageIndex> &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) 1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index dstRows = src.rows(); 1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index dstCols = src.cols(); 1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) 1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.resize(dstRows, dstCols); 1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index size = src.diagonal().size(); 1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.makeCompressed(); 1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.resizeNonZeros(size); 1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Map<ArrayXI>(dst.innerIndexPtr(), size).setLinSpaced(0,StorageIndex(size)-1); 1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Map<ArrayXI>(dst.outerIndexPtr(), size+1).setLinSpaced(0,StorageIndex(size)); 1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Map<ArrayXS>(dst.valuePtr(), size) = src.diagonal(); 1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template<typename DstDerived> 2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) 2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.diagonal() = src.diagonal(); 2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) 2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { dst.diagonal() += src.diagonal(); } 2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) 2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { dst.diagonal() -= src.diagonal(); } 2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace internal 2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen 2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_SPARSEASSIGN_H 217