annotate armadillo-3.900.4/include/armadillo_bits/subview_bones.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2008-2013 Conrad Sanderson
Chris@49 3 // Copyright (C) 2011 James Sanders
Chris@49 4 //
Chris@49 5 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 6 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 8
Chris@49 9
Chris@49 10 //! \addtogroup subview
Chris@49 11 //! @{
Chris@49 12
Chris@49 13
Chris@49 14 //! Class for storing data required to construct or apply operations to a submatrix
Chris@49 15 //! (i.e. where the submatrix starts and ends as well as a reference/pointer to the original matrix),
Chris@49 16 template<typename eT>
Chris@49 17 class subview : public Base<eT, subview<eT> >
Chris@49 18 {
Chris@49 19 public:
Chris@49 20
Chris@49 21 typedef eT elem_type;
Chris@49 22 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 23
Chris@49 24 arma_aligned const Mat<eT>& m;
Chris@49 25
Chris@49 26 static const bool is_row = false;
Chris@49 27 static const bool is_col = false;
Chris@49 28
Chris@49 29 const uword aux_row1;
Chris@49 30 const uword aux_col1;
Chris@49 31
Chris@49 32 const uword n_rows;
Chris@49 33 const uword n_cols;
Chris@49 34 const uword n_elem;
Chris@49 35
Chris@49 36 protected:
Chris@49 37
Chris@49 38 arma_inline subview(const Mat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);
Chris@49 39
Chris@49 40
Chris@49 41 public:
Chris@49 42
Chris@49 43 inline ~subview();
Chris@49 44
Chris@49 45 inline void operator+= (const eT val);
Chris@49 46 inline void operator-= (const eT val);
Chris@49 47 inline void operator*= (const eT val);
Chris@49 48 inline void operator/= (const eT val);
Chris@49 49
Chris@49 50 // deliberately returning void
Chris@49 51 template<typename T1> inline void operator= (const Base<eT,T1>& x);
Chris@49 52 template<typename T1> inline void operator+= (const Base<eT,T1>& x);
Chris@49 53 template<typename T1> inline void operator-= (const Base<eT,T1>& x);
Chris@49 54 template<typename T1> inline void operator%= (const Base<eT,T1>& x);
Chris@49 55 template<typename T1> inline void operator/= (const Base<eT,T1>& x);
Chris@49 56
Chris@49 57 inline void operator= (const subview& x);
Chris@49 58 inline void operator+= (const subview& x);
Chris@49 59 inline void operator-= (const subview& x);
Chris@49 60 inline void operator%= (const subview& x);
Chris@49 61 inline void operator/= (const subview& x);
Chris@49 62
Chris@49 63 inline static void extract(Mat<eT>& out, const subview& in);
Chris@49 64
Chris@49 65 inline static void plus_inplace(Mat<eT>& out, const subview& in);
Chris@49 66 inline static void minus_inplace(Mat<eT>& out, const subview& in);
Chris@49 67 inline static void schur_inplace(Mat<eT>& out, const subview& in);
Chris@49 68 inline static void div_inplace(Mat<eT>& out, const subview& in);
Chris@49 69
Chris@49 70 template<typename functor> inline void transform(functor F);
Chris@49 71 template<typename functor> inline void imbue(functor F);
Chris@49 72
Chris@49 73 inline void fill(const eT val);
Chris@49 74 inline void zeros();
Chris@49 75 inline void ones();
Chris@49 76 inline void eye();
Chris@49 77
Chris@49 78 inline eT at_alt (const uword ii) const;
Chris@49 79
Chris@49 80 inline eT& operator[](const uword ii);
Chris@49 81 inline eT operator[](const uword ii) const;
Chris@49 82
Chris@49 83 inline eT& operator()(const uword ii);
Chris@49 84 inline eT operator()(const uword ii) const;
Chris@49 85
Chris@49 86 inline eT& operator()(const uword in_row, const uword in_col);
Chris@49 87 inline eT operator()(const uword in_row, const uword in_col) const;
Chris@49 88
Chris@49 89 inline eT& at(const uword in_row, const uword in_col);
Chris@49 90 inline eT at(const uword in_row, const uword in_col) const;
Chris@49 91
Chris@49 92 arma_inline eT* colptr(const uword in_col);
Chris@49 93 arma_inline const eT* colptr(const uword in_col) const;
Chris@49 94
Chris@49 95 inline bool check_overlap(const subview& x) const;
Chris@49 96
Chris@49 97 inline bool is_vec() const;
Chris@49 98
Chris@49 99 inline subview_row<eT> row(const uword row_num);
Chris@49 100 inline const subview_row<eT> row(const uword row_num) const;
Chris@49 101
Chris@49 102 inline subview_row<eT> operator()(const uword row_num, const span& col_span);
Chris@49 103 inline const subview_row<eT> operator()(const uword row_num, const span& col_span) const;
Chris@49 104
Chris@49 105 inline subview_col<eT> col(const uword col_num);
Chris@49 106 inline const subview_col<eT> col(const uword col_num) const;
Chris@49 107
Chris@49 108 inline subview_col<eT> operator()(const span& row_span, const uword col_num);
Chris@49 109 inline const subview_col<eT> operator()(const span& row_span, const uword col_num) const;
Chris@49 110
Chris@49 111 inline Col<eT> unsafe_col(const uword col_num);
Chris@49 112 inline const Col<eT> unsafe_col(const uword col_num) const;
Chris@49 113
Chris@49 114 inline subview<eT> rows(const uword in_row1, const uword in_row2);
Chris@49 115 inline const subview<eT> rows(const uword in_row1, const uword in_row2) const;
Chris@49 116
Chris@49 117 inline subview<eT> cols(const uword in_col1, const uword in_col2);
Chris@49 118 inline const subview<eT> cols(const uword in_col1, const uword in_col2) const;
Chris@49 119
Chris@49 120 inline subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);
Chris@49 121 inline const subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;
Chris@49 122
Chris@49 123 inline subview<eT> submat (const span& row_span, const span& col_span);
Chris@49 124 inline const subview<eT> submat (const span& row_span, const span& col_span) const;
Chris@49 125
Chris@49 126 inline subview<eT> operator()(const span& row_span, const span& col_span);
Chris@49 127 inline const subview<eT> operator()(const span& row_span, const span& col_span) const;
Chris@49 128
Chris@49 129 inline subview_each1< subview<eT>, 0 > each_col();
Chris@49 130 inline subview_each1< subview<eT>, 1 > each_row();
Chris@49 131
Chris@49 132 template<typename T1> inline subview_each2< subview<eT>, 0, T1 > each_col(const Base<uword, T1>& indices);
Chris@49 133 template<typename T1> inline subview_each2< subview<eT>, 1, T1 > each_row(const Base<uword, T1>& indices);
Chris@49 134
Chris@49 135 inline diagview<eT> diag(const sword in_id = 0);
Chris@49 136 inline const diagview<eT> diag(const sword in_id = 0) const;
Chris@49 137
Chris@49 138 inline void swap_rows(const uword in_row1, const uword in_row2);
Chris@49 139 inline void swap_cols(const uword in_col1, const uword in_col2);
Chris@49 140
Chris@49 141
Chris@49 142 // // primitive forward iterator
Chris@49 143 // class iter
Chris@49 144 // {
Chris@49 145 // public:
Chris@49 146 //
Chris@49 147 // inline iter(const subview<eT>& in_M);
Chris@49 148 //
Chris@49 149 // arma_inline eT operator* () const;
Chris@49 150 //
Chris@49 151 // inline void operator++();
Chris@49 152 // inline void operator++(int);
Chris@49 153 //
Chris@49 154 //
Chris@49 155 // private:
Chris@49 156 //
Chris@49 157 // arma_aligned const eT* mem;
Chris@49 158 //
Chris@49 159 // arma_aligned uword n_rows;
Chris@49 160 //
Chris@49 161 // arma_aligned uword row_start;
Chris@49 162 // arma_aligned uword row_end_p1;
Chris@49 163 //
Chris@49 164 // arma_aligned uword row;
Chris@49 165 // arma_aligned uword col;
Chris@49 166 // arma_aligned uword i;
Chris@49 167 // };
Chris@49 168
Chris@49 169
Chris@49 170 private:
Chris@49 171
Chris@49 172 friend class Mat<eT>;
Chris@49 173 subview();
Chris@49 174 };
Chris@49 175
Chris@49 176
Chris@49 177
Chris@49 178 template<typename eT>
Chris@49 179 class subview_col : public subview<eT>
Chris@49 180 {
Chris@49 181 public:
Chris@49 182
Chris@49 183 typedef eT elem_type;
Chris@49 184 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 185
Chris@49 186 static const bool is_row = false;
Chris@49 187 static const bool is_col = true;
Chris@49 188
Chris@49 189 const eT* colmem;
Chris@49 190
Chris@49 191 inline void operator= (const subview<eT>& x);
Chris@49 192 inline void operator= (const subview_col& x);
Chris@49 193
Chris@49 194 template<typename T1>
Chris@49 195 inline void operator= (const Base<eT,T1>& x);
Chris@49 196
Chris@49 197 arma_inline const Op<subview_col<eT>,op_htrans> t() const;
Chris@49 198 arma_inline const Op<subview_col<eT>,op_htrans> ht() const;
Chris@49 199 arma_inline const Op<subview_col<eT>,op_strans> st() const;
Chris@49 200
Chris@49 201 arma_inline eT at_alt (const uword i) const;
Chris@49 202
Chris@49 203 arma_inline eT& operator[](const uword i);
Chris@49 204 arma_inline eT operator[](const uword i) const;
Chris@49 205
Chris@49 206 inline eT& operator()(const uword i);
Chris@49 207 inline eT operator()(const uword i) const;
Chris@49 208
Chris@49 209 inline eT& operator()(const uword in_row, const uword in_col);
Chris@49 210 inline eT operator()(const uword in_row, const uword in_col) const;
Chris@49 211
Chris@49 212 inline eT& at(const uword in_row, const uword in_col);
Chris@49 213 inline eT at(const uword in_row, const uword in_col) const;
Chris@49 214
Chris@49 215 arma_inline eT* colptr(const uword in_col);
Chris@49 216 arma_inline const eT* colptr(const uword in_col) const;
Chris@49 217
Chris@49 218 inline subview_col<eT> rows(const uword in_row1, const uword in_row2);
Chris@49 219 inline const subview_col<eT> rows(const uword in_row1, const uword in_row2) const;
Chris@49 220
Chris@49 221 inline subview_col<eT> subvec(const uword in_row1, const uword in_row2);
Chris@49 222 inline const subview_col<eT> subvec(const uword in_row1, const uword in_row2) const;
Chris@49 223
Chris@49 224 // TODO: add operator()(span)
Chris@49 225
Chris@49 226 protected:
Chris@49 227
Chris@49 228 inline subview_col(const Mat<eT>& in_m, const uword in_col);
Chris@49 229 inline subview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);
Chris@49 230
Chris@49 231
Chris@49 232 private:
Chris@49 233
Chris@49 234 friend class Mat<eT>;
Chris@49 235 friend class Col<eT>;
Chris@49 236 friend class subview<eT>;
Chris@49 237
Chris@49 238 subview_col();
Chris@49 239 };
Chris@49 240
Chris@49 241
Chris@49 242
Chris@49 243 template<typename eT>
Chris@49 244 class subview_row : public subview<eT>
Chris@49 245 {
Chris@49 246 public:
Chris@49 247
Chris@49 248 typedef eT elem_type;
Chris@49 249 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 250
Chris@49 251 static const bool is_row = true;
Chris@49 252 static const bool is_col = false;
Chris@49 253
Chris@49 254 inline void operator= (const subview<eT>& x);
Chris@49 255 inline void operator= (const subview_row& x);
Chris@49 256
Chris@49 257 template<typename T1>
Chris@49 258 inline void operator= (const Base<eT,T1>& x);
Chris@49 259
Chris@49 260 arma_inline const Op<subview_row<eT>,op_htrans> t() const;
Chris@49 261 arma_inline const Op<subview_row<eT>,op_htrans> ht() const;
Chris@49 262 arma_inline const Op<subview_row<eT>,op_strans> st() const;
Chris@49 263
Chris@49 264 inline eT at_alt (const uword i) const;
Chris@49 265
Chris@49 266 inline eT& operator[](const uword i);
Chris@49 267 inline eT operator[](const uword i) const;
Chris@49 268
Chris@49 269 inline eT& operator()(const uword i);
Chris@49 270 inline eT operator()(const uword i) const;
Chris@49 271
Chris@49 272 inline eT& operator()(const uword in_row, const uword in_col);
Chris@49 273 inline eT operator()(const uword in_row, const uword in_col) const;
Chris@49 274
Chris@49 275 inline eT& at(const uword in_row, const uword in_col);
Chris@49 276 inline eT at(const uword in_row, const uword in_col) const;
Chris@49 277
Chris@49 278 inline subview_row<eT> cols(const uword in_col1, const uword in_col2);
Chris@49 279 inline const subview_row<eT> cols(const uword in_col1, const uword in_col2) const;
Chris@49 280
Chris@49 281 inline subview_row<eT> subvec(const uword in_col1, const uword in_col2);
Chris@49 282 inline const subview_row<eT> subvec(const uword in_col1, const uword in_col2) const;
Chris@49 283
Chris@49 284 // TODO: add operator()(span)
Chris@49 285
Chris@49 286 protected:
Chris@49 287
Chris@49 288 inline subview_row(const Mat<eT>& in_m, const uword in_row);
Chris@49 289 inline subview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);
Chris@49 290
Chris@49 291
Chris@49 292 private:
Chris@49 293
Chris@49 294 friend class Mat<eT>;
Chris@49 295 friend class Row<eT>;
Chris@49 296 friend class subview<eT>;
Chris@49 297
Chris@49 298 subview_row();
Chris@49 299 };
Chris@49 300
Chris@49 301
Chris@49 302
Chris@49 303 template<typename eT>
Chris@49 304 class subview_row_strans : public Base<eT, subview_row_strans<eT> >
Chris@49 305 {
Chris@49 306 public:
Chris@49 307
Chris@49 308 typedef eT elem_type;
Chris@49 309 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 310
Chris@49 311 static const bool is_row = false;
Chris@49 312 static const bool is_col = true;
Chris@49 313
Chris@49 314 arma_aligned const subview_row<eT>& sv_row;
Chris@49 315
Chris@49 316 const uword n_rows; // equal to n_elem
Chris@49 317 const uword n_elem;
Chris@49 318 static const uword n_cols = 1;
Chris@49 319
Chris@49 320
Chris@49 321 inline explicit subview_row_strans(const subview_row<eT>& in_sv_row);
Chris@49 322
Chris@49 323 inline void extract(Mat<eT>& out) const;
Chris@49 324
Chris@49 325 inline eT at_alt (const uword i) const;
Chris@49 326
Chris@49 327 inline eT operator[](const uword i) const;
Chris@49 328 inline eT operator()(const uword i) const;
Chris@49 329
Chris@49 330 inline eT operator()(const uword in_row, const uword in_col) const;
Chris@49 331 inline eT at(const uword in_row, const uword in_col) const;
Chris@49 332 };
Chris@49 333
Chris@49 334
Chris@49 335
Chris@49 336 template<typename eT>
Chris@49 337 class subview_row_htrans : public Base<eT, subview_row_htrans<eT> >
Chris@49 338 {
Chris@49 339 public:
Chris@49 340
Chris@49 341 typedef eT elem_type;
Chris@49 342 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 343
Chris@49 344 static const bool is_row = false;
Chris@49 345 static const bool is_col = true;
Chris@49 346
Chris@49 347 arma_aligned const subview_row<eT>& sv_row;
Chris@49 348
Chris@49 349 const uword n_rows; // equal to n_elem
Chris@49 350 const uword n_elem;
Chris@49 351 static const uword n_cols = 1;
Chris@49 352
Chris@49 353
Chris@49 354 inline explicit subview_row_htrans(const subview_row<eT>& in_sv_row);
Chris@49 355
Chris@49 356 inline void extract(Mat<eT>& out) const;
Chris@49 357
Chris@49 358 inline eT at_alt (const uword i) const;
Chris@49 359
Chris@49 360 inline eT operator[](const uword i) const;
Chris@49 361 inline eT operator()(const uword i) const;
Chris@49 362
Chris@49 363 inline eT operator()(const uword in_row, const uword in_col) const;
Chris@49 364 inline eT at(const uword in_row, const uword in_col) const;
Chris@49 365 };
Chris@49 366
Chris@49 367
Chris@49 368
Chris@49 369 //! @}