Mat_proto.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 Mat
00018 //! @{
00019 
00020 //! Dense matrix class
00021 
00022 template<typename eT>
00023 class Mat : public Base< eT, Mat<eT> >
00024   {
00025   public:
00026   
00027   typedef eT                                elem_type;  //!< the type of elements stored in the matrix
00028   typedef typename get_pod_type<eT>::result pod_type;   //!< if eT is non-complex, pod_type is same as eT. otherwise, pod_type is the underlying type used by std::complex
00029   
00030   const u32  n_rows;      //!< number of rows in the matrix (read-only)
00031   const u32  n_cols;      //!< number of columns in the matrix (read-only)
00032   const u32  n_elem;      //!< number of elements in the matrix (read-only)
00033   const bool use_aux_mem; //!< true if externally managed memory is being used (read-only)
00034   
00035   arma_aligned const eT* const mem;  //!< pointer to the memory used by the matrix (memory is read-only)
00036   
00037   protected:
00038   arma_aligned eT mem_local[ 16 ];
00039   
00040   
00041   public:
00042   
00043   inline ~Mat();
00044   inline  Mat();
00045   
00046   inline Mat(const u32 in_rows, const u32 in_cols);
00047   
00048   inline                  Mat(const char*        text);
00049   inline const Mat& operator=(const char*        text);
00050   inline                  Mat(const std::string& text);
00051   inline const Mat& operator=(const std::string& text);
00052   
00053   inline Mat(      eT* aux_mem, const u32 aux_n_rows, const u32 aux_n_cols, const bool copy_aux_mem = true);
00054   inline Mat(const eT* aux_mem, const u32 aux_n_rows, const u32 aux_n_cols);
00055   
00056   arma_inline const Mat&  operator=(const eT val);
00057   arma_inline const Mat& operator+=(const eT val);
00058   arma_inline const Mat& operator-=(const eT val);
00059   arma_inline const Mat& operator*=(const eT val);
00060   arma_inline const Mat& operator/=(const eT val);
00061   
00062   inline                   Mat(const Mat& m);
00063   inline const Mat&  operator=(const Mat& m);
00064   inline const Mat& operator+=(const Mat& m);
00065   inline const Mat& operator-=(const Mat& m);
00066   inline const Mat& operator*=(const Mat& m);
00067   inline const Mat& operator%=(const Mat& m);
00068   inline const Mat& operator/=(const Mat& m);
00069 
00070   template<typename T1, typename T2>
00071   inline explicit Mat(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);
00072 
00073   inline                   Mat(const subview<eT>& X);
00074   inline const Mat&  operator=(const subview<eT>& X);
00075   inline const Mat& operator+=(const subview<eT>& X);
00076   inline const Mat& operator-=(const subview<eT>& X);
00077   inline const Mat& operator*=(const subview<eT>& X);
00078   inline const Mat& operator%=(const subview<eT>& X);
00079   inline const Mat& operator/=(const subview<eT>& X);
00080 
00081   //inline explicit          Mat(const subview_cube<eT>& X);
00082   inline                   Mat(const subview_cube<eT>& X);
00083   inline const Mat&  operator=(const subview_cube<eT>& X);
00084   inline const Mat& operator+=(const subview_cube<eT>& X);
00085   inline const Mat& operator-=(const subview_cube<eT>& X);
00086   inline const Mat& operator*=(const subview_cube<eT>& X);
00087   inline const Mat& operator%=(const subview_cube<eT>& X);
00088   inline const Mat& operator/=(const subview_cube<eT>& X);
00089 
00090   
00091   //inline explicit          Mat(const diagview<eT>& X);
00092   inline                   Mat(const diagview<eT>& X);
00093   inline const Mat&  operator=(const diagview<eT>& X);
00094   inline const Mat& operator+=(const diagview<eT>& X);
00095   inline const Mat& operator-=(const diagview<eT>& X);
00096   inline const Mat& operator*=(const diagview<eT>& X);
00097   inline const Mat& operator%=(const diagview<eT>& X);
00098   inline const Mat& operator/=(const diagview<eT>& X);
00099   
00100   arma_inline       subview_row<eT> row(const u32 row_num);
00101   arma_inline const subview_row<eT> row(const u32 row_num) const;
00102   
00103   arma_inline       subview_col<eT> col(const u32 col_num);
00104   arma_inline const subview_col<eT> col(const u32 col_num) const;
00105   
00106   arma_inline       subview<eT> rows(const u32 in_row1, const u32 in_row2);
00107   arma_inline const subview<eT> rows(const u32 in_row1, const u32 in_row2) const;
00108   
00109   arma_inline       subview<eT> cols(const u32 in_col1, const u32 in_col2);
00110   arma_inline const subview<eT> cols(const u32 in_col1, const u32 in_col2) const;
00111   
00112   arma_inline       subview<eT> submat(const u32 in_row1, const u32 in_col1, const u32 in_row2, const u32 in_col2);
00113   arma_inline const subview<eT> submat(const u32 in_row1, const u32 in_col1, const u32 in_row2, const u32 in_col2) const;
00114 
00115   arma_inline       diagview<eT> diag(const s32 in_id = 0);
00116   arma_inline const diagview<eT> diag(const s32 in_id = 0) const;
00117     
00118   inline void swap_rows(const u32 in_row1, const u32 in_row2);
00119   inline void swap_cols(const u32 in_col1, const u32 in_col2);
00120   
00121   template<typename T1, typename op_type> inline                   Mat(const Op<T1, op_type>& X);
00122   template<typename T1, typename op_type> inline const Mat&  operator=(const Op<T1, op_type>& X);
00123   template<typename T1, typename op_type> inline const Mat& operator+=(const Op<T1, op_type>& X);
00124   template<typename T1, typename op_type> inline const Mat& operator-=(const Op<T1, op_type>& X);
00125   template<typename T1, typename op_type> inline const Mat& operator*=(const Op<T1, op_type>& X);
00126   template<typename T1, typename op_type> inline const Mat& operator%=(const Op<T1, op_type>& X);
00127   template<typename T1, typename op_type> inline const Mat& operator/=(const Op<T1, op_type>& X);
00128   
00129   template<typename T1, typename eop_type> inline                   Mat(const eOp<T1, eop_type>& X);
00130   template<typename T1, typename eop_type> inline const Mat&  operator=(const eOp<T1, eop_type>& X);
00131   template<typename T1, typename eop_type> inline const Mat& operator+=(const eOp<T1, eop_type>& X);
00132   template<typename T1, typename eop_type> inline const Mat& operator-=(const eOp<T1, eop_type>& X);
00133   template<typename T1, typename eop_type> inline const Mat& operator*=(const eOp<T1, eop_type>& X);
00134   template<typename T1, typename eop_type> inline const Mat& operator%=(const eOp<T1, eop_type>& X);
00135   template<typename T1, typename eop_type> inline const Mat& operator/=(const eOp<T1, eop_type>& X);
00136   
00137   template<typename T1, typename op_type> inline                   Mat(const mtOp<eT, T1, op_type>& X);
00138   template<typename T1, typename op_type> inline const Mat&  operator=(const mtOp<eT, T1, op_type>& X);
00139   template<typename T1, typename op_type> inline const Mat& operator+=(const mtOp<eT, T1, op_type>& X);
00140   template<typename T1, typename op_type> inline const Mat& operator-=(const mtOp<eT, T1, op_type>& X);
00141   template<typename T1, typename op_type> inline const Mat& operator*=(const mtOp<eT, T1, op_type>& X);
00142   template<typename T1, typename op_type> inline const Mat& operator%=(const mtOp<eT, T1, op_type>& X);
00143   template<typename T1, typename op_type> inline const Mat& operator/=(const mtOp<eT, T1, op_type>& X);
00144   
00145   template<typename T1, typename T2, typename glue_type> inline                   Mat(const Glue<T1, T2, glue_type>& X);
00146   template<typename T1, typename T2, typename glue_type> inline const Mat&  operator=(const Glue<T1, T2, glue_type>& X);
00147   template<typename T1, typename T2, typename glue_type> inline const Mat& operator+=(const Glue<T1, T2, glue_type>& X);
00148   template<typename T1, typename T2, typename glue_type> inline const Mat& operator-=(const Glue<T1, T2, glue_type>& X);
00149   template<typename T1, typename T2, typename glue_type> inline const Mat& operator*=(const Glue<T1, T2, glue_type>& X);
00150   template<typename T1, typename T2, typename glue_type> inline const Mat& operator%=(const Glue<T1, T2, glue_type>& X);
00151   template<typename T1, typename T2, typename glue_type> inline const Mat& operator/=(const Glue<T1, T2, glue_type>& X);
00152   
00153   template<typename T1, typename T2>                     inline const Mat& operator+=(const Glue<T1, T2, glue_times>& X);
00154   template<typename T1, typename T2>                     inline const Mat& operator-=(const Glue<T1, T2, glue_times>& X);
00155   
00156   template<typename T1, typename T2, typename eglue_type> inline                   Mat(const eGlue<T1, T2, eglue_type>& X);
00157   template<typename T1, typename T2, typename eglue_type> inline const Mat&  operator=(const eGlue<T1, T2, eglue_type>& X);
00158   template<typename T1, typename T2, typename eglue_type> inline const Mat& operator+=(const eGlue<T1, T2, eglue_type>& X);
00159   template<typename T1, typename T2, typename eglue_type> inline const Mat& operator-=(const eGlue<T1, T2, eglue_type>& X);
00160   template<typename T1, typename T2, typename eglue_type> inline const Mat& operator*=(const eGlue<T1, T2, eglue_type>& X);
00161   template<typename T1, typename T2, typename eglue_type> inline const Mat& operator%=(const eGlue<T1, T2, eglue_type>& X);
00162   template<typename T1, typename T2, typename eglue_type> inline const Mat& operator/=(const eGlue<T1, T2, eglue_type>& X);
00163   
00164   template<typename T1, typename T2, typename glue_type> inline                   Mat(const mtGlue<eT, T1, T2, glue_type>& X);
00165   template<typename T1, typename T2, typename glue_type> inline const Mat&  operator=(const mtGlue<eT, T1, T2, glue_type>& X);
00166   template<typename T1, typename T2, typename glue_type> inline const Mat& operator+=(const mtGlue<eT, T1, T2, glue_type>& X);
00167   template<typename T1, typename T2, typename glue_type> inline const Mat& operator-=(const mtGlue<eT, T1, T2, glue_type>& X);
00168   template<typename T1, typename T2, typename glue_type> inline const Mat& operator*=(const mtGlue<eT, T1, T2, glue_type>& X);
00169   template<typename T1, typename T2, typename glue_type> inline const Mat& operator%=(const mtGlue<eT, T1, T2, glue_type>& X);
00170   template<typename T1, typename T2, typename glue_type> inline const Mat& operator/=(const mtGlue<eT, T1, T2, glue_type>& X);
00171   
00172   
00173   arma_inline eT& operator[] (const u32 i);
00174   arma_inline eT  operator[] (const u32 i) const;
00175   arma_inline eT& operator() (const u32 i);
00176   arma_inline eT  operator() (const u32 i) const;
00177   
00178   arma_inline eT& at         (const u32 in_row, const u32 in_col);
00179   arma_inline eT  at         (const u32 in_row, const u32 in_col) const;
00180   arma_inline eT& operator() (const u32 in_row, const u32 in_col);
00181   arma_inline eT  operator() (const u32 in_row, const u32 in_col) const;
00182   
00183   arma_inline const Mat& operator++();
00184   arma_inline void       operator++(int);
00185   
00186   arma_inline const Mat& operator--();
00187   arma_inline void       operator--(int);
00188   
00189   arma_inline bool is_vec() const;
00190   arma_inline bool is_square() const;
00191   arma_inline bool is_finite() const;
00192   
00193   arma_inline       eT* colptr(const u32 in_col);
00194   arma_inline const eT* colptr(const u32 in_col) const;
00195   
00196   arma_inline       eT* memptr();
00197   arma_inline const eT* memptr() const;
00198   
00199   inline void print(const std::string extra_text = "") const;
00200   inline void print(std::ostream& user_stream, const std::string extra_text = "") const;
00201   
00202   inline void print_trans(const std::string extra_text = "") const;
00203   inline void print_trans(std::ostream& user_stream, const std::string extra_text = "") const;
00204   
00205   inline void raw_print(const std::string extra_text = "") const;
00206   inline void raw_print(std::ostream& user_stream, const std::string extra_text = "") const;
00207   
00208   inline void raw_print_trans(const std::string extra_text = "") const;
00209   inline void raw_print_trans(std::ostream& user_stream, const std::string extra_text = "") const;
00210   
00211   template<typename eT2>
00212   inline void copy_size(const Mat<eT2>& m);
00213   
00214   inline void  set_size(const u32 in_rows, const u32 in_cols);
00215   
00216   arma_hot inline void fill(const eT val);
00217   
00218   inline void zeros();
00219   inline void zeros(const u32 in_rows, const u32 in_cols);
00220   
00221   inline void ones();
00222   inline void ones(const u32 in_rows, const u32 in_cols);
00223   
00224   inline void reset();
00225   
00226   
00227   inline bool save(const std::string   name, const file_type type = arma_binary, const bool print_status = true) const;
00228   inline bool save(      std::ostream& os,   const file_type type = arma_binary, const bool print_status = true) const;
00229   
00230   inline bool load(const std::string   name, const file_type type = auto_detect, const bool print_status = true);
00231   inline bool load(      std::istream& is,   const file_type type = auto_detect, const bool print_status = true);
00232   
00233   inline bool quiet_save(const std::string   name, const file_type type = arma_binary) const;
00234   inline bool quiet_save(      std::ostream& os,   const file_type type = arma_binary) const;
00235   
00236   inline bool quiet_load(const std::string   name, const file_type type = auto_detect);
00237   inline bool quiet_load(      std::istream& is,   const file_type type = auto_detect);
00238   
00239   
00240   // iterators
00241   
00242   typedef       eT*       iterator;
00243   typedef const eT* const_iterator;
00244   
00245   typedef       eT*       col_iterator;
00246   typedef const eT* const_col_iterator;
00247   
00248   class row_iterator
00249     {
00250     public:
00251     
00252     inline row_iterator(Mat<eT>& in_M, const u32 in_row);
00253     
00254     inline eT& operator* ();
00255     
00256     inline row_iterator& operator++();
00257     inline void          operator++(int);
00258     
00259     inline row_iterator& operator--();
00260     inline void          operator--(int);
00261     
00262     inline bool operator!=(const row_iterator& X) const;
00263     inline bool operator==(const row_iterator& X) const;
00264     
00265     arma_aligned Mat<eT>& M;
00266     arma_aligned u32      row;
00267     arma_aligned u32      col;
00268     };
00269   
00270   
00271   class const_row_iterator
00272     {
00273     public:
00274     
00275     const_row_iterator(const Mat<eT>& in_M, const u32 in_row);
00276     const_row_iterator(const row_iterator& X);
00277     
00278     inline eT operator*() const;
00279     
00280     inline const_row_iterator& operator++();
00281     inline void                operator++(int);
00282     
00283     inline const_row_iterator& operator--();
00284     inline void                operator--(int);
00285     
00286     inline bool operator!=(const const_row_iterator& X) const;
00287     inline bool operator==(const const_row_iterator& X) const;
00288     
00289     arma_aligned const Mat<eT>& M;
00290     arma_aligned       u32      row;
00291     arma_aligned       u32      col;
00292     };
00293   
00294   inline       iterator begin();
00295   inline const_iterator begin() const;
00296   
00297   inline       iterator end();
00298   inline const_iterator end()   const;
00299   
00300   inline       col_iterator begin_col(const u32 col_num);
00301   inline const_col_iterator begin_col(const u32 col_num) const;
00302   
00303   inline       col_iterator end_col  (const u32 col_num);
00304   inline const_col_iterator end_col  (const u32 col_num) const;
00305   
00306   inline       row_iterator begin_row(const u32 row_num);
00307   inline const_row_iterator begin_row(const u32 row_num) const;
00308   
00309   inline       row_iterator end_row  (const u32 row_num);
00310   inline const_row_iterator end_row  (const u32 row_num) const;
00311   
00312   
00313   protected:
00314   
00315   inline void init(const u32 in_rows, const u32 in_cols);
00316   inline void init(const std::string& text);
00317   inline void init(const Mat& x);
00318   
00319   inline Mat(const char junk, const eT* aux_mem, const u32 aux_n_rows, const u32 aux_n_cols);
00320   
00321   friend class Cube<eT>;
00322   friend class glue_join;
00323   };
00324 
00325 
00326 
00327 class Mat_aux
00328   {
00329   public:
00330 
00331   template<typename eT> arma_inline static void prefix_pp(Mat<eT>& x);
00332   template<typename T>  arma_inline static void prefix_pp(Mat< std::complex<T> >& x);
00333   
00334   template<typename eT> arma_inline static void postfix_pp(Mat<eT>& x);
00335   template<typename T>  arma_inline static void postfix_pp(Mat< std::complex<T> >& x);
00336   
00337   template<typename eT> arma_inline static void prefix_mm(Mat<eT>& x);
00338   template<typename T>  arma_inline static void prefix_mm(Mat< std::complex<T> >& x);
00339   
00340   template<typename eT> arma_inline static void postfix_mm(Mat<eT>& x);
00341   template<typename T>  arma_inline static void postfix_mm(Mat< std::complex<T> >& x);
00342   };
00343 
00344 
00345 
00346 //! @}