operator_cube_minus.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2010 NICTA and the authors listed below
00002 // http://nicta.com.au
00003 // 
00004 // Authors:
00005 // - Conrad Sanderson (conradsand at ieee dot org)
00006 // 
00007 // This file is part of the Armadillo C++ library.
00008 // It is provided without any warranty of fitness
00009 // for any purpose. You can redistribute this file
00010 // and/or modify it under the terms of the GNU
00011 // Lesser General Public License (LGPL) as published
00012 // by the Free Software Foundation, either version 3
00013 // of the License or (at your option) any later version.
00014 // (see http://www.opensource.org/licenses for more info)
00015 
00016 
00017 //! \addtogroup operator_cube_minus
00018 //! @{
00019 
00020 
00021 
00022 //! unary -
00023 template<typename T1>
00024 arma_inline
00025 const eOpCube<T1, eop_cube_neg>
00026 operator-
00027   (
00028   const BaseCube<typename T1::elem_type,T1>& X
00029   )
00030   {
00031   arma_extra_debug_sigprint();
00032   
00033   return eOpCube<T1, eop_cube_neg>(X.get_ref());
00034   }
00035 
00036 
00037 
00038 //! cancellation of two consecutive negations: -(-T1)
00039 template<typename T1>
00040 arma_inline
00041 const T1&
00042 operator-
00043   (
00044   const eOpCube<T1, eop_cube_neg>& X
00045   )
00046   {
00047   arma_extra_debug_sigprint();
00048   
00049   return X.m;
00050   }
00051 
00052 
00053 
00054 //! BaseCube - scalar
00055 template<typename T1>
00056 arma_inline
00057 const eOpCube<T1, eop_cube_scalar_minus_post>
00058 operator-
00059   (
00060   const BaseCube<typename T1::elem_type,T1>& X,
00061   const typename T1::elem_type               k
00062   )
00063   {
00064   arma_extra_debug_sigprint();
00065   
00066   return eOpCube<T1, eop_cube_scalar_minus_post>(X.get_ref(), k);
00067   }
00068 
00069 
00070 
00071 //! scalar - BaseCube
00072 template<typename T1>
00073 arma_inline
00074 const eOpCube<T1, eop_cube_scalar_minus_pre>
00075 operator-
00076   (
00077   const typename T1::elem_type               k,
00078   const BaseCube<typename T1::elem_type,T1>& X
00079   )
00080   {
00081   arma_extra_debug_sigprint();
00082   
00083   return eOpCube<T1, eop_cube_scalar_minus_pre>(X.get_ref(), k);
00084   }
00085 
00086 
00087 
00088 //! subtraction of BaseCube objects with same element type
00089 template<typename T1, typename T2>
00090 arma_inline
00091 const eGlueCube<T1, T2, eglue_cube_minus>
00092 operator-
00093   (
00094   const BaseCube<typename T1::elem_type,T1>& X,
00095   const BaseCube<typename T1::elem_type,T2>& Y
00096   )
00097   {
00098   arma_extra_debug_sigprint();
00099   
00100   return eGlueCube<T1, T2, eglue_cube_minus>(X.get_ref(), Y.get_ref());
00101   }
00102 
00103 
00104 
00105 //! subtraction of Base objects with different element types
00106 template<typename T1, typename T2>
00107 arma_inline
00108 Cube<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result>
00109 operator-
00110   (
00111   const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T1_result, T1>& X,
00112   const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T2_result, T2>& Y
00113   )
00114   {
00115   arma_extra_debug_sigprint();
00116   
00117   typedef typename T1::elem_type eT1;
00118   typedef typename T2::elem_type eT2;
00119   
00120   typedef typename promote_type<eT1,eT2>::result out_eT;
00121   
00122   promote_type<eT1,eT2>::check();
00123   
00124   const ProxyCube<T1> A(X.get_ref());
00125   const ProxyCube<T2> B(Y.get_ref());
00126   
00127   arma_debug_assert_same_size(A, B, "cube subtraction");
00128   
00129   Cube<out_eT> out(A.n_rows, A.n_cols, A.n_slices);
00130 
00131         out_eT* out_mem = out.memptr();
00132   const u32     n_elem  = out.n_elem;
00133   
00134   for(u32 i=0; i<n_elem; ++i)
00135     {
00136     out_mem[i] = upgrade_val<eT1,eT2>::apply(A[i]) - upgrade_val<eT1,eT2>::apply(B[i]);
00137     }
00138   
00139   return out;
00140   }
00141 
00142 
00143 
00144 //! @}