| 1 | |
| 2 | /** \returns an expression of the coefficient wise product of \c *this and \a other |
| 3 | * |
| 4 | * \sa MatrixBase::cwiseProduct |
| 5 | */ |
| 6 | template<typename OtherDerived> |
| 7 | EIGEN_DEVICE_FUNC |
| 8 | EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,product) |
| 9 | operator*(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const |
| 10 | { |
| 11 | return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,product)(derived(), other.derived()); |
| 12 | } |
| 13 | |
| 14 | /** \returns an expression of the coefficient wise quotient of \c *this and \a other |
| 15 | * |
| 16 | * \sa MatrixBase::cwiseQuotient |
| 17 | */ |
| 18 | template<typename OtherDerived> |
| 19 | EIGEN_DEVICE_FUNC |
| 20 | EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar,typename OtherDerived::Scalar>, const Derived, const OtherDerived> |
| 21 | operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const |
| 22 | { |
| 23 | return CwiseBinaryOp<internal::scalar_quotient_op<Scalar,typename OtherDerived::Scalar>, const Derived, const OtherDerived>(derived(), other.derived()); |
| 24 | } |
| 25 | |
| 26 | /** \returns an expression of the coefficient-wise min of \c *this and \a other |
| 27 | * |
| 28 | * Example: \include Cwise_min.cpp |
| 29 | * Output: \verbinclude Cwise_min.out |
| 30 | * |
| 31 | * \sa max() |
| 32 | */ |
| 33 | EIGEN_MAKE_CWISE_BINARY_OP(min,min) |
| 34 | |
| 35 | /** \returns an expression of the coefficient-wise min of \c *this and scalar \a other |
| 36 | * |
| 37 | * \sa max() |
| 38 | */ |
| 39 | EIGEN_DEVICE_FUNC |
| 40 | EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar>, const Derived, |
| 41 | const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> > |
| 42 | #ifdef EIGEN_PARSED_BY_DOXYGEN |
| 43 | min |
| 44 | #else |
| 45 | (min) |
| 46 | #endif |
| 47 | (const Scalar &other) const |
| 48 | { |
| 49 | return (min)(Derived::PlainObject::Constant(rows(), cols(), other)); |
| 50 | } |
| 51 | |
| 52 | /** \returns an expression of the coefficient-wise max of \c *this and \a other |
| 53 | * |
| 54 | * Example: \include Cwise_max.cpp |
| 55 | * Output: \verbinclude Cwise_max.out |
| 56 | * |
| 57 | * \sa min() |
| 58 | */ |
| 59 | EIGEN_MAKE_CWISE_BINARY_OP(max,max) |
| 60 | |
| 61 | /** \returns an expression of the coefficient-wise max of \c *this and scalar \a other |
| 62 | * |
| 63 | * \sa min() |
| 64 | */ |
| 65 | EIGEN_DEVICE_FUNC |
| 66 | EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar>, const Derived, |
| 67 | const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> > |
| 68 | #ifdef EIGEN_PARSED_BY_DOXYGEN |
| 69 | max |
| 70 | #else |
| 71 | (max) |
| 72 | #endif |
| 73 | (const Scalar &other) const |
| 74 | { |
| 75 | return (max)(Derived::PlainObject::Constant(rows(), cols(), other)); |
| 76 | } |
| 77 | |
| 78 | /** \returns an expression of the coefficient-wise power of \c *this to the given array of \a exponents. |
| 79 | * |
| 80 | * This function computes the coefficient-wise power. |
| 81 | * |
| 82 | * Example: \include Cwise_array_power_array.cpp |
| 83 | * Output: \verbinclude Cwise_array_power_array.out |
| 84 | */ |
| 85 | EIGEN_MAKE_CWISE_BINARY_OP(pow,pow) |
| 86 | |
| 87 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 88 | EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(pow,pow) |
| 89 | #else |
| 90 | /** \returns an expression of the coefficients of \c *this rasied to the constant power \a exponent |
| 91 | * |
| 92 | * \tparam T is the scalar type of \a exponent. It must be compatible with the scalar type of the given expression. |
| 93 | * |
| 94 | * This function computes the coefficient-wise power. The function MatrixBase::pow() in the |
| 95 | * unsupported module MatrixFunctions computes the matrix power. |
| 96 | * |
| 97 | * Example: \include Cwise_pow.cpp |
| 98 | * Output: \verbinclude Cwise_pow.out |
| 99 | * |
| 100 | * \sa ArrayBase::pow(ArrayBase), square(), cube(), exp(), log() |
| 101 | */ |
| 102 | template<typename T> |
| 103 | const CwiseBinaryOp<internal::scalar_pow_op<Scalar,T>,Derived,Constant<T> > pow(const T& exponent) const; |
| 104 | #endif |
| 105 | |
| 106 | |
| 107 | // TODO code generating macros could be moved to Macros.h and could include generation of documentation |
| 108 | #define EIGEN_MAKE_CWISE_COMP_OP(OP, COMPARATOR) \ |
| 109 | template<typename OtherDerived> \ |
| 110 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const OtherDerived> \ |
| 111 | OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \ |
| 112 | { \ |
| 113 | return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const OtherDerived>(derived(), other.derived()); \ |
| 114 | }\ |
| 115 | typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar,Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> > Cmp ## COMPARATOR ## ReturnType; \ |
| 116 | typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar,Scalar, internal::cmp_ ## COMPARATOR>, const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject>, const Derived > RCmp ## COMPARATOR ## ReturnType; \ |
| 117 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Cmp ## COMPARATOR ## ReturnType \ |
| 118 | OP(const Scalar& s) const { \ |
| 119 | return this->OP(Derived::PlainObject::Constant(rows(), cols(), s)); \ |
| 120 | } \ |
| 121 | EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE const RCmp ## COMPARATOR ## ReturnType \ |
| 122 | OP(const Scalar& s, const Derived& d) { \ |
| 123 | return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d); \ |
| 124 | } |
| 125 | |
| 126 | #define EIGEN_MAKE_CWISE_COMP_R_OP(OP, R_OP, RCOMPARATOR) \ |
| 127 | template<typename OtherDerived> \ |
| 128 | EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, const OtherDerived, const Derived> \ |
| 129 | OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \ |
| 130 | { \ |
| 131 | return CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, const OtherDerived, const Derived>(other.derived(), derived()); \ |
| 132 | } \ |
| 133 | EIGEN_DEVICE_FUNC \ |
| 134 | inline const RCmp ## RCOMPARATOR ## ReturnType \ |
| 135 | OP(const Scalar& s) const { \ |
| 136 | return Derived::PlainObject::Constant(rows(), cols(), s).R_OP(*this); \ |
| 137 | } \ |
| 138 | friend inline const Cmp ## RCOMPARATOR ## ReturnType \ |
| 139 | OP(const Scalar& s, const Derived& d) { \ |
| 140 | return d.R_OP(Derived::PlainObject::Constant(d.rows(), d.cols(), s)); \ |
| 141 | } |
| 142 | |
| 143 | |
| 144 | |
| 145 | /** \returns an expression of the coefficient-wise \< operator of *this and \a other |
| 146 | * |
| 147 | * Example: \include Cwise_less.cpp |
| 148 | * Output: \verbinclude Cwise_less.out |
| 149 | * |
| 150 | * \sa all(), any(), operator>(), operator<=() |
| 151 | */ |
| 152 | EIGEN_MAKE_CWISE_COMP_OP(operator<, LT) |
| 153 | |
| 154 | /** \returns an expression of the coefficient-wise \<= operator of *this and \a other |
| 155 | * |
| 156 | * Example: \include Cwise_less_equal.cpp |
| 157 | * Output: \verbinclude Cwise_less_equal.out |
| 158 | * |
| 159 | * \sa all(), any(), operator>=(), operator<() |
| 160 | */ |
| 161 | EIGEN_MAKE_CWISE_COMP_OP(operator<=, LE) |
| 162 | |
| 163 | /** \returns an expression of the coefficient-wise \> operator of *this and \a other |
| 164 | * |
| 165 | * Example: \include Cwise_greater.cpp |
| 166 | * Output: \verbinclude Cwise_greater.out |
| 167 | * |
| 168 | * \sa all(), any(), operator>=(), operator<() |
| 169 | */ |
| 170 | EIGEN_MAKE_CWISE_COMP_R_OP(operator>, operator<, LT) |
| 171 | |
| 172 | /** \returns an expression of the coefficient-wise \>= operator of *this and \a other |
| 173 | * |
| 174 | * Example: \include Cwise_greater_equal.cpp |
| 175 | * Output: \verbinclude Cwise_greater_equal.out |
| 176 | * |
| 177 | * \sa all(), any(), operator>(), operator<=() |
| 178 | */ |
| 179 | EIGEN_MAKE_CWISE_COMP_R_OP(operator>=, operator<=, LE) |
| 180 | |
| 181 | /** \returns an expression of the coefficient-wise == operator of *this and \a other |
| 182 | * |
| 183 | * \warning this performs an exact comparison, which is generally a bad idea with floating-point types. |
| 184 | * In order to check for equality between two vectors or matrices with floating-point coefficients, it is |
| 185 | * generally a far better idea to use a fuzzy comparison as provided by isApprox() and |
| 186 | * isMuchSmallerThan(). |
| 187 | * |
| 188 | * Example: \include Cwise_equal_equal.cpp |
| 189 | * Output: \verbinclude Cwise_equal_equal.out |
| 190 | * |
| 191 | * \sa all(), any(), isApprox(), isMuchSmallerThan() |
| 192 | */ |
| 193 | EIGEN_MAKE_CWISE_COMP_OP(operator==, EQ) |
| 194 | |
| 195 | /** \returns an expression of the coefficient-wise != operator of *this and \a other |
| 196 | * |
| 197 | * \warning this performs an exact comparison, which is generally a bad idea with floating-point types. |
| 198 | * In order to check for equality between two vectors or matrices with floating-point coefficients, it is |
| 199 | * generally a far better idea to use a fuzzy comparison as provided by isApprox() and |
| 200 | * isMuchSmallerThan(). |
| 201 | * |
| 202 | * Example: \include Cwise_not_equal.cpp |
| 203 | * Output: \verbinclude Cwise_not_equal.out |
| 204 | * |
| 205 | * \sa all(), any(), isApprox(), isMuchSmallerThan() |
| 206 | */ |
| 207 | EIGEN_MAKE_CWISE_COMP_OP(operator!=, NEQ) |
| 208 | |
| 209 | |
| 210 | #undef EIGEN_MAKE_CWISE_COMP_OP |
| 211 | #undef EIGEN_MAKE_CWISE_COMP_R_OP |
| 212 | |
| 213 | // scalar addition |
| 214 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 215 | EIGEN_MAKE_SCALAR_BINARY_OP(operator+,sum) |
| 216 | #else |
| 217 | /** \returns an expression of \c *this with each coeff incremented by the constant \a scalar |
| 218 | * |
| 219 | * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression. |
| 220 | * |
| 221 | * Example: \include Cwise_plus.cpp |
| 222 | * Output: \verbinclude Cwise_plus.out |
| 223 | * |
| 224 | * \sa operator+=(), operator-() |
| 225 | */ |
| 226 | template<typename T> |
| 227 | const CwiseBinaryOp<internal::scalar_sum_op<Scalar,T>,Derived,Constant<T> > operator+(const T& scalar) const; |
| 228 | /** \returns an expression of \a expr with each coeff incremented by the constant \a scalar |
| 229 | * |
| 230 | * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression. |
| 231 | */ |
| 232 | template<typename T> friend |
| 233 | const CwiseBinaryOp<internal::scalar_sum_op<T,Scalar>,Constant<T>,Derived> operator+(const T& scalar, const StorageBaseType& expr); |
| 234 | #endif |
| 235 | |
| 236 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 237 | EIGEN_MAKE_SCALAR_BINARY_OP(operator-,difference) |
| 238 | #else |
| 239 | /** \returns an expression of \c *this with each coeff decremented by the constant \a scalar |
| 240 | * |
| 241 | * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression. |
| 242 | * |
| 243 | * Example: \include Cwise_minus.cpp |
| 244 | * Output: \verbinclude Cwise_minus.out |
| 245 | * |
| 246 | * \sa operator+=(), operator-() |
| 247 | */ |
| 248 | template<typename T> |
| 249 | const CwiseBinaryOp<internal::scalar_difference_op<Scalar,T>,Derived,Constant<T> > operator-(const T& scalar) const; |
| 250 | /** \returns an expression of the constant matrix of value \a scalar decremented by the coefficients of \a expr |
| 251 | * |
| 252 | * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression. |
| 253 | */ |
| 254 | template<typename T> friend |
| 255 | const CwiseBinaryOp<internal::scalar_difference_op<T,Scalar>,Constant<T>,Derived> operator-(const T& scalar, const StorageBaseType& expr); |
| 256 | #endif |
| 257 | |
| 258 | |
| 259 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
| 260 | EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(operator/,quotient) |
| 261 | #else |
| 262 | /** |
| 263 | * \brief Component-wise division of the scalar \a s by array elements of \a a. |
| 264 | * |
| 265 | * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression (\c Derived::Scalar). |
| 266 | */ |
| 267 | template<typename T> friend |
| 268 | inline const CwiseBinaryOp<internal::scalar_quotient_op<T,Scalar>,Constant<T>,Derived> |
| 269 | operator/(const T& s,const StorageBaseType& a); |
| 270 | #endif |
| 271 | |
| 272 | /** \returns an expression of the coefficient-wise ^ operator of *this and \a other |
| 273 | * |
| 274 | * \warning this operator is for expression of bool only. |
| 275 | * |
| 276 | * Example: \include Cwise_boolean_xor.cpp |
| 277 | * Output: \verbinclude Cwise_boolean_xor.out |
| 278 | * |
| 279 | * \sa operator&&(), select() |
| 280 | */ |
| 281 | template<typename OtherDerived> |
| 282 | EIGEN_DEVICE_FUNC |
| 283 | inline const CwiseBinaryOp<internal::scalar_boolean_xor_op, const Derived, const OtherDerived> |
| 284 | operator^(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const |
| 285 | { |
| 286 | EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value), |
| 287 | THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL); |
| 288 | return CwiseBinaryOp<internal::scalar_boolean_xor_op, const Derived, const OtherDerived>(derived(),other.derived()); |
| 289 | } |
| 290 | |
| 291 | // NOTE disabled until we agree on argument order |
| 292 | #if 0 |
| 293 | /** \cpp11 \returns an expression of the coefficient-wise polygamma function. |
| 294 | * |
| 295 | * \specialfunctions_module |
| 296 | * |
| 297 | * It returns the \a n -th derivative of the digamma(psi) evaluated at \c *this. |
| 298 | * |
| 299 | * \warning Be careful with the order of the parameters: x.polygamma(n) is equivalent to polygamma(n,x) |
| 300 | * |
| 301 | * \sa Eigen::polygamma() |
| 302 | */ |
| 303 | template<typename DerivedN> |
| 304 | inline const CwiseBinaryOp<internal::scalar_polygamma_op<Scalar>, const DerivedN, const Derived> |
| 305 | polygamma(const EIGEN_CURRENT_STORAGE_BASE_CLASS<DerivedN> &n) const |
| 306 | { |
| 307 | return CwiseBinaryOp<internal::scalar_polygamma_op<Scalar>, const DerivedN, const Derived>(n.derived(), this->derived()); |
| 308 | } |
| 309 | #endif |
| 310 | |
| 311 | /** \returns an expression of the coefficient-wise zeta function. |
| 312 | * |
| 313 | * \specialfunctions_module |
| 314 | * |
| 315 | * It returns the Riemann zeta function of two arguments \c *this and \a q: |
| 316 | * |
| 317 | * \param *this is the exposent, it must be > 1 |
| 318 | * \param q is the shift, it must be > 0 |
| 319 | * |
| 320 | * \note This function supports only float and double scalar types. To support other scalar types, the user has |
| 321 | * to provide implementations of zeta(T,T) for any scalar type T to be supported. |
| 322 | * |
| 323 | * This method is an alias for zeta(*this,q); |
| 324 | * |
| 325 | * \sa Eigen::zeta() |
| 326 | */ |
| 327 | template<typename DerivedQ> |
| 328 | inline const CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ> |
| 329 | zeta(const EIGEN_CURRENT_STORAGE_BASE_CLASS<DerivedQ> &q) const |
| 330 | { |
| 331 | return CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ>(this->derived(), q.derived()); |
| 332 | } |
| 333 | |