GlobalFunctions.h
Go to the documentation of this file.
00001 // This file is part of Eigen, a lightweight C++ template library
00002 // for linear algebra.
00003 //
00004 // Copyright (C) 2010-2012 Gael Guennebaud <gael.guennebaud@inria.fr>
00005 // Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>
00006 //
00007 // This Source Code Form is subject to the terms of the Mozilla
00008 // Public License v. 2.0. If a copy of the MPL was not distributed
00009 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
00010 
00011 #ifndef EIGEN_GLOBAL_FUNCTIONS_H
00012 #define EIGEN_GLOBAL_FUNCTIONS_H
00013 
00014 #define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR) \
00015   template<typename Derived> \
00016   inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \
00017   NAME(const Eigen::ArrayBase<Derived>& x) { \
00018     return x.derived(); \
00019   }
00020 
00021 #define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME,FUNCTOR) \
00022   \
00023   template<typename Derived> \
00024   struct NAME##_retval<ArrayBase<Derived> > \
00025   { \
00026     typedef const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> type; \
00027   }; \
00028   template<typename Derived> \
00029   struct NAME##_impl<ArrayBase<Derived> > \
00030   { \
00031     static inline typename NAME##_retval<ArrayBase<Derived> >::type run(const Eigen::ArrayBase<Derived>& x) \
00032     { \
00033       return x.derived(); \
00034     } \
00035   };
00036 
00037 
00038 namespace Eigen
00039 {
00040   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real,scalar_real_op)
00041   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag,scalar_imag_op)
00042   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(conj,scalar_conjugate_op)
00043   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin,scalar_sin_op)
00044   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos,scalar_cos_op)
00045   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin,scalar_asin_op)
00046   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos,scalar_acos_op)
00047   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan,scalar_tan_op)
00048   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op)
00049   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op)
00050   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op)
00051   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op)
00052   
00053   template<typename Derived>
00054   inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar>, const Derived>
00055   pow(const Eigen::ArrayBase<Derived>& x, const typename Derived::Scalar& exponent) {
00056     return x.derived().pow(exponent);
00057   }
00058 
00059   template<typename Derived>
00060   inline const Eigen::CwiseBinaryOp<Eigen::internal::scalar_binary_pow_op<typename Derived::Scalar, typename Derived::Scalar>, const Derived, const Derived>
00061   pow(const Eigen::ArrayBase<Derived>& x, const Eigen::ArrayBase<Derived>& exponents) 
00062   {
00063     return Eigen::CwiseBinaryOp<Eigen::internal::scalar_binary_pow_op<typename Derived::Scalar, typename Derived::Scalar>, const Derived, const Derived>(
00064       x.derived(),
00065       exponents.derived()
00066     );
00067   }
00068   
00072   template <typename Derived>
00073   inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>
00074     operator/(const typename Derived::Scalar& s, const Eigen::ArrayBase<Derived>& a)
00075   {
00076     return Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>(
00077       a.derived(),
00078       Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>(s)  
00079     );
00080   }
00081 
00082   namespace internal
00083   {
00084     EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real,scalar_real_op)
00085     EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op)
00086     EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2,scalar_abs2_op)
00087   }
00088 }
00089 
00090 // TODO: cleanly disable those functions that are not supported on Array (numext::real_ref, internal::random, internal::isApprox...)
00091 
00092 #endif // EIGEN_GLOBAL_FUNCTIONS_H


acado
Author(s): Milan Vukov, Rien Quirynen
autogenerated on Sat Jun 8 2019 19:37:14