26 #ifndef EIGEN_PARTIAL_REDUX_H
27 #define EIGEN_PARTIAL_REDUX_H
47 template<
typename MatrixType,
typename MemberOp,
int Direction>
48 class PartialReduxExpr;
51 template<
typename MatrixType,
typename MemberOp,
int Direction>
52 struct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >
55 typedef typename MemberOp::result_type Scalar;
58 typedef typename MatrixType::Scalar InputScalar;
59 typedef typename nested<MatrixType>::type MatrixTypeNested;
60 typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
62 RowsAtCompileTime = Direction==
Vertical ? 1 : MatrixType::RowsAtCompileTime,
63 ColsAtCompileTime = Direction==
Horizontal ? 1 : MatrixType::ColsAtCompileTime,
64 MaxRowsAtCompileTime = Direction==
Vertical ? 1 : MatrixType::MaxRowsAtCompileTime,
65 MaxColsAtCompileTime = Direction==
Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
68 TraversalSize = Direction==
Vertical ? RowsAtCompileTime : ColsAtCompileTime
70 #if EIGEN_GNUC_AT_LEAST(3,4)
71 typedef typename MemberOp::template Cost<InputScalar,int(TraversalSize)> CostOpType;
73 typedef typename MemberOp::template Cost<InputScalar,TraversalSize> CostOpType;
81 template<
typename MatrixType,
typename MemberOp,
int Direction>
83 public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type
87 typedef typename internal::dense_xpr_base<PartialReduxExpr>::type
Base;
93 : m_matrix(mat), m_functor(func) {}
95 Index
rows()
const {
return (Direction==
Vertical ? 1 : m_matrix.rows()); }
101 return m_functor(m_matrix.col(j));
103 return m_functor(m_matrix.row(i));
106 const Scalar coeff(Index index)
const
109 return m_functor(m_matrix.col(index));
111 return m_functor(m_matrix.row(index));
119 #define EIGEN_MEMBER_FUNCTOR(MEMBER,COST) \
120 template <typename ResultType> \
121 struct member_##MEMBER { \
122 EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER) \
123 typedef ResultType result_type; \
124 template<typename Scalar, int Size> struct Cost \
125 { enum { value = COST }; }; \
126 template<typename XprType> \
127 EIGEN_STRONG_INLINE ResultType operator()(const XprType& mat) const \
128 { return mat.MEMBER(); } \
148 template <
typename BinaryOp,
typename Scalar>
149 struct member_redux {
150 typedef typename result_of<
153 template<
typename _Scalar,
int Size>
struct Cost
154 {
enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
155 member_redux(
const BinaryOp func) : m_functor(func) {}
156 template<
typename Derived>
157 inline result_type operator()(
const DenseBase<Derived>& mat)
const
158 {
return mat.redux(m_functor); }
159 const BinaryOp m_functor;
184 typedef typename ExpressionType::Scalar
Scalar;
186 typedef typename ExpressionType::Index
Index;
187 typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
191 template<
template<
typename _Scalar>
class Functor,
203 internal::member_redux<BinaryOp,typename internal::traits<ExpressionType>::Scalar>,
217 typedef typename internal::conditional<Direction==
Vertical,
218 typename ExpressionType::ColXpr,
228 {
return Direction==
Vertical?m_matrix.cols():m_matrix.rows(); }
232 Direction==
Vertical ? 1 : ExpressionType::RowsAtCompileTime,
238 template<
typename OtherDerived>
243 YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
245 YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
248 Direction==
Vertical ? 1 : m_matrix.rows(),
257 inline const ExpressionType&
_expression()
const {
return m_matrix; }
266 template<
typename BinaryOp>
268 redux(
const BinaryOp& func = BinaryOp())
const
279 {
return _expression(); }
289 {
return _expression(); }
299 {
return _expression(); }
309 {
return _expression(); }
318 {
return _expression(); }
327 {
return _expression(); }
336 {
return _expression(); }
346 {
return _expression(); }
353 {
return _expression(); }
360 {
return _expression(); }
367 {
return _expression(); }
377 {
return _expression(); }
387 {
return _expression(); }
413 replicate(
Index factor = Factor)
const
422 template<
typename OtherDerived>
428 return const_cast<ExpressionType&
>(m_matrix = extendedTo(other.derived()));
432 template<
typename OtherDerived>
437 return const_cast<ExpressionType&
>(m_matrix += extendedTo(other.derived()));
441 template<
typename OtherDerived>
446 return const_cast<ExpressionType&
>(m_matrix -= extendedTo(other.derived()));
450 template<
typename OtherDerived>
456 m_matrix *= extendedTo(other.derived());
457 return const_cast<ExpressionType&
>(m_matrix);
461 template<
typename OtherDerived>
467 m_matrix /= extendedTo(other.derived());
468 return const_cast<ExpressionType&
>(m_matrix);
474 const ExpressionTypeNestedCleaned,
480 return m_matrix + extendedTo(other.derived());
484 template<
typename OtherDerived>
486 const ExpressionTypeNestedCleaned,
492 return m_matrix - extendedTo(other.derived());
499 const ExpressionTypeNestedCleaned,
506 return m_matrix * extendedTo(other.derived());
511 template<
typename OtherDerived>
513 const ExpressionTypeNestedCleaned,
520 return m_matrix / extendedTo(other.derived());
525 #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
530 template<
typename OtherDerived>
534 HNormalized_Size = Direction==
Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
535 : internal::traits<ExpressionType>::ColsAtCompileTime,
536 HNormalized_SizeMinusOne = HNormalized_Size==
Dynamic ?
Dynamic : HNormalized_Size-1
538 typedef Block<
const ExpressionType,
539 Direction==
Vertical ?
int(HNormalized_SizeMinusOne)
540 : int(internal::
traits<ExpressionType>::RowsAtCompileTime),
541 Direction==
Horizontal ? int(HNormalized_SizeMinusOne)
542 : int(internal::
traits<ExpressionType>::ColsAtCompileTime)>
544 typedef Block<
const ExpressionType,
545 Direction==
Vertical ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
546 Direction==
Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
551 Direction==
Vertical ? HNormalized_SizeMinusOne : 1,
552 Direction==
Horizontal ? HNormalized_SizeMinusOne : 1> >
568 template<
typename Derived>
579 template<
typename Derived>
593 template<
typename Derived>
604 template<
typename Derived>
613 #endif // EIGEN_PARTIAL_REDUX_H