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<elem_type>::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 protected:
00218
00219 inline void init(const u32 in_rows, const u32 in_cols);
00220 inline void init(const std::string& text);
00221 inline void init(const Mat& x);
00222
00223 inline Mat(const char junk, const eT* aux_mem, const u32 aux_n_rows, const u32 aux_n_cols);
00224
00225 friend class Cube<eT>;
00226 };
00227
00228
00229
00230 class Mat_aux
00231 {
00232 public:
00233
00234 template<typename eT> arma_inline static void prefix_pp(Mat<eT>& x);
00235 template<typename T> arma_inline static void prefix_pp(Mat< std::complex<T> >& x);
00236
00237 template<typename eT> arma_inline static void postfix_pp(Mat<eT>& x);
00238 template<typename T> arma_inline static void postfix_pp(Mat< std::complex<T> >& x);
00239
00240 template<typename eT> arma_inline static void prefix_mm(Mat<eT>& x);
00241 template<typename T> arma_inline static void prefix_mm(Mat< std::complex<T> >& x);
00242
00243 template<typename eT> arma_inline static void postfix_mm(Mat<eT>& x);
00244 template<typename T> arma_inline static void postfix_mm(Mat< std::complex<T> >& x);
00245 };
00246
00247
00248
00249