annotate armadillo-3.900.4/include/armadillo_bits/subview_field_meat.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-2012 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2008-2012 Conrad Sanderson
Chris@49 3 //
Chris@49 4 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 5 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 7
Chris@49 8
Chris@49 9 //! \addtogroup subview_field
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 template<typename oT>
Chris@49 14 inline
Chris@49 15 subview_field<oT>::~subview_field()
Chris@49 16 {
Chris@49 17 arma_extra_debug_sigprint();
Chris@49 18 }
Chris@49 19
Chris@49 20
Chris@49 21
Chris@49 22 template<typename oT>
Chris@49 23 arma_inline
Chris@49 24 subview_field<oT>::subview_field
Chris@49 25 (
Chris@49 26 const field<oT>& in_f,
Chris@49 27 const uword in_row1,
Chris@49 28 const uword in_col1,
Chris@49 29 const uword in_n_rows,
Chris@49 30 const uword in_n_cols
Chris@49 31 )
Chris@49 32 : f(in_f)
Chris@49 33 , aux_row1(in_row1)
Chris@49 34 , aux_col1(in_col1)
Chris@49 35 , n_rows(in_n_rows)
Chris@49 36 , n_cols(in_n_cols)
Chris@49 37 , n_elem(in_n_rows*in_n_cols)
Chris@49 38 {
Chris@49 39 arma_extra_debug_sigprint();
Chris@49 40 }
Chris@49 41
Chris@49 42
Chris@49 43
Chris@49 44 template<typename oT>
Chris@49 45 inline
Chris@49 46 void
Chris@49 47 subview_field<oT>::operator= (const field<oT>& x)
Chris@49 48 {
Chris@49 49 arma_extra_debug_sigprint();
Chris@49 50
Chris@49 51 subview_field<oT>& t = *this;
Chris@49 52
Chris@49 53 arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions");
Chris@49 54
Chris@49 55 for(uword col=0; col<t.n_cols; ++col)
Chris@49 56 {
Chris@49 57 for(uword row=0; row<t.n_rows; ++row)
Chris@49 58 {
Chris@49 59 t.at(row,col) = x.at(row,col);
Chris@49 60 }
Chris@49 61 }
Chris@49 62 }
Chris@49 63
Chris@49 64
Chris@49 65
Chris@49 66 //! x.subfield(...) = y.subfield(...)
Chris@49 67 template<typename oT>
Chris@49 68 inline
Chris@49 69 void
Chris@49 70 subview_field<oT>::operator= (const subview_field<oT>& x_in)
Chris@49 71 {
Chris@49 72 arma_extra_debug_sigprint();
Chris@49 73
Chris@49 74 const bool overlap = check_overlap(x_in);
Chris@49 75
Chris@49 76 field<oT>* tmp_field = overlap ? new field<oT>(x_in.f) : 0;
Chris@49 77 const subview_field<oT>* tmp_subview = overlap ? new subview_field<oT>(*tmp_field, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
Chris@49 78 const subview_field<oT>& x = overlap ? (*tmp_subview) : x_in;
Chris@49 79
Chris@49 80 subview_field<oT>& t = *this;
Chris@49 81
Chris@49 82 arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions");
Chris@49 83
Chris@49 84 for(uword col=0; col<t.n_cols; ++col)
Chris@49 85 {
Chris@49 86 for(uword row=0; row<t.n_rows; ++row)
Chris@49 87 {
Chris@49 88 t.at(row,col) = x.at(row,col);
Chris@49 89 }
Chris@49 90 }
Chris@49 91
Chris@49 92 if(overlap)
Chris@49 93 {
Chris@49 94 delete tmp_subview;
Chris@49 95 delete tmp_field;
Chris@49 96 }
Chris@49 97 }
Chris@49 98
Chris@49 99
Chris@49 100
Chris@49 101 template<typename oT>
Chris@49 102 arma_inline
Chris@49 103 oT&
Chris@49 104 subview_field<oT>::operator[](const uword i)
Chris@49 105 {
Chris@49 106 const uword in_col = i / n_rows;
Chris@49 107 const uword in_row = i % n_rows;
Chris@49 108
Chris@49 109 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 110
Chris@49 111 return *((const_cast< field<oT>& >(f)).mem[index]);
Chris@49 112 }
Chris@49 113
Chris@49 114
Chris@49 115
Chris@49 116 template<typename oT>
Chris@49 117 arma_inline
Chris@49 118 const oT&
Chris@49 119 subview_field<oT>::operator[](const uword i) const
Chris@49 120 {
Chris@49 121 const uword in_col = i / n_rows;
Chris@49 122 const uword in_row = i % n_rows;
Chris@49 123
Chris@49 124 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 125
Chris@49 126 return *(f.mem[index]);
Chris@49 127 }
Chris@49 128
Chris@49 129
Chris@49 130
Chris@49 131 template<typename oT>
Chris@49 132 arma_inline
Chris@49 133 oT&
Chris@49 134 subview_field<oT>::operator()(const uword i)
Chris@49 135 {
Chris@49 136 arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds");
Chris@49 137
Chris@49 138 const uword in_col = i / n_rows;
Chris@49 139 const uword in_row = i % n_rows;
Chris@49 140
Chris@49 141 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 142
Chris@49 143 return *((const_cast< field<oT>& >(f)).mem[index]);
Chris@49 144 }
Chris@49 145
Chris@49 146
Chris@49 147
Chris@49 148 template<typename oT>
Chris@49 149 arma_inline
Chris@49 150 const oT&
Chris@49 151 subview_field<oT>::operator()(const uword i) const
Chris@49 152 {
Chris@49 153 arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds");
Chris@49 154
Chris@49 155 const uword in_col = i / n_rows;
Chris@49 156 const uword in_row = i % n_rows;
Chris@49 157
Chris@49 158 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 159
Chris@49 160 return *(f.mem[index]);
Chris@49 161 }
Chris@49 162
Chris@49 163
Chris@49 164
Chris@49 165 template<typename oT>
Chris@49 166 arma_inline
Chris@49 167 oT&
Chris@49 168 subview_field<oT>::operator()(const uword in_row, const uword in_col)
Chris@49 169 {
Chris@49 170 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds");
Chris@49 171
Chris@49 172 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 173
Chris@49 174 return *((const_cast< field<oT>& >(f)).mem[index]);
Chris@49 175 }
Chris@49 176
Chris@49 177
Chris@49 178
Chris@49 179 template<typename oT>
Chris@49 180 arma_inline
Chris@49 181 const oT&
Chris@49 182 subview_field<oT>::operator()(const uword in_row, const uword in_col) const
Chris@49 183 {
Chris@49 184 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds");
Chris@49 185
Chris@49 186 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 187
Chris@49 188 return *(f.mem[index]);
Chris@49 189 }
Chris@49 190
Chris@49 191
Chris@49 192
Chris@49 193 template<typename oT>
Chris@49 194 arma_inline
Chris@49 195 oT&
Chris@49 196 subview_field<oT>::at(const uword in_row, const uword in_col)
Chris@49 197 {
Chris@49 198 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 199
Chris@49 200 return *((const_cast< field<oT>& >(f)).mem[index]);
Chris@49 201 }
Chris@49 202
Chris@49 203
Chris@49 204
Chris@49 205 template<typename oT>
Chris@49 206 arma_inline
Chris@49 207 const oT&
Chris@49 208 subview_field<oT>::at(const uword in_row, const uword in_col) const
Chris@49 209 {
Chris@49 210 //arma_extra_debug_sigprint();
Chris@49 211
Chris@49 212 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
Chris@49 213
Chris@49 214 return *(f.mem[index]);
Chris@49 215 }
Chris@49 216
Chris@49 217
Chris@49 218
Chris@49 219 template<typename oT>
Chris@49 220 inline
Chris@49 221 bool
Chris@49 222 subview_field<oT>::check_overlap(const subview_field<oT>& x) const
Chris@49 223 {
Chris@49 224 const subview_field<oT>& t = *this;
Chris@49 225
Chris@49 226 if(&t.f != &x.f)
Chris@49 227 {
Chris@49 228 return false;
Chris@49 229 }
Chris@49 230 else
Chris@49 231 {
Chris@49 232 if( (t.n_elem == 0) || (x.n_elem == 0) )
Chris@49 233 {
Chris@49 234 return false;
Chris@49 235 }
Chris@49 236 else
Chris@49 237 {
Chris@49 238 const uword t_row_start = t.aux_row1;
Chris@49 239 const uword t_row_end_p1 = t_row_start + t.n_rows;
Chris@49 240
Chris@49 241 const uword t_col_start = t.aux_col1;
Chris@49 242 const uword t_col_end_p1 = t_col_start + t.n_cols;
Chris@49 243
Chris@49 244
Chris@49 245 const uword x_row_start = x.aux_row1;
Chris@49 246 const uword x_row_end_p1 = x_row_start + x.n_rows;
Chris@49 247
Chris@49 248 const uword x_col_start = x.aux_col1;
Chris@49 249 const uword x_col_end_p1 = x_col_start + x.n_cols;
Chris@49 250
Chris@49 251
Chris@49 252 const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) );
Chris@49 253 const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) );
Chris@49 254
Chris@49 255 return ( (outside_rows == false) && (outside_cols == false) );
Chris@49 256 }
Chris@49 257 }
Chris@49 258 }
Chris@49 259
Chris@49 260
Chris@49 261
Chris@49 262 //! X = Y.subfield(...)
Chris@49 263 template<typename oT>
Chris@49 264 inline
Chris@49 265 void
Chris@49 266 subview_field<oT>::extract(field<oT>& actual_out, const subview_field<oT>& in)
Chris@49 267 {
Chris@49 268 arma_extra_debug_sigprint();
Chris@49 269
Chris@49 270 //
Chris@49 271 const bool alias = (&actual_out == &in.f);
Chris@49 272
Chris@49 273 field<oT>* tmp = (alias) ? new field<oT> : 0;
Chris@49 274 field<oT>& out = (alias) ? (*tmp) : actual_out;
Chris@49 275
Chris@49 276 //
Chris@49 277
Chris@49 278 const uword n_rows = in.n_rows;
Chris@49 279 const uword n_cols = in.n_cols;
Chris@49 280
Chris@49 281 out.set_size(n_rows, n_cols);
Chris@49 282
Chris@49 283 arma_extra_debug_print(arma_boost::format("out.n_rows = %d out.n_cols = %d in.m.n_rows = %d in.m.n_cols = %d") % out.n_rows % out.n_cols % in.f.n_rows % in.f.n_cols );
Chris@49 284
Chris@49 285 for(uword col = 0; col<n_cols; ++col)
Chris@49 286 {
Chris@49 287 for(uword row = 0; row<n_rows; ++row)
Chris@49 288 {
Chris@49 289 out.at(row,col) = in.at(row,col);
Chris@49 290 }
Chris@49 291 }
Chris@49 292
Chris@49 293
Chris@49 294 if(alias)
Chris@49 295 {
Chris@49 296 actual_out = out;
Chris@49 297 delete tmp;
Chris@49 298 }
Chris@49 299
Chris@49 300 }
Chris@49 301
Chris@49 302
Chris@49 303
Chris@49 304 //! @}