Chris@49: // Copyright (C) 2008-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2013 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup fn_elem Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // find Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOp Chris@49: find(const Base& X, const uword k = 0, const char* direction = "first") Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const char sig = direction[0]; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: (sig != 'f' && sig != 'F' && sig != 'l' && sig != 'L'), Chris@49: "find(): 3rd input argument must be \"first\" or \"last\"" Chris@49: ); Chris@49: Chris@49: const uword type = (sig == 'f' || sig == 'F') ? 0 : 1; Chris@49: Chris@49: return mtOp(X.get_ref(), k, type); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // real Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const T1& Chris@49: real(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return X.get_ref(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const T1& Chris@49: real(const BaseCube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return X.get_ref(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOp Chris@49: real(const Base, T1>& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return mtOp( X.get_ref() ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOpCube Chris@49: real(const BaseCube, T1>& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return mtOpCube( X.get_ref() ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // imag Chris@49: Chris@49: template Chris@49: inline Chris@49: const Gen< Mat, gen_zeros > Chris@49: imag(const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const Proxy A(X.get_ref()); Chris@49: Chris@49: return Gen< Mat, gen_zeros>(A.get_n_rows(), A.get_n_cols()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const GenCube Chris@49: imag(const BaseCube& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const ProxyCube A(X.get_ref()); Chris@49: Chris@49: return GenCube(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOp Chris@49: imag(const Base, T1>& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return mtOp( X.get_ref() ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOpCube Chris@49: imag(const BaseCube,T1>& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return mtOpCube( X.get_ref() ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // log Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: log(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: log(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // log2 Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: log2(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: log2(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // log10 Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: log10(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: log10(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // exp Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: exp(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: exp(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // exp2 Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: exp2(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: exp2(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // exp10 Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: exp10(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: exp10(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // abs Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: abs(const T1& X, const typename arma_not_cx::result* junk = 0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_ignore(junk); Chris@49: Chris@49: return eOp(X); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: abs(const BaseCube& X, const typename arma_not_cx::result* junk = 0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_ignore(junk); Chris@49: Chris@49: return eOpCube(X.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOp Chris@49: abs(const Base, T1>& X, const typename arma_cx_only::result* junk = 0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_ignore(junk); Chris@49: Chris@49: return mtOp( X.get_ref() ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const mtOpCube Chris@49: abs(const BaseCube< std::complex,T1>& X, const typename arma_cx_only::result* junk = 0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_ignore(junk); Chris@49: Chris@49: return mtOpCube( X.get_ref() ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const SpOp Chris@49: abs(const SpBase& X, const typename arma_not_cx::result* junk = 0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: return SpOp(X.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const mtSpOp Chris@49: abs(const SpBase< std::complex, T1>& X, const typename arma_cx_only::result* junk = 0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: return mtSpOp(X.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // square Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: square(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: square(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const SpOp Chris@49: square(const SpBase& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return SpOp(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // sqrt Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: sqrt(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: sqrt(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const SpOp Chris@49: sqrt(const SpBase& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return SpOp(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // conj Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const T1& Chris@49: conj(const Base& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return A.get_ref(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const T1& Chris@49: conj(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return A.get_ref(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOp Chris@49: conj(const Base,T1>& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: conj(const BaseCube,T1>& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const T1& Chris@49: conj(const eOp& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return A.m; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const T1& Chris@49: conj(const eOpCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return A.m; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // TODO: this needs a more elaborate template restriction mechanism to work properly, Chris@49: // i.e. an overloaded version of thus function should do nothing if the input type is non-complex Chris@49: // Chris@49: // //! the conjugate of the transpose of a complex matrix is the same as the hermitian transpose Chris@49: // template Chris@49: // arma_inline Chris@49: // const Op Chris@49: // conj(const Op& A) Chris@49: // { Chris@49: // arma_extra_debug_sigprint(); Chris@49: // Chris@49: // return Op(A.m); Chris@49: // } Chris@49: Chris@49: Chris@49: Chris@49: // pow Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOp Chris@49: pow(const Base& A, const typename T1::elem_type exponent) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A.get_ref(), exponent); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: pow(const BaseCube& A, const typename T1::elem_type exponent) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref(), exponent); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // pow, specialised handling (non-complex exponent for complex matrices) Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOp Chris@49: pow(const Base& A, const typename T1::elem_type::value_type exponent) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: return eOp(A.get_ref(), eT(exponent)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: pow(const BaseCube& A, const typename T1::elem_type::value_type exponent) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: return eOpCube(A.get_ref(), eT(exponent)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // floor Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: floor(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: floor(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // ceil Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: ceil(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: ceil(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // round Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: typename enable_if2< is_arma_type::value, const eOp >::result Chris@49: round(const T1& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOp(A); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eOpCube Chris@49: round(const BaseCube& A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: return eOpCube(A.get_ref()); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}