00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 template<typename eT>
00023 class Mat : public Base< eT, Mat<eT> >
00024 {
00025 public:
00026
00027 typedef eT elem_type;
00028 typedef typename get_pod_type<eT>::result pod_type;
00029
00030 const u32 n_rows;
00031 const u32 n_cols;
00032 const u32 n_elem;
00033 const bool use_aux_mem;
00034
00035 arma_aligned const eT* const mem;
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
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
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 T2, typename glue_type> inline Mat(const Glue<T1, T2, glue_type>& X);
00138 template<typename T1, typename T2, typename glue_type> inline const Mat& operator=(const Glue<T1, T2, glue_type>& X);
00139 template<typename T1, typename T2, typename glue_type> inline const Mat& operator+=(const Glue<T1, T2, glue_type>& X);
00140 template<typename T1, typename T2, typename glue_type> inline const Mat& operator-=(const Glue<T1, T2, glue_type>& X);
00141 template<typename T1, typename T2, typename glue_type> inline const Mat& operator*=(const Glue<T1, T2, glue_type>& X);
00142 template<typename T1, typename T2, typename glue_type> inline const Mat& operator%=(const Glue<T1, T2, glue_type>& X);
00143 template<typename T1, typename T2, typename glue_type> inline const Mat& operator/=(const Glue<T1, T2, glue_type>& X);
00144
00145 template<typename T1, typename T2> inline const Mat& operator+=(const Glue<T1, T2, glue_times>& X);
00146 template<typename T1, typename T2> inline const Mat& operator-=(const Glue<T1, T2, glue_times>& X);
00147
00148 template<typename T1, typename T2, typename eglue_type> inline Mat(const eGlue<T1, T2, eglue_type>& X);
00149 template<typename T1, typename T2, typename eglue_type> inline const Mat& operator=(const eGlue<T1, T2, eglue_type>& X);
00150 template<typename T1, typename T2, typename eglue_type> inline const Mat& operator+=(const eGlue<T1, T2, eglue_type>& X);
00151 template<typename T1, typename T2, typename eglue_type> inline const Mat& operator-=(const eGlue<T1, T2, eglue_type>& X);
00152 template<typename T1, typename T2, typename eglue_type> inline const Mat& operator*=(const eGlue<T1, T2, eglue_type>& X);
00153 template<typename T1, typename T2, typename eglue_type> inline const Mat& operator%=(const eGlue<T1, T2, eglue_type>& X);
00154 template<typename T1, typename T2, typename eglue_type> inline const Mat& operator/=(const eGlue<T1, T2, eglue_type>& X);
00155
00156
00157 arma_inline eT& operator[] (const u32 i);
00158 arma_inline eT operator[] (const u32 i) const;
00159 arma_inline eT& operator() (const u32 i);
00160 arma_inline eT operator() (const u32 i) const;
00161
00162 arma_inline eT& at (const u32 in_row, const u32 in_col);
00163 arma_inline eT at (const u32 in_row, const u32 in_col) const;
00164 arma_inline eT& operator() (const u32 in_row, const u32 in_col);
00165 arma_inline eT operator() (const u32 in_row, const u32 in_col) const;
00166
00167 arma_inline const Mat& operator++();
00168 arma_inline void operator++(int);
00169
00170 arma_inline const Mat& operator--();
00171 arma_inline void operator--(int);
00172
00173 arma_inline bool is_vec() const;
00174 arma_inline bool is_square() const;
00175 arma_inline bool is_finite() const;
00176
00177 arma_inline eT* colptr(const u32 in_col);
00178 arma_inline const eT* colptr(const u32 in_col) const;
00179
00180 arma_inline eT* memptr();
00181 arma_inline const eT* memptr() const;
00182
00183 inline void print(const std::string extra_text = "") const;
00184 inline void print(std::ostream& user_stream, const std::string extra_text = "") const;
00185
00186 inline void print_trans(const std::string extra_text = "") const;
00187 inline void print_trans(std::ostream& user_stream, const std::string extra_text = "") const;
00188
00189 inline void raw_print(const std::string extra_text = "") const;
00190 inline void raw_print(std::ostream& user_stream, const std::string extra_text = "") const;
00191
00192 inline void raw_print_trans(const std::string extra_text = "") const;
00193 inline void raw_print_trans(std::ostream& user_stream, const std::string extra_text = "") const;
00194
00195 template<typename eT2>
00196 inline void copy_size(const Mat<eT2>& m);
00197
00198 inline void set_size(const u32 in_rows, const u32 in_cols);
00199
00200 arma_hot inline void fill(const eT val);
00201
00202 inline void zeros();
00203 inline void zeros(const u32 in_rows, const u32 in_cols);
00204
00205 inline void ones();
00206 inline void ones(const u32 in_rows, const u32 in_cols);
00207
00208 inline void reset();
00209
00210 inline void save(const std::string name, const file_type type = arma_binary) const;
00211 inline void save( std::ostream& os, const file_type type = arma_binary) const;
00212
00213 inline void load(const std::string name, const file_type type = auto_detect);
00214 inline void load( std::istream& is, const file_type type = auto_detect);
00215
00216
00217
00218
00219 typedef eT* iterator;
00220 typedef const eT* const_iterator;
00221
00222 typedef eT* col_iterator;
00223 typedef const eT* const_col_iterator;
00224
00225 class row_iterator
00226 {
00227 public:
00228
00229 inline row_iterator(Mat<eT>& in_M, const u32 in_row);
00230
00231 inline eT& operator* ();
00232
00233 inline row_iterator& operator++();
00234 inline void operator++(int);
00235
00236 inline row_iterator& operator--();
00237 inline void operator--(int);
00238
00239 inline bool operator!=(const row_iterator& X) const;
00240 inline bool operator==(const row_iterator& X) const;
00241
00242 arma_aligned Mat<eT>& M;
00243 arma_aligned u32 row;
00244 arma_aligned u32 col;
00245 };
00246
00247
00248 class const_row_iterator
00249 {
00250 public:
00251
00252 const_row_iterator(const Mat<eT>& in_M, const u32 in_row);
00253 const_row_iterator(const row_iterator& X);
00254
00255 inline eT operator*() const;
00256
00257 inline const_row_iterator& operator++();
00258 inline void operator++(int);
00259
00260 inline const_row_iterator& operator--();
00261 inline void operator--(int);
00262
00263 inline bool operator!=(const const_row_iterator& X) const;
00264 inline bool operator==(const const_row_iterator& X) const;
00265
00266 arma_aligned const Mat<eT>& M;
00267 arma_aligned u32 row;
00268 arma_aligned u32 col;
00269 };
00270
00271 inline iterator begin();
00272 inline const_iterator begin() const;
00273
00274 inline iterator end();
00275 inline const_iterator end() const;
00276
00277 inline col_iterator begin_col(const u32 col_num);
00278 inline const_col_iterator begin_col(const u32 col_num) const;
00279
00280 inline col_iterator end_col (const u32 col_num);
00281 inline const_col_iterator end_col (const u32 col_num) const;
00282
00283 inline row_iterator begin_row(const u32 row_num);
00284 inline const_row_iterator begin_row(const u32 row_num) const;
00285
00286 inline row_iterator end_row (const u32 row_num);
00287 inline const_row_iterator end_row (const u32 row_num) const;
00288
00289
00290 protected:
00291
00292 inline void init(const u32 in_rows, const u32 in_cols);
00293 inline void init(const std::string& text);
00294 inline void init(const Mat& x);
00295
00296 inline Mat(const char junk, const eT* aux_mem, const u32 aux_n_rows, const u32 aux_n_cols);
00297
00298 friend class Cube<eT>;
00299 friend class glue_join;
00300 };
00301
00302
00303
00304 class Mat_aux
00305 {
00306 public:
00307
00308 template<typename eT> arma_inline static void prefix_pp(Mat<eT>& x);
00309 template<typename T> arma_inline static void prefix_pp(Mat< std::complex<T> >& x);
00310
00311 template<typename eT> arma_inline static void postfix_pp(Mat<eT>& x);
00312 template<typename T> arma_inline static void postfix_pp(Mat< std::complex<T> >& x);
00313
00314 template<typename eT> arma_inline static void prefix_mm(Mat<eT>& x);
00315 template<typename T> arma_inline static void prefix_mm(Mat< std::complex<T> >& x);
00316
00317 template<typename eT> arma_inline static void postfix_mm(Mat<eT>& x);
00318 template<typename T> arma_inline static void postfix_mm(Mat< std::complex<T> >& x);
00319 };
00320
00321
00322
00323