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 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
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