annotate armadillo-3.900.4/include/armadillo_bits/SpSubview_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) 2011-2012 Ryan Curtin
Chris@49 2 // Copyright (C) 2011 Matthew Amidon
Chris@49 3 // Copyright (C) 2012 Conrad Sanderson
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 //! \addtogroup SpSubview
Chris@49 10 //! @{
Chris@49 11
Chris@49 12 template<typename eT>
Chris@49 13 class SpSubview : public SpBase<eT, SpSubview<eT> >
Chris@49 14 {
Chris@49 15 public:
Chris@49 16
Chris@49 17 const SpMat<eT>& m;
Chris@49 18
Chris@49 19 typedef eT elem_type;
Chris@49 20 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 21
Chris@49 22 static const bool is_row = false;
Chris@49 23 static const bool is_col = false;
Chris@49 24
Chris@49 25 const uword aux_row1;
Chris@49 26 const uword aux_col1;
Chris@49 27 const uword n_rows;
Chris@49 28 const uword n_cols;
Chris@49 29 const uword n_elem;
Chris@49 30 const uword n_nonzero;
Chris@49 31
Chris@49 32 // So that SpValProxy can call add_element() and delete_element().
Chris@49 33 friend class SpValProxy<SpSubview<eT> >;
Chris@49 34
Chris@49 35 protected:
Chris@49 36
Chris@49 37 arma_inline SpSubview(const SpMat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);
Chris@49 38 arma_inline SpSubview( SpMat<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 public:
Chris@49 41
Chris@49 42 inline ~SpSubview();
Chris@49 43
Chris@49 44 inline const SpSubview& operator+= (const eT val);
Chris@49 45 inline const SpSubview& operator-= (const eT val);
Chris@49 46 inline const SpSubview& operator*= (const eT val);
Chris@49 47 inline const SpSubview& operator/= (const eT val);
Chris@49 48
Chris@49 49 inline const SpSubview& operator=(const SpSubview& x);
Chris@49 50
Chris@49 51 template<typename T1> inline const SpSubview& operator= (const Base<eT, T1>& x);
Chris@49 52 template<typename T1> inline const SpSubview& operator+=(const Base<eT, T1>& x);
Chris@49 53 template<typename T1> inline const SpSubview& operator-=(const Base<eT, T1>& x);
Chris@49 54 template<typename T1> inline const SpSubview& operator*=(const Base<eT, T1>& x);
Chris@49 55 template<typename T1> inline const SpSubview& operator%=(const Base<eT, T1>& x);
Chris@49 56 template<typename T1> inline const SpSubview& operator/=(const Base<eT, T1>& x);
Chris@49 57
Chris@49 58 template<typename T1> inline const SpSubview& operator= (const SpBase<eT, T1>& x);
Chris@49 59 template<typename T1> inline const SpSubview& operator+=(const SpBase<eT, T1>& x);
Chris@49 60 template<typename T1> inline const SpSubview& operator-=(const SpBase<eT, T1>& x);
Chris@49 61 template<typename T1> inline const SpSubview& operator*=(const SpBase<eT, T1>& x);
Chris@49 62 template<typename T1> inline const SpSubview& operator%=(const SpBase<eT, T1>& x);
Chris@49 63 template<typename T1> inline const SpSubview& operator/=(const SpBase<eT, T1>& x);
Chris@49 64
Chris@49 65 /*
Chris@49 66 inline static void extract(SpMat<eT>& out, const SpSubview& in);
Chris@49 67
Chris@49 68 inline static void plus_inplace(Mat<eT>& out, const subview& in);
Chris@49 69 inline static void minus_inplace(Mat<eT>& out, const subview& in);
Chris@49 70 inline static void schur_inplace(Mat<eT>& out, const subview& in);
Chris@49 71 inline static void div_inplace(Mat<eT>& out, const subview& in);
Chris@49 72 */
Chris@49 73
Chris@49 74 inline void fill(const eT val);
Chris@49 75 inline void zeros();
Chris@49 76 inline void ones();
Chris@49 77 inline void eye();
Chris@49 78
Chris@49 79 arma_hot inline SpValProxy<SpSubview<eT> > operator[](const uword i);
Chris@49 80 arma_hot inline eT operator[](const uword i) const;
Chris@49 81
Chris@49 82 arma_hot inline SpValProxy<SpSubview<eT> > operator()(const uword i);
Chris@49 83 arma_hot inline eT operator()(const uword i) const;
Chris@49 84
Chris@49 85 arma_hot inline SpValProxy<SpSubview<eT> > operator()(const uword in_row, const uword in_col);
Chris@49 86 arma_hot inline eT operator()(const uword in_row, const uword in_col) const;
Chris@49 87
Chris@49 88 arma_hot inline SpValProxy<SpSubview<eT> > at(const uword i);
Chris@49 89 arma_hot inline eT at(const uword i) const;
Chris@49 90
Chris@49 91 arma_hot inline SpValProxy<SpSubview<eT> > at(const uword in_row, const uword in_col);
Chris@49 92 arma_hot inline eT at(const uword in_row, const uword in_col) const;
Chris@49 93
Chris@49 94 inline bool check_overlap(const SpSubview& x) const;
Chris@49 95
Chris@49 96 inline bool is_vec() const;
Chris@49 97
Chris@49 98 inline SpSubview row(const uword row_num);
Chris@49 99 inline const SpSubview row(const uword row_num) const;
Chris@49 100
Chris@49 101 inline SpSubview col(const uword col_num);
Chris@49 102 inline const SpSubview col(const uword col_num) const;
Chris@49 103
Chris@49 104 inline SpSubview rows(const uword in_row1, const uword in_row2);
Chris@49 105 inline const SpSubview rows(const uword in_row1, const uword in_row2) const;
Chris@49 106
Chris@49 107 inline SpSubview cols(const uword in_col1, const uword in_col2);
Chris@49 108 inline const SpSubview cols(const uword in_col1, const uword in_col2) const;
Chris@49 109
Chris@49 110 inline SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);
Chris@49 111 inline const SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;
Chris@49 112
Chris@49 113 inline SpSubview submat(const span& row_span, const span& col_span);
Chris@49 114 inline const SpSubview submat(const span& row_span, const span& col_span) const;
Chris@49 115
Chris@49 116 inline SpSubview operator()(const uword row_num, const span& col_span);
Chris@49 117 inline const SpSubview operator()(const uword row_num, const span& col_span) const;
Chris@49 118
Chris@49 119 inline SpSubview operator()(const span& row_span, const uword col_num);
Chris@49 120 inline const SpSubview operator()(const span& row_span, const uword col_num) const;
Chris@49 121
Chris@49 122 inline SpSubview operator()(const span& row_span, const span& col_span);
Chris@49 123 inline const SpSubview operator()(const span& row_span, const span& col_span) const;
Chris@49 124
Chris@49 125 /* not yet
Chris@49 126 inline SpSubview_row<eT> row(const uword row_num);
Chris@49 127 inline const SpSubview_row<eT> row(const uword row_num) const;
Chris@49 128
Chris@49 129 inline SpSubview_row<eT> operator()(const uword row_num, const span& col_span);
Chris@49 130 inline const SpSubview_row<eT> operator()(const uword row_num, const span& col_span) const;
Chris@49 131
Chris@49 132 inline SpSubview_col<eT> col(const uword col_num);
Chris@49 133 inline const SpSubview_col<eT> col(const uword col_num) const;
Chris@49 134
Chris@49 135 inline SpSubview_col<eT> operator()(const span& row_span, const uword col_num);
Chris@49 136 inline const SpSubview_col<eT> operator()(const span& row_span, const uword col_num) const;
Chris@49 137
Chris@49 138 inline Col<eT> unsafe_col(const uword col_num);
Chris@49 139 inline const Col<eT> unsafe_col(const uword col_num) const;
Chris@49 140
Chris@49 141 inline SpSubview<eT> rows(const uword in_row1, const uword in_row2);
Chris@49 142 inline const SpSubview<eT> rows(const uword in_row1, const uword in_row2) const;
Chris@49 143
Chris@49 144 inline SpSubview<eT> cols(const uword in_col1, const uword in_col2);
Chris@49 145 inline const SpSubview<eT> cols(const uword in_col1, const uword in_col2) const;
Chris@49 146
Chris@49 147 inline SpSubview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);
Chris@49 148 inline const SpSubview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;
Chris@49 149
Chris@49 150 inline SpSubview<eT> submat (const span& row_span, const span& col_span);
Chris@49 151 inline const SpSubview<eT> submat (const span& row_span, const span& col_span) const;
Chris@49 152
Chris@49 153 inline SpSubview<eT> operator()(const span& row_span, const span& col_span);
Chris@49 154 inline const SpSubview<eT> operator()(const span& row_span, const span& col_span) const;
Chris@49 155
Chris@49 156 inline diagview<eT> diag(const s32 in_id = 0);
Chris@49 157 inline const diagview<eT> diag(const s32 in_id = 0) const;
Chris@49 158 */
Chris@49 159
Chris@49 160 inline void swap_rows(const uword in_row1, const uword in_row2);
Chris@49 161 inline void swap_cols(const uword in_col1, const uword in_col2);
Chris@49 162
Chris@49 163 // Forward declarations.
Chris@49 164 class iterator_base;
Chris@49 165 class const_iterator;
Chris@49 166 class iterator;
Chris@49 167 class const_row_iterator;
Chris@49 168 class row_iterator;
Chris@49 169
Chris@49 170 // Similar to SpMat iterators but automatically iterates past and ignores values not in the subview.
Chris@49 171 class iterator_base
Chris@49 172 {
Chris@49 173 public:
Chris@49 174
Chris@49 175 inline iterator_base(const SpSubview& in_M);
Chris@49 176 inline iterator_base(const SpSubview& in_M, const uword col, const uword pos, const uword skip_pos);
Chris@49 177
Chris@49 178 inline eT operator*() const;
Chris@49 179
Chris@49 180 // Don't hold location internally; call "dummy" methods to get that information.
Chris@49 181 arma_inline uword row() const { return M.m.row_indices[internal_pos + skip_pos] - M.aux_row1; }
Chris@49 182 arma_inline uword col() const { return internal_col; }
Chris@49 183 arma_inline uword pos() const { return internal_pos; }
Chris@49 184
Chris@49 185 arma_aligned const SpSubview& M;
Chris@49 186 arma_aligned uword internal_col;
Chris@49 187 arma_aligned uword internal_pos;
Chris@49 188 arma_aligned uword skip_pos; // not used in row_iterator or const_row_iterator
Chris@49 189
Chris@49 190 // So that we satisfy the STL iterator types.
Chris@49 191 typedef std::bidirectional_iterator_tag iterator_category;
Chris@49 192 typedef eT value_type;
Chris@49 193 typedef uword difference_type; // not certain on this one
Chris@49 194 typedef const eT* pointer;
Chris@49 195 typedef const eT& reference;
Chris@49 196 };
Chris@49 197
Chris@49 198 class const_iterator : public iterator_base
Chris@49 199 {
Chris@49 200 public:
Chris@49 201
Chris@49 202 inline const_iterator(const SpSubview& in_M, uword initial_pos = 0);
Chris@49 203 inline const_iterator(const SpSubview& in_M, uword in_row, uword in_col);
Chris@49 204 inline const_iterator(const SpSubview& in_M, uword in_row, uword in_col, uword in_pos, uword skip_pos);
Chris@49 205 inline const_iterator(const const_iterator& other);
Chris@49 206
Chris@49 207 inline const_iterator& operator++();
Chris@49 208 inline const_iterator operator++(int);
Chris@49 209
Chris@49 210 inline const_iterator& operator--();
Chris@49 211 inline const_iterator operator--(int);
Chris@49 212
Chris@49 213 inline bool operator!=(const const_iterator& rhs) const;
Chris@49 214 inline bool operator==(const const_iterator& rhs) const;
Chris@49 215
Chris@49 216 inline bool operator!=(const typename SpMat<eT>::const_iterator& rhs) const;
Chris@49 217 inline bool operator==(const typename SpMat<eT>::const_iterator& rhs) const;
Chris@49 218
Chris@49 219 inline bool operator!=(const const_row_iterator& rhs) const;
Chris@49 220 inline bool operator==(const const_row_iterator& rhs) const;
Chris@49 221
Chris@49 222 inline bool operator!=(const typename SpMat<eT>::const_row_iterator& rhs) const;
Chris@49 223 inline bool operator==(const typename SpMat<eT>::const_row_iterator& rhs) const;
Chris@49 224 };
Chris@49 225
Chris@49 226 class iterator : public const_iterator
Chris@49 227 {
Chris@49 228 public:
Chris@49 229
Chris@49 230 inline iterator(SpSubview& in_M, const uword initial_pos = 0) : const_iterator(in_M, initial_pos) { }
Chris@49 231 inline iterator(SpSubview& in_M, const uword in_row, const uword in_col) : const_iterator(in_M, in_row, in_col) { }
Chris@49 232 inline iterator(SpSubview& in_M, const uword in_row, const uword in_col, const uword in_pos, const uword in_skip_pos) : const_iterator(in_M, in_row, in_col, in_pos, in_skip_pos) { }
Chris@49 233 inline iterator(const iterator& other) : const_iterator(other) { }
Chris@49 234
Chris@49 235 inline SpValProxy<SpSubview<eT> > operator*();
Chris@49 236
Chris@49 237 // overloads needed for return type correctness
Chris@49 238 inline iterator& operator++();
Chris@49 239 inline iterator operator++(int);
Chris@49 240
Chris@49 241 inline iterator& operator--();
Chris@49 242 inline iterator operator--(int);
Chris@49 243
Chris@49 244 // This has a different value_type than iterator_base.
Chris@49 245 typedef SpValProxy<SpSubview<eT> > value_type;
Chris@49 246 typedef const SpValProxy<SpSubview<eT> >* pointer;
Chris@49 247 typedef const SpValProxy<SpSubview<eT> >& reference;
Chris@49 248 };
Chris@49 249
Chris@49 250 class const_row_iterator : public iterator_base
Chris@49 251 {
Chris@49 252 public:
Chris@49 253
Chris@49 254 inline const_row_iterator(const SpSubview& in_M, uword initial_pos = 0);
Chris@49 255 inline const_row_iterator(const SpSubview& in_M, uword in_row, uword in_col);
Chris@49 256 inline const_row_iterator(const const_row_iterator& other);
Chris@49 257
Chris@49 258 inline const_row_iterator& operator++();
Chris@49 259 inline const_row_iterator operator++(int);
Chris@49 260
Chris@49 261 inline const_row_iterator& operator--();
Chris@49 262 inline const_row_iterator operator--(int);
Chris@49 263
Chris@49 264 uword internal_row; // Hold row internally because we use internal_pos differently.
Chris@49 265 uword actual_pos; // Actual position in subview's parent matrix.
Chris@49 266
Chris@49 267 arma_inline eT operator*() const { return iterator_base::M.m.values[actual_pos]; }
Chris@49 268
Chris@49 269 arma_inline uword row() const { return internal_row; }
Chris@49 270
Chris@49 271 inline bool operator!=(const const_iterator& rhs) const;
Chris@49 272 inline bool operator==(const const_iterator& rhs) const;
Chris@49 273
Chris@49 274 inline bool operator!=(const typename SpMat<eT>::const_iterator& rhs) const;
Chris@49 275 inline bool operator==(const typename SpMat<eT>::const_iterator& rhs) const;
Chris@49 276
Chris@49 277 inline bool operator!=(const const_row_iterator& rhs) const;
Chris@49 278 inline bool operator==(const const_row_iterator& rhs) const;
Chris@49 279
Chris@49 280 inline bool operator!=(const typename SpMat<eT>::const_row_iterator& rhs) const;
Chris@49 281 inline bool operator==(const typename SpMat<eT>::const_row_iterator& rhs) const;
Chris@49 282 };
Chris@49 283
Chris@49 284 class row_iterator : public const_row_iterator
Chris@49 285 {
Chris@49 286 public:
Chris@49 287
Chris@49 288 inline row_iterator(SpSubview& in_M, uword initial_pos = 0) : const_row_iterator(in_M, initial_pos) { }
Chris@49 289 inline row_iterator(SpSubview& in_M, uword in_row, uword in_col) : const_row_iterator(in_M, in_row, in_col) { }
Chris@49 290 inline row_iterator(const row_iterator& other) : const_row_iterator(other) { }
Chris@49 291
Chris@49 292 inline SpValProxy<SpSubview<eT> > operator*();
Chris@49 293
Chris@49 294 // overloads needed for return type correctness
Chris@49 295 inline row_iterator& operator++();
Chris@49 296 inline row_iterator operator++(int);
Chris@49 297
Chris@49 298 inline row_iterator& operator--();
Chris@49 299 inline row_iterator operator--(int);
Chris@49 300
Chris@49 301 // This has a different value_type than iterator_base.
Chris@49 302 typedef SpValProxy<SpSubview<eT> > value_type;
Chris@49 303 typedef const SpValProxy<SpSubview<eT> >* pointer;
Chris@49 304 typedef const SpValProxy<SpSubview<eT> >& reference;
Chris@49 305 };
Chris@49 306
Chris@49 307 inline iterator begin();
Chris@49 308 inline const_iterator begin() const;
Chris@49 309
Chris@49 310 inline iterator begin_col(const uword col_num);
Chris@49 311 inline const_iterator begin_col(const uword col_num) const;
Chris@49 312
Chris@49 313 inline row_iterator begin_row(const uword row_num = 0);
Chris@49 314 inline const_row_iterator begin_row(const uword row_num = 0) const;
Chris@49 315
Chris@49 316 inline iterator end();
Chris@49 317 inline const_iterator end() const;
Chris@49 318
Chris@49 319 inline row_iterator end_row();
Chris@49 320 inline const_row_iterator end_row() const;
Chris@49 321
Chris@49 322 inline row_iterator end_row(const uword row_num = 0);
Chris@49 323 inline const_row_iterator end_row(const uword row_num = 0) const;
Chris@49 324
Chris@49 325
Chris@49 326 private:
Chris@49 327 friend class SpMat<eT>;
Chris@49 328 SpSubview();
Chris@49 329
Chris@49 330 // For use by SpValProxy. We just update n_nonzero and pass the call on to the matrix.
Chris@49 331 inline arma_hot arma_warn_unused eT& add_element(const uword in_row, const uword in_col, const eT in_val = 0.0);
Chris@49 332 inline arma_hot void delete_element(const uword in_row, const uword in_col);
Chris@49 333
Chris@49 334 };
Chris@49 335
Chris@49 336 /*
Chris@49 337 template<typename eT>
Chris@49 338 class SpSubview_col : public SpSubview<eT>
Chris@49 339 {
Chris@49 340 public:
Chris@49 341
Chris@49 342 typedef eT elem_type;
Chris@49 343 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 344
Chris@49 345 inline void operator= (const SpSubview<eT>& x);
Chris@49 346 inline void operator= (const SpSubview_col& x);
Chris@49 347
Chris@49 348 template<typename T1>
Chris@49 349 inline void operator= (const Base<eT,T1>& x);
Chris@49 350
Chris@49 351 inline SpSubview_col<eT> rows(const uword in_row1, const uword in_row2);
Chris@49 352 inline const SpSubview_col<eT> rows(const uword in_row1, const uword in_row2) const;
Chris@49 353
Chris@49 354 inline SpSubview_col<eT> subvec(const uword in_row1, const uword in_row2);
Chris@49 355 inline const SpSubview_col<eT> subvec(const uword in_row1, const uword in_row2) const;
Chris@49 356
Chris@49 357
Chris@49 358 protected:
Chris@49 359
Chris@49 360 inline SpSubview_col(const Mat<eT>& in_m, const uword in_col);
Chris@49 361 inline SpSubview_col( Mat<eT>& in_m, const uword in_col);
Chris@49 362
Chris@49 363 inline SpSubview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);
Chris@49 364 inline SpSubview_col( Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);
Chris@49 365
Chris@49 366
Chris@49 367 private:
Chris@49 368
Chris@49 369 friend class Mat<eT>;
Chris@49 370 friend class Col<eT>;
Chris@49 371 friend class SpSubview<eT>;
Chris@49 372
Chris@49 373 SpSubview_col();
Chris@49 374 };
Chris@49 375
Chris@49 376 template<typename eT>
Chris@49 377 class SpSubview_row : public SpSubview<eT>
Chris@49 378 {
Chris@49 379 public:
Chris@49 380
Chris@49 381 typedef eT elem_type;
Chris@49 382 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 383
Chris@49 384 inline void operator= (const SpSubview<eT>& x);
Chris@49 385 inline void operator= (const SpSubview_row& x);
Chris@49 386
Chris@49 387 template<typename T1>
Chris@49 388 inline void operator= (const Base<eT,T1>& x);
Chris@49 389
Chris@49 390 inline SpSubview_row<eT> cols(const uword in_col1, const uword in_col2);
Chris@49 391 inline const SpSubview_row<eT> cols(const uword in_col1, const uword in_col2) const;
Chris@49 392
Chris@49 393 inline SpSubview_row<eT> subvec(const uword in_col1, const uword in_col2);
Chris@49 394 inline const SpSubview_row<eT> subvec(const uword in_col1, const uword in_col2) const;
Chris@49 395
Chris@49 396
Chris@49 397 protected:
Chris@49 398
Chris@49 399 inline SpSubview_row(const Mat<eT>& in_m, const uword in_row);
Chris@49 400 inline SpSubview_row( Mat<eT>& in_m, const uword in_row);
Chris@49 401
Chris@49 402 inline SpSubview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);
Chris@49 403 inline SpSubview_row( Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);
Chris@49 404
Chris@49 405
Chris@49 406 private:
Chris@49 407
Chris@49 408 friend class Mat<eT>;
Chris@49 409 friend class Row<eT>;
Chris@49 410 friend class SpSubview<eT>;
Chris@49 411
Chris@49 412 SpSubview_row();
Chris@49 413 };
Chris@49 414 */
Chris@49 415
Chris@49 416 //! @}