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-2009 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// This file is a base class plugin containing common coefficient wise functions. 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal the return type of conjugate() */ 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef typename internal::conditional<NumTraits<Scalar>::IsComplex, 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>, 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Derived& 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type ConjugateReturnType; 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal the return type of real() const */ 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef typename internal::conditional<NumTraits<Scalar>::IsComplex, 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>, 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Derived& 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type RealReturnType; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal the return type of real() */ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef typename internal::conditional<NumTraits<Scalar>::IsComplex, 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>, 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type NonConstRealReturnType; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal the return type of imag() const */ 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef CwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived> ImagReturnType; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal the return type of imag() */ 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef CwiseUnaryView<internal::scalar_imag_ref_op<Scalar>, Derived> NonConstImagReturnType; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtypedef CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived> NegativeReturnType; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // not EIGEN_PARSED_BY_DOXYGEN 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns an expression of the opposite of \c *this 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(operator-,opposite) 422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const NegativeReturnType 452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangoperator-() const { return NegativeReturnType(derived()); } 462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<class NewType> struct CastXpr { typedef typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<Scalar, NewType>, const Derived> >::type Type; }; 492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns an expression of \c *this with the \a Scalar type casted to 512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \a NewScalar. 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// The template parameter \a NewScalar is the type we are casting the scalars to. 542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(cast,conversion function) 562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa class CwiseUnaryOp 582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename NewType> 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtypename CastXpr<NewType>::Type 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathcast() const 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return typename CastXpr<NewType>::Type(derived()); 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns an expression of the complex conjugate of \c *this. 682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate) 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_conj">Math functions</a>, MatrixBase::adjoint() 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline ConjugateReturnType 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconjugate() const 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ConjugateReturnType(derived()); 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns a read-only expression of the real part of \c *this. 802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(real,real part function) 822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa imag() 842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline RealReturnType 862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangreal() const { return RealReturnType(derived()); } 872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns an read-only expression of the imaginary part of \c *this. 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(imag,imaginary part function) 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa real() 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const ImagReturnType 952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangimag() const { return ImagReturnType(derived()); } 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \brief Apply a unary operator coefficient-wise 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \param[in] func Functor implementing the unary operator 992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \tparam CustomUnaryOp Type of \a func 1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns An expression of a custom coefficient-wise unary operator \a func of *this 1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// The function \c ptr_fun() from the C++ standard library can be used to make functors out of normal functions. 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Example: 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \include class_CwiseUnaryOp_ptrfun.cpp 1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Output: \verbinclude class_CwiseUnaryOp_ptrfun.out 1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Genuine functors allow for more possibilities, for instance it may contain a state. 1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Example: 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \include class_CwiseUnaryOp.cpp 1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Output: \verbinclude class_CwiseUnaryOp.out 1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(unaryExpr,unary function) 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa unaryViewExpr, binaryExpr, class CwiseUnaryOp 1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename CustomUnaryOp> 1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const CwiseUnaryOp<CustomUnaryOp, const Derived> 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathunaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return CwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns an expression of a custom coefficient-wise unary operator \a func of *this 1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// The template parameter \a CustomUnaryOp is the type of the functor 1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// of the custom unary operator. 1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Example: 1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \include class_CwiseUnaryOp.cpp 1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// Output: \verbinclude class_CwiseUnaryOp.out 1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(unaryViewExpr,unary function) 1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa unaryExpr, binaryExpr class CwiseUnaryOp 1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename CustomViewOp> 1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const CwiseUnaryView<CustomViewOp, const Derived> 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathunaryViewExpr(const CustomViewOp& func = CustomViewOp()) const 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return CwiseUnaryView<CustomViewOp, const Derived>(derived(), func); 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns a non const expression of the real part of \c *this. 1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(real,real part function) 1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa imag() 1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline NonConstRealReturnType 1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangreal() { return NonConstRealReturnType(derived()); } 1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \returns a non const expression of the imaginary part of \c *this. 1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DOC_UNARY_ADDONS(imag,imaginary part function) 1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// 1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/// \sa real() 1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline NonConstImagReturnType 1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangimag() { return NonConstImagReturnType(derived()); } 164