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 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 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_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CWISE_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * convenient macro to defined the return type of a cwise binary operation */
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CWISE_BINOP_RETURN_TYPE(OP) \
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType, OtherDerived>
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * convenient macro to defined the return type of a cwise unary operation */
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CWISE_UNOP_RETURN_TYPE(OP) \
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseUnaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType>
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * convenient macro to defined the return type of a cwise comparison to a scalar */
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(OP) \
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType, \
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        typename ExpressionType::ConstantReturnType >
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class Cwise
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Pseudo expression providing additional coefficient-wise operations
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param ExpressionType the type of the object on which to do coefficient-wise operations
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents an expression with additional coefficient-wise features.
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of MatrixBase::cwise()
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_cwise_const.cpp
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_cwise_const.out
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class can be extended with the help of the plugin mechanism described on the page
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_CWISE_PLUGIN.
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa MatrixBase::cwise() const, MatrixBase::cwise()
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class Cwise
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<ExpressionType>::Scalar Scalar;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        ExpressionType, const ExpressionType&>::type ExpressionTypeNested;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseUnaryOp<internal::scalar_add_op<Scalar>, ExpressionType> ScalarAddReturnType;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Cwise(const ExpressionType& matrix) : m_matrix(matrix) {}
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal */
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const ExpressionType& _expression() const { return m_matrix; }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const MatrixBase<OtherDerived> &other) const;
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator/(const MatrixBase<OtherDerived> &other) const;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \deprecated ArrayBase::min() */
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_min_op)
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    (min)(const MatrixBase<OtherDerived> &other) const
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_min_op)(_expression(), other.derived()); }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \deprecated ArrayBase::max() */
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_max_op)
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    (max)(const MatrixBase<OtherDerived> &other) const
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_max_op)(_expression(), other.derived()); }
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs_op)      abs() const;
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs2_op)     abs2() const;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_square_op)   square() const;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cube_op)     cube() const;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_inverse_op)  inverse() const;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sqrt_op)     sqrt() const;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_exp_op)      exp() const;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_log_op)      log() const;
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cos_op)      cos() const;
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sin_op)      sin() const;
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)      pow(const Scalar& exponent) const;
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ScalarAddReturnType
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator+(const Scalar& scalar) const;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \relates Cwise */
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    friend const ScalarAddReturnType
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator+(const Scalar& scalar, const Cwise& mat)
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return mat + scalar; }
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator+=(const Scalar& scalar);
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ScalarAddReturnType
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator-(const Scalar& scalar) const;
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator-=(const Scalar& scalar);
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ExpressionType& operator*=(const MatrixBase<OtherDerived> &other);
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ExpressionType& operator/=(const MatrixBase<OtherDerived> &other);
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator<(const MatrixBase<OtherDerived>& other) const;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator<=(const MatrixBase<OtherDerived>& other) const;
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator>(const MatrixBase<OtherDerived>& other) const;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator>=(const MatrixBase<OtherDerived>& other) const;
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator==(const MatrixBase<OtherDerived>& other) const;
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator!=(const MatrixBase<OtherDerived>& other) const;
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // comparisons to a scalar value
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator<(Scalar s) const;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator<=(Scalar s) const;
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator>(Scalar s) const;
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator>=(Scalar s) const;
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator==(Scalar s) const;
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator!=(Scalar s) const;
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // allow to extend Cwise outside Eigen
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_CWISE_PLUGIN
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #include EIGEN_CWISE_PLUGIN
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionTypeNested m_matrix;
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a Cwise wrapper of *this providing additional coefficient-wise operations
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_cwise_const.cpp
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_cwise_const.out
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Cwise, cwise()
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Cwise<Derived> MatrixBase<Derived>::cwise() const
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a Cwise wrapper of *this providing additional coefficient-wise operations
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_cwise.cpp
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_cwise.out
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Cwise, cwise() const
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline Cwise<Derived> MatrixBase<Derived>::cwise()
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_CWISE_H
193