annotate armadillo-3.900.4/include/armadillo_bits/subview_elem2_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) 2012-2013 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2012-2013 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_elem2
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 template<typename eT, typename T1, typename T2>
Chris@49 14 inline
Chris@49 15 subview_elem2<eT,T1,T2>::~subview_elem2()
Chris@49 16 {
Chris@49 17 arma_extra_debug_sigprint();
Chris@49 18 }
Chris@49 19
Chris@49 20
Chris@49 21 template<typename eT, typename T1, typename T2>
Chris@49 22 arma_inline
Chris@49 23 subview_elem2<eT,T1,T2>::subview_elem2
Chris@49 24 (
Chris@49 25 const Mat<eT>& in_m,
Chris@49 26 const Base<uword,T1>& in_ri,
Chris@49 27 const Base<uword,T2>& in_ci,
Chris@49 28 const bool in_all_rows,
Chris@49 29 const bool in_all_cols
Chris@49 30 )
Chris@49 31 : m (in_m )
Chris@49 32 , base_ri (in_ri )
Chris@49 33 , base_ci (in_ci )
Chris@49 34 , all_rows (in_all_rows)
Chris@49 35 , all_cols (in_all_cols)
Chris@49 36 {
Chris@49 37 arma_extra_debug_sigprint();
Chris@49 38 }
Chris@49 39
Chris@49 40
Chris@49 41
Chris@49 42 template<typename eT, typename T1, typename T2>
Chris@49 43 template<typename op_type>
Chris@49 44 inline
Chris@49 45 void
Chris@49 46 subview_elem2<eT,T1,T2>::inplace_op(const eT val)
Chris@49 47 {
Chris@49 48 arma_extra_debug_sigprint();
Chris@49 49
Chris@49 50 Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
Chris@49 51
Chris@49 52 const uword m_n_rows = m_local.n_rows;
Chris@49 53 const uword m_n_cols = m_local.n_cols;
Chris@49 54
Chris@49 55 if( (all_rows == false) && (all_cols == false) )
Chris@49 56 {
Chris@49 57 const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
Chris@49 58 const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
Chris@49 59
Chris@49 60 const umat& ri = tmp1.M;
Chris@49 61 const umat& ci = tmp2.M;
Chris@49 62
Chris@49 63 arma_debug_check
Chris@49 64 (
Chris@49 65 ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ),
Chris@49 66 "Mat::elem(): given object is not a vector"
Chris@49 67 );
Chris@49 68
Chris@49 69 const uword* ri_mem = ri.memptr();
Chris@49 70 const uword ri_n_elem = ri.n_elem;
Chris@49 71
Chris@49 72 const uword* ci_mem = ci.memptr();
Chris@49 73 const uword ci_n_elem = ci.n_elem;
Chris@49 74
Chris@49 75 for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
Chris@49 76 {
Chris@49 77 const uword col = ci_mem[ci_count];
Chris@49 78
Chris@49 79 arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" );
Chris@49 80
Chris@49 81 for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
Chris@49 82 {
Chris@49 83 const uword row = ri_mem[ri_count];
Chris@49 84
Chris@49 85 arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" );
Chris@49 86
Chris@49 87 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_local.at(row,col) = val; }
Chris@49 88 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_local.at(row,col) += val; }
Chris@49 89 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_local.at(row,col) -= val; }
Chris@49 90 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_local.at(row,col) *= val; }
Chris@49 91 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_local.at(row,col) /= val; }
Chris@49 92 }
Chris@49 93 }
Chris@49 94 }
Chris@49 95 else
Chris@49 96 if( (all_rows == true) && (all_cols == false) )
Chris@49 97 {
Chris@49 98 const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
Chris@49 99
Chris@49 100 const umat& ci = tmp2.M;
Chris@49 101
Chris@49 102 arma_debug_check
Chris@49 103 (
Chris@49 104 ( (ci.is_vec() == false) && (ci.is_empty() == false) ),
Chris@49 105 "Mat::elem(): given object is not a vector"
Chris@49 106 );
Chris@49 107
Chris@49 108 const uword* ci_mem = ci.memptr();
Chris@49 109 const uword ci_n_elem = ci.n_elem;
Chris@49 110
Chris@49 111 for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
Chris@49 112 {
Chris@49 113 const uword col = ci_mem[ci_count];
Chris@49 114
Chris@49 115 arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" );
Chris@49 116
Chris@49 117 eT* colptr = m_local.colptr(col);
Chris@49 118
Chris@49 119 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { arrayops::inplace_set (colptr, val, m_n_rows); }
Chris@49 120 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { arrayops::inplace_plus (colptr, val, m_n_rows); }
Chris@49 121 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { arrayops::inplace_minus(colptr, val, m_n_rows); }
Chris@49 122 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { arrayops::inplace_mul (colptr, val, m_n_rows); }
Chris@49 123 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { arrayops::inplace_div (colptr, val, m_n_rows); }
Chris@49 124 }
Chris@49 125 }
Chris@49 126 else
Chris@49 127 if( (all_rows == false) && (all_cols == true) )
Chris@49 128 {
Chris@49 129 const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
Chris@49 130
Chris@49 131 const umat& ri = tmp1.M;
Chris@49 132
Chris@49 133 arma_debug_check
Chris@49 134 (
Chris@49 135 ( (ri.is_vec() == false) && (ri.is_empty() == false) ),
Chris@49 136 "Mat::elem(): given object is not a vector"
Chris@49 137 );
Chris@49 138
Chris@49 139 const uword* ri_mem = ri.memptr();
Chris@49 140 const uword ri_n_elem = ri.n_elem;
Chris@49 141
Chris@49 142 for(uword col=0; col < m_n_cols; ++col)
Chris@49 143 {
Chris@49 144 for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
Chris@49 145 {
Chris@49 146 const uword row = ri_mem[ri_count];
Chris@49 147
Chris@49 148 arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" );
Chris@49 149
Chris@49 150 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_local.at(row,col) = val; }
Chris@49 151 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_local.at(row,col) += val; }
Chris@49 152 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_local.at(row,col) -= val; }
Chris@49 153 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_local.at(row,col) *= val; }
Chris@49 154 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_local.at(row,col) /= val; }
Chris@49 155 }
Chris@49 156 }
Chris@49 157 }
Chris@49 158 }
Chris@49 159
Chris@49 160
Chris@49 161
Chris@49 162 template<typename eT, typename T1, typename T2>
Chris@49 163 template<typename op_type, typename expr>
Chris@49 164 inline
Chris@49 165 void
Chris@49 166 subview_elem2<eT,T1,T2>::inplace_op(const Base<eT,expr>& x)
Chris@49 167 {
Chris@49 168 arma_extra_debug_sigprint();
Chris@49 169
Chris@49 170 Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
Chris@49 171
Chris@49 172 const uword m_n_rows = m_local.n_rows;
Chris@49 173 const uword m_n_cols = m_local.n_cols;
Chris@49 174
Chris@49 175 const unwrap_check<expr> tmp(x.get_ref(), m_local);
Chris@49 176 const Mat<eT>& X = tmp.M;
Chris@49 177
Chris@49 178 if( (all_rows == false) && (all_cols == false) )
Chris@49 179 {
Chris@49 180 const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
Chris@49 181 const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
Chris@49 182
Chris@49 183 const umat& ri = tmp1.M;
Chris@49 184 const umat& ci = tmp2.M;
Chris@49 185
Chris@49 186 arma_debug_check
Chris@49 187 (
Chris@49 188 ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ),
Chris@49 189 "Mat::elem(): given object is not a vector"
Chris@49 190 );
Chris@49 191
Chris@49 192 const uword* ri_mem = ri.memptr();
Chris@49 193 const uword ri_n_elem = ri.n_elem;
Chris@49 194
Chris@49 195 const uword* ci_mem = ci.memptr();
Chris@49 196 const uword ci_n_elem = ci.n_elem;
Chris@49 197
Chris@49 198 arma_debug_assert_same_size( ri_n_elem, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" );
Chris@49 199
Chris@49 200 for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
Chris@49 201 {
Chris@49 202 const uword col = ci_mem[ci_count];
Chris@49 203
Chris@49 204 arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" );
Chris@49 205
Chris@49 206 for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
Chris@49 207 {
Chris@49 208 const uword row = ri_mem[ri_count];
Chris@49 209
Chris@49 210 arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" );
Chris@49 211
Chris@49 212 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_local.at(row,col) = X.at(ri_count, ci_count); }
Chris@49 213 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_local.at(row,col) += X.at(ri_count, ci_count); }
Chris@49 214 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_local.at(row,col) -= X.at(ri_count, ci_count); }
Chris@49 215 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_local.at(row,col) *= X.at(ri_count, ci_count); }
Chris@49 216 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_local.at(row,col) /= X.at(ri_count, ci_count); }
Chris@49 217 }
Chris@49 218 }
Chris@49 219 }
Chris@49 220 else
Chris@49 221 if( (all_rows == true) && (all_cols == false) )
Chris@49 222 {
Chris@49 223 const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
Chris@49 224
Chris@49 225 const umat& ci = tmp2.M;
Chris@49 226
Chris@49 227 arma_debug_check
Chris@49 228 (
Chris@49 229 ( (ci.is_vec() == false) && (ci.is_empty() == false) ),
Chris@49 230 "Mat::elem(): given object is not a vector"
Chris@49 231 );
Chris@49 232
Chris@49 233 const uword* ci_mem = ci.memptr();
Chris@49 234 const uword ci_n_elem = ci.n_elem;
Chris@49 235
Chris@49 236 arma_debug_assert_same_size( m_n_rows, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" );
Chris@49 237
Chris@49 238 for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
Chris@49 239 {
Chris@49 240 const uword col = ci_mem[ci_count];
Chris@49 241
Chris@49 242 arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" );
Chris@49 243
Chris@49 244 eT* m_colptr = m_local.colptr(col);
Chris@49 245 const eT* X_colptr = X.colptr(ci_count);
Chris@49 246
Chris@49 247 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { arrayops::copy (m_colptr, X_colptr, m_n_rows); }
Chris@49 248 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { arrayops::inplace_plus (m_colptr, X_colptr, m_n_rows); }
Chris@49 249 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { arrayops::inplace_minus(m_colptr, X_colptr, m_n_rows); }
Chris@49 250 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { arrayops::inplace_mul (m_colptr, X_colptr, m_n_rows); }
Chris@49 251 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { arrayops::inplace_div (m_colptr, X_colptr, m_n_rows); }
Chris@49 252 }
Chris@49 253 }
Chris@49 254 else
Chris@49 255 if( (all_rows == false) && (all_cols == true) )
Chris@49 256 {
Chris@49 257 const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
Chris@49 258
Chris@49 259 const umat& ri = tmp1.M;
Chris@49 260
Chris@49 261 arma_debug_check
Chris@49 262 (
Chris@49 263 ( (ri.is_vec() == false) && (ri.is_empty() == false) ),
Chris@49 264 "Mat::elem(): given object is not a vector"
Chris@49 265 );
Chris@49 266
Chris@49 267 const uword* ri_mem = ri.memptr();
Chris@49 268 const uword ri_n_elem = ri.n_elem;
Chris@49 269
Chris@49 270 arma_debug_assert_same_size( ri_n_elem, m_n_cols, X.n_rows, X.n_cols, "Mat::elem()" );
Chris@49 271
Chris@49 272 for(uword col=0; col < m_n_cols; ++col)
Chris@49 273 {
Chris@49 274 for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
Chris@49 275 {
Chris@49 276 const uword row = ri_mem[ri_count];
Chris@49 277
Chris@49 278 arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" );
Chris@49 279
Chris@49 280 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_local.at(row,col) = X.at(ri_count, col); }
Chris@49 281 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_local.at(row,col) += X.at(ri_count, col); }
Chris@49 282 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_local.at(row,col) -= X.at(ri_count, col); }
Chris@49 283 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_local.at(row,col) *= X.at(ri_count, col); }
Chris@49 284 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_local.at(row,col) /= X.at(ri_count, col); }
Chris@49 285 }
Chris@49 286 }
Chris@49 287 }
Chris@49 288 }
Chris@49 289
Chris@49 290
Chris@49 291
Chris@49 292 //
Chris@49 293 //
Chris@49 294
Chris@49 295
Chris@49 296
Chris@49 297 template<typename eT, typename T1, typename T2>
Chris@49 298 inline
Chris@49 299 void
Chris@49 300 subview_elem2<eT,T1,T2>::fill(const eT val)
Chris@49 301 {
Chris@49 302 arma_extra_debug_sigprint();
Chris@49 303
Chris@49 304 inplace_op<op_subview_elem_equ>(val);
Chris@49 305 }
Chris@49 306
Chris@49 307
Chris@49 308
Chris@49 309 template<typename eT, typename T1, typename T2>
Chris@49 310 inline
Chris@49 311 void
Chris@49 312 subview_elem2<eT,T1,T2>::zeros()
Chris@49 313 {
Chris@49 314 arma_extra_debug_sigprint();
Chris@49 315
Chris@49 316 inplace_op<op_subview_elem_equ>(eT(0));
Chris@49 317 }
Chris@49 318
Chris@49 319
Chris@49 320
Chris@49 321 template<typename eT, typename T1, typename T2>
Chris@49 322 inline
Chris@49 323 void
Chris@49 324 subview_elem2<eT,T1,T2>::ones()
Chris@49 325 {
Chris@49 326 arma_extra_debug_sigprint();
Chris@49 327
Chris@49 328 inplace_op<op_subview_elem_equ>(eT(1));
Chris@49 329 }
Chris@49 330
Chris@49 331
Chris@49 332
Chris@49 333 template<typename eT, typename T1, typename T2>
Chris@49 334 inline
Chris@49 335 void
Chris@49 336 subview_elem2<eT,T1,T2>::operator+= (const eT val)
Chris@49 337 {
Chris@49 338 arma_extra_debug_sigprint();
Chris@49 339
Chris@49 340 inplace_op<op_subview_elem_inplace_plus>(val);
Chris@49 341 }
Chris@49 342
Chris@49 343
Chris@49 344
Chris@49 345 template<typename eT, typename T1, typename T2>
Chris@49 346 inline
Chris@49 347 void
Chris@49 348 subview_elem2<eT,T1,T2>::operator-= (const eT val)
Chris@49 349 {
Chris@49 350 arma_extra_debug_sigprint();
Chris@49 351
Chris@49 352 inplace_op<op_subview_elem_inplace_minus>(val);
Chris@49 353 }
Chris@49 354
Chris@49 355
Chris@49 356
Chris@49 357 template<typename eT, typename T1, typename T2>
Chris@49 358 inline
Chris@49 359 void
Chris@49 360 subview_elem2<eT,T1,T2>::operator*= (const eT val)
Chris@49 361 {
Chris@49 362 arma_extra_debug_sigprint();
Chris@49 363
Chris@49 364 inplace_op<op_subview_elem_inplace_schur>(val);
Chris@49 365 }
Chris@49 366
Chris@49 367
Chris@49 368
Chris@49 369 template<typename eT, typename T1, typename T2>
Chris@49 370 inline
Chris@49 371 void
Chris@49 372 subview_elem2<eT,T1,T2>::operator/= (const eT val)
Chris@49 373 {
Chris@49 374 arma_extra_debug_sigprint();
Chris@49 375
Chris@49 376 inplace_op<op_subview_elem_inplace_div>(val);
Chris@49 377 }
Chris@49 378
Chris@49 379
Chris@49 380
Chris@49 381 //
Chris@49 382 //
Chris@49 383
Chris@49 384
Chris@49 385
Chris@49 386 template<typename eT, typename T1, typename T2>
Chris@49 387 template<typename T3, typename T4>
Chris@49 388 inline
Chris@49 389 void
Chris@49 390 subview_elem2<eT,T1,T2>::operator_equ(const subview_elem2<eT,T3,T4>& x)
Chris@49 391 {
Chris@49 392 arma_extra_debug_sigprint();
Chris@49 393
Chris@49 394 inplace_op<op_subview_elem_equ>(x);
Chris@49 395 }
Chris@49 396
Chris@49 397
Chris@49 398
Chris@49 399
Chris@49 400 template<typename eT, typename T1, typename T2>
Chris@49 401 template<typename T3, typename T4>
Chris@49 402 inline
Chris@49 403 void
Chris@49 404 subview_elem2<eT,T1,T2>::operator= (const subview_elem2<eT,T3,T4>& x)
Chris@49 405 {
Chris@49 406 arma_extra_debug_sigprint();
Chris@49 407
Chris@49 408 (*this).operator_equ(x);
Chris@49 409 }
Chris@49 410
Chris@49 411
Chris@49 412
Chris@49 413 //! work around compiler bugs
Chris@49 414 template<typename eT, typename T1, typename T2>
Chris@49 415 inline
Chris@49 416 void
Chris@49 417 subview_elem2<eT,T1,T2>::operator= (const subview_elem2<eT,T1,T2>& x)
Chris@49 418 {
Chris@49 419 arma_extra_debug_sigprint();
Chris@49 420
Chris@49 421 (*this).operator_equ(x);
Chris@49 422 }
Chris@49 423
Chris@49 424
Chris@49 425
Chris@49 426 template<typename eT, typename T1, typename T2>
Chris@49 427 template<typename T3, typename T4>
Chris@49 428 inline
Chris@49 429 void
Chris@49 430 subview_elem2<eT,T1,T2>::operator+= (const subview_elem2<eT,T3,T4>& x)
Chris@49 431 {
Chris@49 432 arma_extra_debug_sigprint();
Chris@49 433
Chris@49 434 inplace_op<op_subview_elem_inplace_plus>(x);
Chris@49 435 }
Chris@49 436
Chris@49 437
Chris@49 438
Chris@49 439 template<typename eT, typename T1, typename T2>
Chris@49 440 template<typename T3, typename T4>
Chris@49 441 inline
Chris@49 442 void
Chris@49 443 subview_elem2<eT,T1,T2>::operator-= (const subview_elem2<eT,T3,T4>& x)
Chris@49 444 {
Chris@49 445 arma_extra_debug_sigprint();
Chris@49 446
Chris@49 447 inplace_op<op_subview_elem_inplace_minus>(x);
Chris@49 448 }
Chris@49 449
Chris@49 450
Chris@49 451
Chris@49 452 template<typename eT, typename T1, typename T2>
Chris@49 453 template<typename T3, typename T4>
Chris@49 454 inline
Chris@49 455 void
Chris@49 456 subview_elem2<eT,T1,T2>::operator%= (const subview_elem2<eT,T3,T4>& x)
Chris@49 457 {
Chris@49 458 arma_extra_debug_sigprint();
Chris@49 459
Chris@49 460 inplace_op<op_subview_elem_inplace_schur>(x);
Chris@49 461 }
Chris@49 462
Chris@49 463
Chris@49 464
Chris@49 465 template<typename eT, typename T1, typename T2>
Chris@49 466 template<typename T3, typename T4>
Chris@49 467 inline
Chris@49 468 void
Chris@49 469 subview_elem2<eT,T1,T2>::operator/= (const subview_elem2<eT,T3,T4>& x)
Chris@49 470 {
Chris@49 471 arma_extra_debug_sigprint();
Chris@49 472
Chris@49 473 inplace_op<op_subview_elem_inplace_div>(x);
Chris@49 474 }
Chris@49 475
Chris@49 476
Chris@49 477
Chris@49 478 template<typename eT, typename T1, typename T2>
Chris@49 479 template<typename expr>
Chris@49 480 inline
Chris@49 481 void
Chris@49 482 subview_elem2<eT,T1,T2>::operator= (const Base<eT,expr>& x)
Chris@49 483 {
Chris@49 484 arma_extra_debug_sigprint();
Chris@49 485
Chris@49 486 inplace_op<op_subview_elem_equ>(x);
Chris@49 487 }
Chris@49 488
Chris@49 489
Chris@49 490
Chris@49 491 template<typename eT, typename T1, typename T2>
Chris@49 492 template<typename expr>
Chris@49 493 inline
Chris@49 494 void
Chris@49 495 subview_elem2<eT,T1,T2>::operator+= (const Base<eT,expr>& x)
Chris@49 496 {
Chris@49 497 arma_extra_debug_sigprint();
Chris@49 498
Chris@49 499 inplace_op<op_subview_elem_inplace_plus>(x);
Chris@49 500 }
Chris@49 501
Chris@49 502
Chris@49 503
Chris@49 504 template<typename eT, typename T1, typename T2>
Chris@49 505 template<typename expr>
Chris@49 506 inline
Chris@49 507 void
Chris@49 508 subview_elem2<eT,T1,T2>::operator-= (const Base<eT,expr>& x)
Chris@49 509 {
Chris@49 510 arma_extra_debug_sigprint();
Chris@49 511
Chris@49 512 inplace_op<op_subview_elem_inplace_minus>(x);
Chris@49 513 }
Chris@49 514
Chris@49 515
Chris@49 516
Chris@49 517 template<typename eT, typename T1, typename T2>
Chris@49 518 template<typename expr>
Chris@49 519 inline
Chris@49 520 void
Chris@49 521 subview_elem2<eT,T1,T2>::operator%= (const Base<eT,expr>& x)
Chris@49 522 {
Chris@49 523 arma_extra_debug_sigprint();
Chris@49 524
Chris@49 525 inplace_op<op_subview_elem_inplace_schur>(x);
Chris@49 526 }
Chris@49 527
Chris@49 528
Chris@49 529
Chris@49 530 template<typename eT, typename T1, typename T2>
Chris@49 531 template<typename expr>
Chris@49 532 inline
Chris@49 533 void
Chris@49 534 subview_elem2<eT,T1,T2>::operator/= (const Base<eT,expr>& x)
Chris@49 535 {
Chris@49 536 arma_extra_debug_sigprint();
Chris@49 537
Chris@49 538 inplace_op<op_subview_elem_inplace_div>(x);
Chris@49 539 }
Chris@49 540
Chris@49 541
Chris@49 542
Chris@49 543 //
Chris@49 544 //
Chris@49 545
Chris@49 546
Chris@49 547
Chris@49 548 template<typename eT, typename T1, typename T2>
Chris@49 549 inline
Chris@49 550 void
Chris@49 551 subview_elem2<eT,T1,T2>::extract(Mat<eT>& actual_out, const subview_elem2<eT,T1,T2>& in)
Chris@49 552 {
Chris@49 553 arma_extra_debug_sigprint();
Chris@49 554
Chris@49 555 Mat<eT>& m_local = const_cast< Mat<eT>& >(in.m);
Chris@49 556
Chris@49 557 const uword m_n_rows = m_local.n_rows;
Chris@49 558 const uword m_n_cols = m_local.n_cols;
Chris@49 559
Chris@49 560 const bool alias = (&actual_out == &m_local);
Chris@49 561
Chris@49 562 arma_extra_debug_warn(alias, "subview_elem2::extract(): aliasing detected");
Chris@49 563
Chris@49 564 Mat<eT>* tmp_out = alias ? new Mat<eT>() : 0;
Chris@49 565 Mat<eT>& out = alias ? *tmp_out : actual_out;
Chris@49 566
Chris@49 567 if( (in.all_rows == false) && (in.all_cols == false) )
Chris@49 568 {
Chris@49 569 const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), actual_out);
Chris@49 570 const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), actual_out);
Chris@49 571
Chris@49 572 const umat& ri = tmp1.M;
Chris@49 573 const umat& ci = tmp2.M;
Chris@49 574
Chris@49 575 arma_debug_check
Chris@49 576 (
Chris@49 577 ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ),
Chris@49 578 "Mat::elem(): given object is not a vector"
Chris@49 579 );
Chris@49 580
Chris@49 581 const uword* ri_mem = ri.memptr();
Chris@49 582 const uword ri_n_elem = ri.n_elem;
Chris@49 583
Chris@49 584 const uword* ci_mem = ci.memptr();
Chris@49 585 const uword ci_n_elem = ci.n_elem;
Chris@49 586
Chris@49 587 out.set_size(ri_n_elem, ci_n_elem);
Chris@49 588
Chris@49 589 eT* out_mem = out.memptr();
Chris@49 590 uword out_count = 0;
Chris@49 591
Chris@49 592 for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
Chris@49 593 {
Chris@49 594 const uword col = ci_mem[ci_count];
Chris@49 595
Chris@49 596 arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" );
Chris@49 597
Chris@49 598 for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
Chris@49 599 {
Chris@49 600 const uword row = ri_mem[ri_count];
Chris@49 601
Chris@49 602 arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" );
Chris@49 603
Chris@49 604 out_mem[out_count] = m_local.at(row,col);
Chris@49 605 ++out_count;
Chris@49 606 }
Chris@49 607 }
Chris@49 608 }
Chris@49 609 else
Chris@49 610 if( (in.all_rows == true) && (in.all_cols == false) )
Chris@49 611 {
Chris@49 612 const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), m_local);
Chris@49 613
Chris@49 614 const umat& ci = tmp2.M;
Chris@49 615
Chris@49 616 arma_debug_check
Chris@49 617 (
Chris@49 618 ( (ci.is_vec() == false) && (ci.is_empty() == false) ),
Chris@49 619 "Mat::elem(): given object is not a vector"
Chris@49 620 );
Chris@49 621
Chris@49 622 const uword* ci_mem = ci.memptr();
Chris@49 623 const uword ci_n_elem = ci.n_elem;
Chris@49 624
Chris@49 625 out.set_size(m_n_rows, ci_n_elem);
Chris@49 626
Chris@49 627 for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
Chris@49 628 {
Chris@49 629 const uword col = ci_mem[ci_count];
Chris@49 630
Chris@49 631 arma_debug_check( (col > m_n_cols), "Mat::elem(): index out of bounds" );
Chris@49 632
Chris@49 633 arrayops::copy( out.colptr(ci_count), m_local.colptr(col), m_n_rows );
Chris@49 634 }
Chris@49 635 }
Chris@49 636 else
Chris@49 637 if( (in.all_rows == false) && (in.all_cols == true) )
Chris@49 638 {
Chris@49 639 const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), m_local);
Chris@49 640
Chris@49 641 const umat& ri = tmp1.M;
Chris@49 642
Chris@49 643 arma_debug_check
Chris@49 644 (
Chris@49 645 ( (ri.is_vec() == false) && (ri.is_empty() == false) ),
Chris@49 646 "Mat::elem(): given object is not a vector"
Chris@49 647 );
Chris@49 648
Chris@49 649 const uword* ri_mem = ri.memptr();
Chris@49 650 const uword ri_n_elem = ri.n_elem;
Chris@49 651
Chris@49 652 out.set_size(ri_n_elem, m_n_cols);
Chris@49 653
Chris@49 654 for(uword col=0; col < m_n_cols; ++col)
Chris@49 655 {
Chris@49 656 for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
Chris@49 657 {
Chris@49 658 const uword row = ri_mem[ri_count];
Chris@49 659
Chris@49 660 arma_debug_check( (row > m_n_rows), "Mat::elem(): index out of bounds" );
Chris@49 661
Chris@49 662 out.at(ri_count,col) = m_local.at(row,col);
Chris@49 663 }
Chris@49 664 }
Chris@49 665 }
Chris@49 666
Chris@49 667
Chris@49 668 if(alias)
Chris@49 669 {
Chris@49 670 actual_out.steal_mem(out);
Chris@49 671
Chris@49 672 delete tmp_out;
Chris@49 673 }
Chris@49 674 }
Chris@49 675
Chris@49 676
Chris@49 677
Chris@49 678 // TODO: implement a dedicated function instead of creating a temporary (but lots of potential aliasing issues)
Chris@49 679 template<typename eT, typename T1, typename T2>
Chris@49 680 inline
Chris@49 681 void
Chris@49 682 subview_elem2<eT,T1,T2>::plus_inplace(Mat<eT>& out, const subview_elem2& in)
Chris@49 683 {
Chris@49 684 arma_extra_debug_sigprint();
Chris@49 685
Chris@49 686 const Mat<eT> tmp(in);
Chris@49 687
Chris@49 688 out += tmp;
Chris@49 689 }
Chris@49 690
Chris@49 691
Chris@49 692
Chris@49 693 template<typename eT, typename T1, typename T2>
Chris@49 694 inline
Chris@49 695 void
Chris@49 696 subview_elem2<eT,T1,T2>::minus_inplace(Mat<eT>& out, const subview_elem2& in)
Chris@49 697 {
Chris@49 698 arma_extra_debug_sigprint();
Chris@49 699
Chris@49 700 const Mat<eT> tmp(in);
Chris@49 701
Chris@49 702 out -= tmp;
Chris@49 703 }
Chris@49 704
Chris@49 705
Chris@49 706
Chris@49 707 template<typename eT, typename T1, typename T2>
Chris@49 708 inline
Chris@49 709 void
Chris@49 710 subview_elem2<eT,T1,T2>::schur_inplace(Mat<eT>& out, const subview_elem2& in)
Chris@49 711 {
Chris@49 712 arma_extra_debug_sigprint();
Chris@49 713
Chris@49 714 const Mat<eT> tmp(in);
Chris@49 715
Chris@49 716 out %= tmp;
Chris@49 717 }
Chris@49 718
Chris@49 719
Chris@49 720
Chris@49 721 template<typename eT, typename T1, typename T2>
Chris@49 722 inline
Chris@49 723 void
Chris@49 724 subview_elem2<eT,T1,T2>::div_inplace(Mat<eT>& out, const subview_elem2& in)
Chris@49 725 {
Chris@49 726 arma_extra_debug_sigprint();
Chris@49 727
Chris@49 728 const Mat<eT> tmp(in);
Chris@49 729
Chris@49 730 out /= tmp;
Chris@49 731 }
Chris@49 732
Chris@49 733
Chris@49 734
Chris@49 735 //! @}