1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_CWISE_BINARY_OP_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CWISE_BINARY_OP_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class CwiseBinaryOp 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Generic expression where a coefficient-wise binary operator is applied to two expressions 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param BinaryOp template functor implementing the operator 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Lhs the type of the left-hand side 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Rhs the type of the right-hand side 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents an expression where a coefficient-wise binary operator is applied to two expressions. 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is the return type of binary operators, by which we mean only those binary operators where 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * both the left-hand side and the right-hand side are Eigen expressions. 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp. 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Most of the time, this is the only way that it is used, so you typically don't have to name 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * CwiseBinaryOp types explicitly. 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::binaryExpr(const MatrixBase<OtherDerived> &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinaryOp, typename Lhs, typename Rhs> 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // we must not inherit from traits<Lhs> since it has 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // the potential to cause problems with MSVC 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename remove_all<Lhs>::type Ancestor; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<Ancestor>::XprKind XprKind; 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = traits<Ancestor>::RowsAtCompileTime, 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = traits<Ancestor>::ColsAtCompileTime, 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = traits<Ancestor>::MaxRowsAtCompileTime, 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = traits<Ancestor>::MaxColsAtCompileTime 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor), 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // we still want to handle the case when the result type is different. 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename result_of< 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BinaryOp( 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Lhs::Scalar, 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Rhs::Scalar 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type Scalar; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename promote_storage_type<typename traits<Lhs>::StorageKind, 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename traits<Rhs>::StorageKind>::ret StorageKind; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename promote_index_type<typename traits<Lhs>::Index, 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename traits<Rhs>::Index>::type Index; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Lhs::Nested LhsNested; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Rhs::Nested RhsNested; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename remove_reference<LhsNested>::type _LhsNested; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename remove_reference<RhsNested>::type _RhsNested; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LhsCoeffReadCost = _LhsNested::CoeffReadCost, 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RhsCoeffReadCost = _RhsNested::CoeffReadCost, 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LhsFlags = _LhsNested::Flags, 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RhsFlags = _RhsNested::Flags, 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SameType = is_same<typename _LhsNested::Scalar,typename _RhsNested::Scalar>::value, 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath StorageOrdersAgree = (int(Lhs::Flags)&RowMajorBit)==(int(Rhs::Flags)&RowMajorBit), 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags0 = (int(LhsFlags) | int(RhsFlags)) & ( 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath HereditaryBits 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath | (int(LhsFlags) & int(RhsFlags) & 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ( AlignedBit 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath | (StorageOrdersAgree ? LinearAccessBit : 0) 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath | (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0) 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ) 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ), 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit), 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = LhsCoeffReadCost + RhsCoeffReadCost + functor_traits<BinaryOp>::Cost 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// we require Lhs and Rhs to have the same scalar type. Currently there is no example of a binary functor 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// that would take two operands of different types. If there were such an example, then this check should be 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// moved to the BinaryOp functors, on a per-case basis. This would however require a change in the BinaryOp functors, as 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// currently they take only one typename Scalar template parameter. 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized paths. 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user tries to 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// add together a float matrix and a double matrix. 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \ 977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \ 987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez ? int(internal::scalar_product_traits<LHS, RHS>::Defined) \ 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : int(internal::is_same<LHS, RHS>::value)), \ 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind> 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseBinaryOpImpl; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinaryOp, typename Lhs, typename Rhs> 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseBinaryOp : internal::no_assignment_operator, 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public CwiseBinaryOpImpl< 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BinaryOp, Lhs, Rhs, 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind, 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::traits<Rhs>::StorageKind>::ret> 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename CwiseBinaryOpImpl< 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BinaryOp, Lhs, Rhs, 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind, 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::traits<Rhs>::StorageKind>::ret>::Base Base; 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp) 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::nested<Lhs>::type LhsNested; 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::nested<Rhs>::type RhsNested; 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::remove_reference<LhsNested>::type _LhsNested; 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::remove_reference<RhsNested>::type _RhsNested; 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs, const BinaryOp& func = BinaryOp()) 1267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez : m_lhs(aLhs), m_rhs(aRhs), m_functor(func) 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar); 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // require the sizes to match 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs) 1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols()); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index rows() const { 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // return the fixed size type if available to enable compile time optimizations 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (internal::traits<typename internal::remove_all<LhsNested>::type>::RowsAtCompileTime==Dynamic) 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_rhs.rows(); 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_lhs.rows(); 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index cols() const { 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // return the fixed size type if available to enable compile time optimizations 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (internal::traits<typename internal::remove_all<LhsNested>::type>::ColsAtCompileTime==Dynamic) 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_rhs.cols(); 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_lhs.cols(); 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the left hand side nested expression */ 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const _LhsNested& lhs() const { return m_lhs; } 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the right hand side nested expression */ 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const _RhsNested& rhs() const { return m_rhs; } 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the functor representing the binary operation */ 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const BinaryOp& functor() const { return m_functor; } 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LhsNested m_lhs; 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RhsNested m_rhs; 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const BinaryOp m_functor; 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinaryOp, typename Lhs, typename Rhs> 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Dense> 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived; 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type Base; 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DENSE_PUBLIC_INTERFACE( Derived ) 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return derived().functor()(derived().lhs().coeff(rowId, colId), 1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez derived().rhs().coeff(rowId, colId)); 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 1797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return derived().functor().packetOp(derived().lhs().template packet<LoadMode>(rowId, colId), 1827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez derived().rhs().template packet<LoadMode>(rowId, colId)); 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar coeff(Index index) const 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().functor()(derived().lhs().coeff(index), 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().rhs().coeff(index)); 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE PacketScalar packet(Index index) const 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().functor().packetOp(derived().lhs().template packet<LoadMode>(index), 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().rhs().template packet<LoadMode>(index)); 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** replaces \c *this by \c *this - \a other. 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \returns a reference to \c *this 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE Derived & 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::operator-=(const MatrixBase<OtherDerived> &other) 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, Derived, OtherDerived> tmp(derived()); 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath tmp = other.derived(); 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** replaces \c *this by \c *this + \a other. 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \returns a reference to \c *this 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE Derived & 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::operator+=(const MatrixBase<OtherDerived>& other) 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, Derived, OtherDerived> tmp(derived()); 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath tmp = other.derived(); 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_CWISE_BINARY_OP_H 230