Cube_bones.hpp
Go to the documentation of this file.
00001 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au)
00002 // Copyright (C) 2008-2011 Conrad Sanderson
00003 // 
00004 // This file is part of the Armadillo C++ library.
00005 // It is provided without any warranty of fitness
00006 // for any purpose. You can redistribute this file
00007 // and/or modify it under the terms of the GNU
00008 // Lesser General Public License (LGPL) as published
00009 // by the Free Software Foundation, either version 3
00010 // of the License or (at your option) any later version.
00011 // (see http://www.opensource.org/licenses for more info)
00012 
00013 
00016 
00017 
00018 
00019 struct Cube_prealloc
00020   {
00021   static const uword mat_ptrs_size = 4;
00022   static const uword mem_n_elem    = 64;
00023   };
00024 
00025 
00026 
00028 
00029 template<typename eT>
00030 class Cube : public BaseCube< eT, Cube<eT> >
00031   {
00032   public:
00033   
00034   typedef eT                                elem_type; 
00035   typedef typename get_pod_type<eT>::result pod_type;  
00036   
00037   const uword  n_rows;       
00038   const uword  n_cols;       
00039   const uword  n_elem_slice; 
00040   const uword  n_slices;     
00041   const uword  n_elem;       
00042   const uword  mem_state;
00043   
00044   // mem_state = 0: normal cube that can be resized; 
00045   // mem_state = 1: use auxiliary memory until change in the number of elements is requested;  
00046   // mem_state = 2: use auxiliary memory and don't allow the number of elements to be changed; 
00047   // mem_state = 3: fixed size (e.g. via template based size specification).
00048   
00049   
00050   arma_aligned const Mat<eT>** const mat_ptrs; 
00051   arma_aligned const eT*       const mem;      
00052   
00053   protected:
00054   arma_aligned Mat<eT>* mat_ptrs_local[ Cube_prealloc::mat_ptrs_size ];
00055   arma_aligned eT            mem_local[ Cube_prealloc::mem_n_elem    ];
00056   
00057   
00058   public:
00059   
00060   inline ~Cube();
00061   inline  Cube();
00062   
00063   inline Cube(const uword in_rows, const uword in_cols, const uword in_slices);
00064   
00065   inline Cube(      eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices, const bool copy_aux_mem = true, const bool strict = true);
00066   inline Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices);
00067   
00068   arma_inline const Cube&  operator=(const eT val);
00069   arma_inline const Cube& operator+=(const eT val);
00070   arma_inline const Cube& operator-=(const eT val);
00071   arma_inline const Cube& operator*=(const eT val);
00072   arma_inline const Cube& operator/=(const eT val);
00073   
00074   inline                   Cube(const Cube& m);
00075   inline const Cube&  operator=(const Cube& m);
00076   inline const Cube& operator+=(const Cube& m);
00077   inline const Cube& operator-=(const Cube& m);
00078   inline const Cube& operator%=(const Cube& m);
00079   inline const Cube& operator/=(const Cube& m);
00080   
00081   template<typename T1, typename T2>
00082   inline explicit Cube(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B);
00083   
00084   inline                   Cube(const subview_cube<eT>& X);
00085   inline const Cube&  operator=(const subview_cube<eT>& X);
00086   inline const Cube& operator+=(const subview_cube<eT>& X);
00087   inline const Cube& operator-=(const subview_cube<eT>& X);
00088   inline const Cube& operator%=(const subview_cube<eT>& X);
00089   inline const Cube& operator/=(const subview_cube<eT>& X);
00090   
00091   arma_inline       Mat<eT>& slice(const uword in_slice);
00092   arma_inline const Mat<eT>& slice(const uword in_slice) const;
00093   
00094   arma_inline       subview_cube<eT> slices(const uword in_slice1, const uword in_slice2);
00095   arma_inline const subview_cube<eT> slices(const uword in_slice1, const uword in_slice2) const;
00096   
00097   arma_inline       subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2);
00098   arma_inline const subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const;
00099   
00100   inline            subview_cube<eT> subcube(const span& row_span, const span& col_span, const span& slice_span);
00101   inline      const subview_cube<eT> subcube(const span& row_span, const span& col_span, const span& slice_span) const;
00102   
00103   inline            subview_cube<eT> operator()(const span& row_span, const span& col_span, const span& slice_span);
00104   inline      const subview_cube<eT> operator()(const span& row_span, const span& col_span, const span& slice_span) const;
00105   
00106   
00107   inline void shed_slice(const uword slice_num);
00108   
00109   inline void shed_slices(const uword in_slice1, const uword in_slice2);
00110   
00111   inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero = true);
00112   
00113   template<typename T1>
00114   inline void insert_slices(const uword row_num, const BaseCube<eT,T1>& X);
00115   
00116   
00117   template<typename gen_type> inline                   Cube(const GenCube<eT, gen_type>& X);
00118   template<typename gen_type> inline const Cube&  operator=(const GenCube<eT, gen_type>& X);
00119   template<typename gen_type> inline const Cube& operator+=(const GenCube<eT, gen_type>& X);
00120   template<typename gen_type> inline const Cube& operator-=(const GenCube<eT, gen_type>& X);
00121   template<typename gen_type> inline const Cube& operator%=(const GenCube<eT, gen_type>& X);
00122   template<typename gen_type> inline const Cube& operator/=(const GenCube<eT, gen_type>& X);
00123   
00124   template<typename T1, typename op_type> inline                   Cube(const OpCube<T1, op_type>& X);
00125   template<typename T1, typename op_type> inline const Cube&  operator=(const OpCube<T1, op_type>& X);
00126   template<typename T1, typename op_type> inline const Cube& operator+=(const OpCube<T1, op_type>& X);
00127   template<typename T1, typename op_type> inline const Cube& operator-=(const OpCube<T1, op_type>& X);
00128   template<typename T1, typename op_type> inline const Cube& operator%=(const OpCube<T1, op_type>& X);
00129   template<typename T1, typename op_type> inline const Cube& operator/=(const OpCube<T1, op_type>& X);
00130   
00131   template<typename T1, typename eop_type> inline                   Cube(const eOpCube<T1, eop_type>& X);
00132   template<typename T1, typename eop_type> inline const Cube&  operator=(const eOpCube<T1, eop_type>& X);
00133   template<typename T1, typename eop_type> inline const Cube& operator+=(const eOpCube<T1, eop_type>& X);
00134   template<typename T1, typename eop_type> inline const Cube& operator-=(const eOpCube<T1, eop_type>& X);
00135   template<typename T1, typename eop_type> inline const Cube& operator%=(const eOpCube<T1, eop_type>& X);
00136   template<typename T1, typename eop_type> inline const Cube& operator/=(const eOpCube<T1, eop_type>& X);
00137   
00138   template<typename T1, typename op_type> inline                   Cube(const mtOpCube<eT, T1, op_type>& X);
00139   template<typename T1, typename op_type> inline const Cube&  operator=(const mtOpCube<eT, T1, op_type>& X);
00140   template<typename T1, typename op_type> inline const Cube& operator+=(const mtOpCube<eT, T1, op_type>& X);
00141   template<typename T1, typename op_type> inline const Cube& operator-=(const mtOpCube<eT, T1, op_type>& X);
00142   template<typename T1, typename op_type> inline const Cube& operator%=(const mtOpCube<eT, T1, op_type>& X);
00143   template<typename T1, typename op_type> inline const Cube& operator/=(const mtOpCube<eT, T1, op_type>& X);
00144   
00145   template<typename T1, typename T2, typename glue_type> inline                   Cube(const GlueCube<T1, T2, glue_type>& X);
00146   template<typename T1, typename T2, typename glue_type> inline const Cube&  operator=(const GlueCube<T1, T2, glue_type>& X);
00147   template<typename T1, typename T2, typename glue_type> inline const Cube& operator+=(const GlueCube<T1, T2, glue_type>& X);
00148   template<typename T1, typename T2, typename glue_type> inline const Cube& operator-=(const GlueCube<T1, T2, glue_type>& X);
00149   template<typename T1, typename T2, typename glue_type> inline const Cube& operator%=(const GlueCube<T1, T2, glue_type>& X);
00150   template<typename T1, typename T2, typename glue_type> inline const Cube& operator/=(const GlueCube<T1, T2, glue_type>& X);
00151   
00152   template<typename T1, typename T2, typename eglue_type> inline                   Cube(const eGlueCube<T1, T2, eglue_type>& X);
00153   template<typename T1, typename T2, typename eglue_type> inline const Cube&  operator=(const eGlueCube<T1, T2, eglue_type>& X);
00154   template<typename T1, typename T2, typename eglue_type> inline const Cube& operator+=(const eGlueCube<T1, T2, eglue_type>& X);
00155   template<typename T1, typename T2, typename eglue_type> inline const Cube& operator-=(const eGlueCube<T1, T2, eglue_type>& X);
00156   template<typename T1, typename T2, typename eglue_type> inline const Cube& operator%=(const eGlueCube<T1, T2, eglue_type>& X);
00157   template<typename T1, typename T2, typename eglue_type> inline const Cube& operator/=(const eGlueCube<T1, T2, eglue_type>& X);
00158   
00159   template<typename T1, typename T2, typename glue_type> inline                   Cube(const mtGlueCube<eT, T1, T2, glue_type>& X);
00160   template<typename T1, typename T2, typename glue_type> inline const Cube&  operator=(const mtGlueCube<eT, T1, T2, glue_type>& X);
00161   template<typename T1, typename T2, typename glue_type> inline const Cube& operator+=(const mtGlueCube<eT, T1, T2, glue_type>& X);
00162   template<typename T1, typename T2, typename glue_type> inline const Cube& operator-=(const mtGlueCube<eT, T1, T2, glue_type>& X);
00163   template<typename T1, typename T2, typename glue_type> inline const Cube& operator%=(const mtGlueCube<eT, T1, T2, glue_type>& X);
00164   template<typename T1, typename T2, typename glue_type> inline const Cube& operator/=(const mtGlueCube<eT, T1, T2, glue_type>& X);
00165   
00166   
00167   arma_inline arma_warn_unused eT& operator[] (const uword i);
00168   arma_inline arma_warn_unused eT  operator[] (const uword i) const;
00169   
00170   arma_inline arma_warn_unused eT& at(const uword i);
00171   arma_inline arma_warn_unused eT  at(const uword i) const;
00172   
00173   arma_inline arma_warn_unused eT& operator() (const uword i);
00174   arma_inline arma_warn_unused eT  operator() (const uword i) const;
00175   
00176   arma_inline arma_warn_unused eT& at         (const uword in_row, const uword in_col, const uword in_slice);
00177   arma_inline arma_warn_unused eT  at         (const uword in_row, const uword in_col, const uword in_slice) const;
00178   
00179   arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col, const uword in_slice);
00180   arma_inline arma_warn_unused eT  operator() (const uword in_row, const uword in_col, const uword in_slice) const;
00181   
00182   arma_inline const Cube& operator++();
00183   arma_inline void        operator++(int);
00184   
00185   arma_inline const Cube& operator--();
00186   arma_inline void        operator--(int);
00187   
00188   arma_inline arma_warn_unused bool is_finite() const;
00189   arma_inline arma_warn_unused bool is_empty()  const;
00190   
00191   arma_inline arma_warn_unused bool in_range(const uword i) const;
00192   arma_inline arma_warn_unused bool in_range(const span& x) const;
00193   
00194   arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col, const uword   in_slice) const;
00195        inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const;
00196   
00197   arma_inline arma_warn_unused       eT* memptr();
00198   arma_inline arma_warn_unused const eT* memptr() const;
00199   
00200   arma_inline arma_warn_unused       eT* slice_memptr(const uword slice);
00201   arma_inline arma_warn_unused const eT* slice_memptr(const uword slice) const;
00202   
00203   arma_inline arma_warn_unused       eT* slice_colptr(const uword in_slice, const uword in_col);
00204   arma_inline arma_warn_unused const eT* slice_colptr(const uword in_slice, const uword in_col) const;
00205   
00206   inline void impl_print(const std::string& extra_text) const;
00207   inline void impl_print(std::ostream& user_stream, const std::string& extra_text) const;
00208   
00209   inline void impl_raw_print(const std::string& extra_text) const;
00210   inline void impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const;
00211   
00212   inline void  set_size(const uword in_rows, const uword in_cols, const uword in_slices);
00213   inline void   reshape(const uword in_rows, const uword in_cols, const uword in_slices, const uword dim = 0);
00214   inline void    resize(const uword in_rows, const uword in_cols, const uword in_slices);
00215   
00216   template<typename eT2> inline void copy_size(const Cube<eT2>& m);
00217   
00218   inline const Cube& fill(const eT val);
00219   
00220   inline const Cube& zeros();
00221   inline const Cube& zeros(const uword in_rows, const uword in_cols, const uword in_slices);
00222   
00223   inline const Cube& ones();
00224   inline const Cube& ones(const uword in_rows, const uword in_cols, const uword in_slices);
00225   
00226   inline const Cube& randu();
00227   inline const Cube& randu(const uword in_rows, const uword in_cols, const uword in_slices);
00228   
00229   inline const Cube& randn();
00230   inline const Cube& randn(const uword in_rows, const uword in_cols, const uword in_slices);
00231   
00232   inline void reset();
00233   
00234   
00235   template<typename T1> inline void set_real(const BaseCube<pod_type,T1>& X);
00236   template<typename T1> inline void set_imag(const BaseCube<pod_type,T1>& X);
00237   
00238   
00239   inline arma_warn_unused eT min() const;
00240   inline arma_warn_unused eT max() const;
00241   
00242   inline eT min(uword& index_of_min_val) const;
00243   inline eT max(uword& index_of_max_val) const;
00244   
00245   inline eT min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const;
00246   inline eT max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const;
00247   
00248   
00249   inline bool save(const std::string   name, const file_type type = arma_binary, const bool print_status = true) const;
00250   inline bool save(      std::ostream& os,   const file_type type = arma_binary, const bool print_status = true) const;
00251   
00252   inline bool load(const std::string   name, const file_type type = auto_detect, const bool print_status = true);
00253   inline bool load(      std::istream& is,   const file_type type = auto_detect, const bool print_status = true);
00254   
00255   inline bool quiet_save(const std::string   name, const file_type type = arma_binary) const;
00256   inline bool quiet_save(      std::ostream& os,   const file_type type = arma_binary) const;
00257   
00258   inline bool quiet_load(const std::string   name, const file_type type = auto_detect);
00259   inline bool quiet_load(      std::istream& is,   const file_type type = auto_detect);
00260   
00261   
00262   // iterators
00263   
00264   typedef       eT*       iterator;
00265   typedef const eT* const_iterator;
00266   
00267   typedef       eT*       slice_iterator;
00268   typedef const eT* const_slice_iterator;
00269   
00270   inline       iterator begin();
00271   inline const_iterator begin() const;
00272   
00273   inline       iterator end();
00274   inline const_iterator end()   const;
00275   
00276   inline       slice_iterator begin_slice(const uword slice_num);
00277   inline const_slice_iterator begin_slice(const uword slice_num) const;
00278   
00279   inline       slice_iterator end_slice(const uword slice_num);
00280   inline const_slice_iterator end_slice(const uword slice_num)   const;
00281 
00282 
00283   template<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>
00284   class fixed : public Cube<eT>
00285     {
00286     private:
00287     
00288     static const uword fixed_n_elem = fixed_n_rows * fixed_n_cols * fixed_n_slices;
00289     
00290     arma_aligned Mat<eT>* mat_ptrs_local_extra[ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? fixed_n_slices : 1 ];
00291     arma_aligned eT       mem_local_extra     [ (fixed_n_elem   > Cube_prealloc::mem_n_elem)    ? fixed_n_elem   : 1 ];
00292     
00293     arma_inline void mem_setup();
00294     
00295     
00296     public:
00297     
00298     inline fixed() { mem_setup(); }
00299     
00300     inline const Cube& operator=(const eT val) { mem_setup(); Cube<eT>::operator=(val); return *this; }
00301     
00302     template<typename T1>
00303     inline fixed(const BaseCube<eT,T1>& A) { mem_setup(); Cube<eT>::operator=(A.get_ref()); }
00304     
00305     template<typename T1>
00306     inline const Cube& operator=(const BaseCube<eT,T1>& A) { Cube<eT>::operator=(A.get_ref()); return *this; }
00307     
00308     template<typename T1, typename T2>
00309     inline explicit fixed(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B) { mem_setup(); Cube<eT>::init(A,B); }
00310     };
00311   
00312   
00313   protected:
00314   
00315   inline void init_cold();
00316   inline void init_warm(const uword in_rows, const uword in_cols, const uword in_slices);
00317   
00318   template<typename T1, typename T2>
00319   inline void init(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B);
00320   
00321   inline void steal_mem(Cube& X);
00322   
00323   inline void delete_mat();
00324   inline void create_mat();
00325   
00326   friend class glue_join;
00327   friend class op_reshape;
00328   friend class op_resize;
00329   
00330   
00331   public:
00332   
00333   #ifdef ARMA_EXTRA_CUBE_PROTO
00334     #include ARMA_INCFILE_WRAP(ARMA_EXTRA_CUBE_PROTO)
00335   #endif
00336   };
00337 
00338 
00339 
00340 class Cube_aux
00341   {
00342   public:
00343   
00344   template<typename eT> arma_inline static void prefix_pp(Cube<eT>& x);
00345   template<typename T>  arma_inline static void prefix_pp(Cube< std::complex<T> >& x);
00346   
00347   template<typename eT> arma_inline static void postfix_pp(Cube<eT>& x);
00348   template<typename T>  arma_inline static void postfix_pp(Cube< std::complex<T> >& x);
00349   
00350   template<typename eT> arma_inline static void prefix_mm(Cube<eT>& x);
00351   template<typename T>  arma_inline static void prefix_mm(Cube< std::complex<T> >& x);
00352   
00353   template<typename eT> arma_inline static void postfix_mm(Cube<eT>& x);
00354   template<typename T>  arma_inline static void postfix_mm(Cube< std::complex<T> >& x);
00355   
00356   template<typename eT, typename T1> inline static void set_real(Cube<eT>&                out, const BaseCube<eT,T1>& X);
00357   template<typename eT, typename T1> inline static void set_imag(Cube<eT>&                out, const BaseCube<eT,T1>& X);
00358   
00359   template<typename T,  typename T1> inline static void set_real(Cube< std::complex<T> >& out, const BaseCube< T,T1>& X);
00360   template<typename T,  typename T1> inline static void set_imag(Cube< std::complex<T> >& out, const BaseCube< T,T1>& X);
00361   };
00362 
00363 
00364 


armadillo_matrix
Author(s): Conrad Sanderson - NICTA (www.nicta.com.au), (Wrapper by Sjoerd van den Dries)
autogenerated on Tue Jan 7 2014 11:42:03