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-2010 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_PARTIAL_REDUX_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_PARTIAL_REDUX_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class PartialReduxExpr
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Generic expression of a partially reduxed matrix
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam MatrixType the type of the matrix we are applying the redux operation
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam MemberOp type of the member functor
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents an expression of a partial redux operator of a matrix.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of some VectorwiseOp functions,
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class VectorwiseOp
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< typename MatrixType, typename MemberOp, int Direction>
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass PartialReduxExpr;
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, typename MemberOp, int Direction>
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<MatrixType>
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MemberOp::result_type Scalar;
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename traits<MatrixType>::StorageKind StorageKind;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename traits<MatrixType>::XprKind XprKind;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar InputScalar;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename nested<MatrixType>::type MatrixTypeNested;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::RowsAtCompileTime,
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime,
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxRowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::MaxRowsAtCompileTime,
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Flags0 = (unsigned int)_MatrixTypeNested::Flags & HereditaryBits,
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Flags = (Flags0 & ~RowMajorBit) | (RowsAtCompileTime == 1 ? RowMajorBit : 0),
537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    TraversalSize = Direction==Vertical ? MatrixType::RowsAtCompileTime :  MatrixType::ColsAtCompileTime
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #if EIGEN_GNUC_AT_LEAST(3,4)
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MemberOp::template Cost<InputScalar,int(TraversalSize)> CostOpType;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #else
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MemberOp::template Cost<InputScalar,TraversalSize> CostOpType;
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    CoeffReadCost = TraversalSize==Dynamic ? Dynamic
627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                  : TraversalSize * traits<_MatrixTypeNested>::CoeffReadCost + int(CostOpType::value)
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< typename MatrixType, typename MemberOp, int Direction>
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass PartialReduxExpr : internal::no_assignment_operator,
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<PartialReduxExpr>::MatrixTypeNested MatrixTypeNested;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<PartialReduxExpr>::_MatrixTypeNested _MatrixTypeNested;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : m_matrix(mat), m_functor(func) {}
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index rows() const { return (Direction==Vertical   ? 1 : m_matrix.rows()); }
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE const Scalar coeff(Index i, Index j) const
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (Direction==Vertical)
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.col(j));
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.row(i));
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Scalar coeff(Index index) const
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (Direction==Vertical)
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.col(index));
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.row(index));
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixTypeNested m_matrix;
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MemberOp m_functor;
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MEMBER_FUNCTOR(MEMBER,COST)                               \
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <typename ResultType>                                        \
1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  struct member_##MEMBER {                                              \
1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER)                            \
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef ResultType result_type;                                     \
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, int Size> struct Cost                     \
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { enum { value = COST }; };                                         \
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename XprType>                                          \
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE ResultType operator()(const XprType& mat) const \
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return mat.MEMBER(); } \
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost);
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost);
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename BinaryOp, typename Scalar>
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct member_redux {
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename result_of<
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     BinaryOp(Scalar)
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   >::type  result_type;
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename _Scalar, int Size> struct Cost
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  member_redux(const BinaryOp func) : m_functor(func) {}
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename Derived>
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  inline result_type operator()(const DenseBase<Derived>& mat) const
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { return mat.redux(m_functor); }
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const BinaryOp m_functor;
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class VectorwiseOp
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Pseudo expression providing partial reduction operations
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param ExpressionType the type of the object on which to do partial reductions
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param Direction indicates the direction of the redux (#Vertical or #Horizontal)
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents a pseudo expression with partial reduction features.
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_colwise.cpp
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_colwise.out
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction> class VectorwiseOp
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::Scalar Scalar;
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::RealScalar RealScalar;
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::Index Index;
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        ExpressionType, ExpressionType&>::type ExpressionTypeNested;
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<template<typename _Scalar> class Functor,
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      typename Scalar=typename internal::traits<ExpressionType>::Scalar> struct ReturnType
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef PartialReduxExpr<ExpressionType,
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Functor<Scalar>,
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Direction
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                              > Type;
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp> struct ReduxReturnType
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef PartialReduxExpr<ExpressionType,
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               internal::member_redux<BinaryOp,typename internal::traits<ExpressionType>::Scalar>,
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Direction
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                              > Type;
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      IsVertical   = (Direction==Vertical) ? 1 : 0,
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      IsHorizontal = (Direction==Horizontal) ? 1 : 0
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \returns the i-th subvector according to the \c Direction */
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<Direction==Vertical,
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               typename ExpressionType::ColXpr,
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               typename ExpressionType::RowXpr>::type SubVector;
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SubVector subVector(Index i)
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return SubVector(m_matrix.derived(),i);
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \returns the number of subvectors in the direction \c Direction */
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index subVectors() const
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return Direction==Vertical?m_matrix.cols():m_matrix.rows(); }
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> struct ExtendedType {
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef Replicate<OtherDerived,
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        Direction==Vertical   ? 1 : ExpressionType::RowsAtCompileTime,
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        Direction==Horizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Replicates a vector to match the size of \c *this */
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename ExtendedType<OtherDerived>::Type
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    extendedTo(const DenseBase<OtherDerived>& other) const
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxColsAtCompileTime==1),
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxRowsAtCompileTime==1),
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return typename ExtendedType<OtherDerived>::Type
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      (other.derived(),
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Direction==Vertical   ? 1 : m_matrix.rows(),
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Direction==Horizontal ? 1 : m_matrix.cols());
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
2377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<typename OtherDerived> struct OppositeExtendedType {
2397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      typedef Replicate<OtherDerived,
2407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                        Direction==Horizontal ? 1 : ExpressionType::RowsAtCompileTime,
2417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                        Direction==Vertical   ? 1 : ExpressionType::ColsAtCompileTime> Type;
2427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    };
2437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** \internal
2457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * Replicates a vector in the opposite direction to match the size of \c *this */
2467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<typename OtherDerived>
2477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    typename OppositeExtendedType<OtherDerived>::Type
2487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    extendedToOpposite(const DenseBase<OtherDerived>& other) const
2497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
2507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxColsAtCompileTime==1),
2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
2527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxRowsAtCompileTime==1),
2537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
2547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return typename OppositeExtendedType<OtherDerived>::Type
2557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                      (other.derived(),
2567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                       Direction==Horizontal  ? 1 : m_matrix.rows(),
2577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                       Direction==Vertical    ? 1 : m_matrix.cols());
2587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal */
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const ExpressionType& _expression() const { return m_matrix; }
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row or column vector expression of \c *this reduxed by \a func
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * The template parameter \a BinaryOp is the type of the functor
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of the custom redux operator. Note that func must be an associative operator.
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp>
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReduxReturnType<BinaryOp>::Type
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    redux(const BinaryOp& func = BinaryOp()) const
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return typename ReduxReturnType<BinaryOp>::Type(_expression(), func); }
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the smallest coefficient
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      *
2827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \warning the result is undefined if \c *this contains NaN.
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_minCoeff.cpp
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_minCoeff.out
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::minCoeff() */
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_minCoeff>::Type minCoeff() const
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the largest coefficient
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
2937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      *
2947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \warning the result is undefined if \c *this contains NaN.
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_maxCoeff.cpp
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_maxCoeff.out
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::maxCoeff() */
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_maxCoeff>::Type maxCoeff() const
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the squared norm
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_squaredNorm.cpp
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_squaredNorm.out
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::squaredNorm() */
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_squaredNorm,RealScalar>::Type squaredNorm() const
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_norm.cpp
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_norm.out
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::norm() */
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_norm,RealScalar>::Type norm() const
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, using
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * blue's algorithm.
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::blueNorm() */
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_blueNorm,RealScalar>::Type blueNorm() const
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, avoiding
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * underflow and overflow.
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::stableNorm() */
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_stableNorm,RealScalar>::Type stableNorm() const
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, avoiding
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * underflow and overflow using a concatenation of hypot() calls.
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::hypotNorm() */
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_hypotNorm,RealScalar>::Type hypotNorm() const
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the sum
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_sum.cpp
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_sum.out
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::sum() */
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_sum>::Type sum() const
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the mean
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * of each column (or row) of the referenced expression.
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    *
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \sa DenseBase::mean() */
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_mean>::Type mean() const
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * whether \b all coefficients of each respective column (or row) are \c true.
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::all() */
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_all>::Type all() const
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * whether \b at \b least one coefficient of each respective column (or row) is \c true.
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::any() */
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_any>::Type any() const
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * the number of \c true coefficients of each respective column (or row).
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_count.cpp
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_count.out
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::count() */
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> count() const
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the product
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_prod.cpp
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_prod.out
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::prod() */
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_prod>::Type prod() const
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a matrix expression
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * where each column (or row) are reversed.
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include Vectorwise_reverse.cpp
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude Vectorwise_reverse.out
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::reverse() */
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Reverse<ExpressionType, Direction> reverse() const
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return Reverse<ExpressionType, Direction>( _expression() ); }
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Replicate<ExpressionType,Direction==Vertical?Dynamic:1,Direction==Horizontal?Dynamic:1> ReplicateReturnType;
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ReplicateReturnType replicate(Index factor) const;
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /**
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \return an expression of the replication of each column (or row) of \c *this
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include DirectionWise_replicate.cpp
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude DirectionWise_replicate.out
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // NOTE implemented here because of sunstudio's compilation errors
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Factor> const Replicate<ExpressionType,(IsVertical?Factor:1),(IsHorizontal?Factor:1)>
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    replicate(Index factor = Factor) const
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Replicate<ExpressionType,Direction==Vertical?Factor:1,Direction==Horizontal?Factor:1>
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Artithmetic operators ///////////
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Copies the vector \a other to each subvector of \c *this */
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator=(const DenseBase<OtherDerived>& other)
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived()));
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Adds the vector \a other to each subvector of \c *this */
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator+=(const DenseBase<OtherDerived>& other)
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived()));
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Substracts the vector \a other to each subvector of \c *this */
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator-=(const DenseBase<OtherDerived>& other)
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived()));
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Multiples each subvector of \c *this by the vector \a other */
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator*=(const DenseBase<OtherDerived>& other)
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix *= extendedTo(other.derived());
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix);
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Divides each subvector of \c *this by the vector \a other */
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator/=(const DenseBase<OtherDerived>& other)
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix /= extendedTo(other.derived());
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix);
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> EIGEN_STRONG_INLINE
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator+(const DenseBase<OtherDerived>& other) const
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix + extendedTo(other.derived());
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression of the difference between each subvector of \c *this and the vector \a other */
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_difference_op<Scalar>,
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator-(const DenseBase<OtherDerived>& other) const
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix - extendedTo(other.derived());
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression where each subvector is the product of the vector \a other
508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * by the corresponding subvector of \c *this */
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> EIGEN_STRONG_INLINE
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_product_op<Scalar>,
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const DenseBase<OtherDerived>& other) const
514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix * extendedTo(other.derived());
519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression where each subvector is the quotient of the corresponding
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * subvector of \c *this by the vector \a other */
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator/(const DenseBase<OtherDerived>& other) const
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix / extendedTo(other.derived());
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
5347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** \returns an expression where each column of row of the referenced matrix are normalized.
5367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * The referenced matrix is \b not modified.
5377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa MatrixBase::normalized(), normalize()
5387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      */
5397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
5407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                  const ExpressionTypeNestedCleaned,
5417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                  const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type>
5427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); }
5437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** Normalize in-place each row or columns of the referenced matrix.
5467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa MatrixBase::normalize(), normalized()
5477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      */
5487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void normalize() {
5497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_matrix = this->normalized();
5507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Geometry module ///////////
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Homogeneous<ExpressionType,Direction> homogeneous() const;
556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::PlainObject CrossReturnType;
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                             : internal::traits<ExpressionType>::ColsAtCompileTime,
565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1
566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const ExpressionType,
568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? int(HNormalized_SizeMinusOne)
569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                        : int(internal::traits<ExpressionType>::RowsAtCompileTime),
570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? int(HNormalized_SizeMinusOne)
571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                        : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalized_Block;
573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const ExpressionType,
574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalized_Factors;
577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const HNormalized_Block,
579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Replicate<HNormalized_Factors,
580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >
582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalizedReturnType;
583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const HNormalizedReturnType hnormalized() const;
585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionTypeNested m_matrix;
588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_colwise.cpp
593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_colwise.out
594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename DenseBase<Derived>::ConstColwiseReturnType
599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::colwise() const
600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::ColwiseReturnType
610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::colwise()
611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_rowwise.cpp
618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_rowwise.out
619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename DenseBase<Derived>::ConstRowwiseReturnType
624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::rowwise() const
625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::RowwiseReturnType
635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::rowwise()
636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_PARTIAL_REDUX_H
643