11 #ifndef EIGEN_PARTIAL_REDUX_H
12 #define EIGEN_PARTIAL_REDUX_H
32 template<
typename MatrixType,
typename MemberOp,
int Direction>
33 class PartialReduxExpr;
36 template<
typename MatrixType,
typename MemberOp,
int Direction>
37 struct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >
40 typedef typename MemberOp::result_type Scalar;
41 typedef typename traits<MatrixType>::StorageKind StorageKind;
42 typedef typename traits<MatrixType>::XprKind XprKind;
43 typedef typename MatrixType::Scalar InputScalar;
45 RowsAtCompileTime = Direction==
Vertical ? 1 : MatrixType::RowsAtCompileTime,
46 ColsAtCompileTime = Direction==
Horizontal ? 1 : MatrixType::ColsAtCompileTime,
47 MaxRowsAtCompileTime = Direction==
Vertical ? 1 : MatrixType::MaxRowsAtCompileTime,
48 MaxColsAtCompileTime = Direction==
Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
50 TraversalSize = Direction==
Vertical ? MatrixType::RowsAtCompileTime : MatrixType::ColsAtCompileTime
55 template<
typename MatrixType,
typename MemberOp,
int Direction>
56 class PartialReduxExpr :
public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type,
57 internal::no_assignment_operator
61 typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
65 explicit PartialReduxExpr(
const MatrixType& mat,
const MemberOp& func = MemberOp())
66 : m_matrix(mat), m_functor(func) {}
69 Index rows()
const {
return (Direction==
Vertical ? 1 : m_matrix.rows()); }
71 Index cols()
const {
return (Direction==
Horizontal ? 1 : m_matrix.cols()); }
74 typename MatrixType::Nested nestedExpression()
const {
return m_matrix; }
77 const MemberOp& functor()
const {
return m_functor; }
80 typename MatrixType::Nested m_matrix;
81 const MemberOp m_functor;
84 #define EIGEN_MEMBER_FUNCTOR(MEMBER,COST) \
85 template <typename ResultType> \
86 struct member_##MEMBER { \
87 EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER) \
88 typedef ResultType result_type; \
89 template<typename Scalar, int Size> struct Cost \
90 { enum { value = COST }; }; \
91 template<typename XprType> \
92 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \
93 ResultType operator()(const XprType& mat) const \
94 { return mat.MEMBER(); } \
103 EIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
113 template <
int p,
typename ResultType>
114 struct member_lpnorm {
115 typedef ResultType result_type;
116 template<
typename Scalar,
int Size>
struct Cost
118 EIGEN_DEVICE_FUNC member_lpnorm() {}
119 template<
typename XprType>
120 EIGEN_DEVICE_FUNC
inline ResultType operator()(
const XprType& mat)
const
121 {
return mat.template lpNorm<p>(); }
124 template <
typename BinaryOp,
typename Scalar>
125 struct member_redux {
126 typedef typename result_of<
127 BinaryOp(
const Scalar&,
const Scalar&)
129 template<
typename _Scalar,
int Size>
struct Cost
130 {
enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
131 EIGEN_DEVICE_FUNC
explicit member_redux(
const BinaryOp func) : m_functor(func) {}
132 template<
typename Derived>
133 EIGEN_DEVICE_FUNC
inline result_type operator()(
const DenseBase<Derived>& mat)
const
134 {
return mat.redux(m_functor); }
135 const BinaryOp m_functor;
160 typedef typename ExpressionType::Scalar Scalar;
161 typedef typename ExpressionType::RealScalar RealScalar;
163 typedef typename internal::ref_selector<ExpressionType>::non_const_type ExpressionTypeNested;
164 typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;
166 template<
template<
typename _Scalar>
class Functor,
167 typename Scalar_=Scalar>
struct ReturnType
175 template<
typename BinaryOp>
struct ReduxReturnType
178 internal::member_redux<BinaryOp,Scalar>,
184 isVertical = (Direction==
Vertical) ? 1 : 0,
185 isHorizontal = (Direction==
Horizontal) ? 1 : 0
190 typedef typename internal::conditional<isVertical,
191 typename ExpressionType::ColXpr,
192 typename ExpressionType::RowXpr>::type SubVector;
196 SubVector subVector(
Index i)
198 return SubVector(m_matrix.derived(),i);
204 Index subVectors()
const
205 {
return isVertical?m_matrix.cols():m_matrix.rows(); }
207 template<
typename OtherDerived>
struct ExtendedType {
208 typedef Replicate<OtherDerived,
209 isVertical ? 1 : ExpressionType::RowsAtCompileTime,
210 isHorizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;
215 template<
typename OtherDerived>
217 typename ExtendedType<OtherDerived>::Type
218 extendedTo(
const DenseBase<OtherDerived>& other)
const
220 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isVertical, OtherDerived::MaxColsAtCompileTime==1),
221 YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
222 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isHorizontal, OtherDerived::MaxRowsAtCompileTime==1),
223 YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
224 return typename ExtendedType<OtherDerived>::Type
226 isVertical ? 1 : m_matrix.rows(),
227 isHorizontal ? 1 : m_matrix.cols());
230 template<
typename OtherDerived>
struct OppositeExtendedType {
231 typedef Replicate<OtherDerived,
232 isHorizontal ? 1 : ExpressionType::RowsAtCompileTime,
233 isVertical ? 1 : ExpressionType::ColsAtCompileTime> Type;
238 template<
typename OtherDerived>
240 typename OppositeExtendedType<OtherDerived>::Type
241 extendedToOpposite(
const DenseBase<OtherDerived>& other)
const
243 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isHorizontal, OtherDerived::MaxColsAtCompileTime==1),
244 YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
245 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isVertical, OtherDerived::MaxRowsAtCompileTime==1),
246 YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
247 return typename OppositeExtendedType<OtherDerived>::Type
249 isHorizontal ? 1 : m_matrix.rows(),
250 isVertical ? 1 : m_matrix.cols());
255 explicit inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
259 inline const ExpressionType& _expression()
const {
return m_matrix; }
268 template<
typename BinaryOp>
270 const typename ReduxReturnType<BinaryOp>::Type
271 redux(
const BinaryOp& func = BinaryOp())
const
274 typedef typename ReturnType<internal::member_minCoeff>::Type MinCoeffReturnType;
275 typedef typename ReturnType<internal::member_maxCoeff>::Type MaxCoeffReturnType;
276 typedef typename ReturnType<internal::member_squaredNorm,RealScalar>::Type SquaredNormReturnType;
277 typedef typename ReturnType<internal::member_norm,RealScalar>::Type NormReturnType;
278 typedef typename ReturnType<internal::member_blueNorm,RealScalar>::Type BlueNormReturnType;
279 typedef typename ReturnType<internal::member_stableNorm,RealScalar>::Type StableNormReturnType;
280 typedef typename ReturnType<internal::member_hypotNorm,RealScalar>::Type HypotNormReturnType;
281 typedef typename ReturnType<internal::member_sum>::Type SumReturnType;
282 typedef typename ReturnType<internal::member_mean>::Type MeanReturnType;
283 typedef typename ReturnType<internal::member_all>::Type AllReturnType;
284 typedef typename ReturnType<internal::member_any>::Type AnyReturnType;
286 typedef typename ReturnType<internal::member_prod>::Type ProdReturnType;
290 template<
int p>
struct LpNormReturnType {
490 (_expression(),isVertical?factor:1,isHorizontal?factor:1);
496 template<
typename OtherDerived>
500 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
501 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
503 return const_cast<ExpressionType&
>(m_matrix = extendedTo(other.
derived()));
507 template<
typename OtherDerived>
511 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
512 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
513 return const_cast<ExpressionType&
>(m_matrix += extendedTo(other.
derived()));
517 template<
typename OtherDerived>
521 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
522 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
523 return const_cast<ExpressionType&
>(m_matrix -= extendedTo(other.
derived()));
527 template<
typename OtherDerived>
531 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
532 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
533 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
534 m_matrix *= extendedTo(other.
derived());
535 return const_cast<ExpressionType&
>(m_matrix);
539 template<
typename OtherDerived>
543 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
544 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
545 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
546 m_matrix /= extendedTo(other.
derived());
547 return const_cast<ExpressionType&
>(m_matrix);
551 template<
typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
553 const ExpressionTypeNestedCleaned,
554 const typename ExtendedType<OtherDerived>::Type>
557 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
558 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
559 return m_matrix + extendedTo(other.
derived());
563 template<
typename OtherDerived>
566 const ExpressionTypeNestedCleaned,
567 const typename ExtendedType<OtherDerived>::Type>
570 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
571 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
572 return m_matrix - extendedTo(other.
derived());
577 template<
typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
579 const ExpressionTypeNestedCleaned,
580 const typename ExtendedType<OtherDerived>::Type>
584 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
585 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
586 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
587 return m_matrix * extendedTo(other.
derived());
592 template<
typename OtherDerived>
595 const ExpressionTypeNestedCleaned,
596 const typename ExtendedType<OtherDerived>::Type>
599 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
600 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
601 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
602 return m_matrix / extendedTo(other.
derived());
611 const ExpressionTypeNestedCleaned,
612 const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type>
613 normalized()
const {
return m_matrix.cwiseQuotient(extendedToOpposite(this->
norm())); }
631 typedef typename ExpressionType::PlainObject CrossReturnType;
632 template<
typename OtherDerived>
637 HNormalized_Size = Direction==
Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
638 : internal::traits<ExpressionType>::ColsAtCompileTime,
639 HNormalized_SizeMinusOne = HNormalized_Size==
Dynamic ?
Dynamic : HNormalized_Size-1
641 typedef Block<
const ExpressionType,
642 Direction==
Vertical ? int(HNormalized_SizeMinusOne)
643 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
644 Direction==
Horizontal ? int(HNormalized_SizeMinusOne)
645 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
647 typedef Block<
const ExpressionType,
648 Direction==
Vertical ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
649 Direction==
Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
651 typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
652 const HNormalized_Block,
653 const Replicate<HNormalized_Factors,
654 Direction==
Vertical ? HNormalized_SizeMinusOne : 1,
655 Direction==
Horizontal ? HNormalized_SizeMinusOne : 1> >
656 HNormalizedReturnType;
662 ExpressionTypeNested m_matrix;
672 template<
typename Derived>
673 inline typename DenseBase<Derived>::ColwiseReturnType
686 template<
typename Derived>
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Definition: CwiseBinaryOp.h:84
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:47
ConstColwiseReturnType colwise() const
Definition: DenseBase.h:516
ConstRowwiseReturnType rowwise() const
Definition: DenseBase.h:504
Derived & derived()
Definition: EigenBase.h:45
Expression of one (or a set of) homogeneous vector(s)
Definition: Homogeneous.h:62
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:50
Generic expression of a partially reduxed matrix.
Definition: VectorwiseOp.h:58
Expression of the multiple replication of a matrix or vector.
Definition: Replicate.h:63
Expression of the reverse of a vector or matrix.
Definition: Reverse.h:65
Pseudo expression providing partial reduction operations.
Definition: VectorwiseOp.h:157
const HypotNormReturnType hypotNorm() const
Definition: VectorwiseOp.h:387
const SquaredNormReturnType squaredNorm() const
Definition: VectorwiseOp.h:329
const ProdReturnType prod() const
Definition: VectorwiseOp.h:448
ExpressionType & operator+=(const DenseBase< OtherDerived > &other)
Definition: VectorwiseOp.h:509
CwiseBinaryOp< internal::scalar_product_op< Scalar >, const ExpressionTypeNestedCleaned, const typename ExtendedType< OtherDerived >::Type > operator*(const DenseBase< OtherDerived > &other) const
Definition: VectorwiseOp.h:582
Eigen::Index Index
Definition: VectorwiseOp.h:162
const BlueNormReturnType blueNorm() const
Definition: VectorwiseOp.h:365
CwiseBinaryOp< internal::scalar_quotient_op< Scalar >, const ExpressionTypeNestedCleaned, const typename OppositeExtendedType< typename ReturnType< internal::member_norm, RealScalar >::Type >::Type > normalized() const
Definition: VectorwiseOp.h:613
const CountReturnType count() const
Definition: VectorwiseOp.h:437
CwiseBinaryOp< internal::scalar_difference_op< Scalar, typename OtherDerived::Scalar >, const ExpressionTypeNestedCleaned, const typename ExtendedType< OtherDerived >::Type > operator-(const DenseBase< OtherDerived > &other) const
Definition: VectorwiseOp.h:568
const ReplicateReturnType replicate(Index factor) const
Definition: Replicate.h:134
const MaxCoeffReturnType maxCoeff() const
Definition: VectorwiseOp.h:317
ExpressionType & operator-=(const DenseBase< OtherDerived > &other)
Definition: VectorwiseOp.h:519
const SumReturnType sum() const
Definition: VectorwiseOp.h:398
CwiseBinaryOp< internal::scalar_sum_op< Scalar, typename OtherDerived::Scalar >, const ExpressionTypeNestedCleaned, const typename ExtendedType< OtherDerived >::Type > operator+(const DenseBase< OtherDerived > &other) const
Definition: VectorwiseOp.h:555
ExpressionType & operator=(const DenseBase< OtherDerived > &other)
Definition: VectorwiseOp.h:498
const MinCoeffReturnType minCoeff() const
Definition: VectorwiseOp.h:304
const Replicate< ExpressionType, isVertical *Factor+isHorizontal, isHorizontal *Factor+isVertical > replicate(Index factor=Factor) const
Definition: VectorwiseOp.h:487
const AnyReturnType any() const
Definition: VectorwiseOp.h:424
const AllReturnType all() const
Definition: VectorwiseOp.h:415
ExpressionType & operator/=(const DenseBase< OtherDerived > &other)
Definition: VectorwiseOp.h:541
CwiseBinaryOp< internal::scalar_quotient_op< Scalar >, const ExpressionTypeNestedCleaned, const typename ExtendedType< OtherDerived >::Type > operator/(const DenseBase< OtherDerived > &other) const
Definition: VectorwiseOp.h:597
const LpNormReturnType< p >::Type lpNorm() const
Definition: VectorwiseOp.h:354
const MeanReturnType mean() const
Definition: VectorwiseOp.h:406
ReverseReturnType reverse()
Definition: VectorwiseOp.h:468
void reverseInPlace()
Definition: Reverse.h:204
ExpressionType & operator*=(const DenseBase< OtherDerived > &other)
Definition: VectorwiseOp.h:529
void normalize()
Definition: VectorwiseOp.h:619
const StableNormReturnType stableNorm() const
Definition: VectorwiseOp.h:376
const ReduxReturnType< BinaryOp >::Type redux(const BinaryOp &func=BinaryOp()) const
Definition: VectorwiseOp.h:271
const ConstReverseReturnType reverse() const
Definition: VectorwiseOp.h:460
const NormReturnType norm() const
Definition: VectorwiseOp.h:341
const HNormalizedReturnType hnormalized() const
column or row-wise homogeneous normalization
Definition: Homogeneous.h:196
const CrossReturnType cross(const MatrixBase< OtherDerived > &other) const
Definition: OrthoMethods.h:110
HomogeneousReturnType homogeneous() const
Definition: Homogeneous.h:148
@ Horizontal
Definition: Constants.h:268
@ Vertical
Definition: Constants.h:265
const unsigned int RowMajorBit
Definition: Constants.h:61
Namespace containing all symbols from the Eigen library.
Definition: Core:309
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
const int Dynamic
Definition: Constants.h:21
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:151