annotate armadillo-3.900.4/include/armadillo_bits/subview_each_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 Conrad Sanderson
Chris@49 2 //
Chris@49 3 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 4 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 6
Chris@49 7
Chris@49 8 //! \addtogroup subview_each
Chris@49 9 //! @{
Chris@49 10
Chris@49 11
Chris@49 12 //
Chris@49 13 //
Chris@49 14 // subview_each_common
Chris@49 15
Chris@49 16 template<typename parent, unsigned int mode>
Chris@49 17 inline
Chris@49 18 subview_each_common<parent,mode>::subview_each_common(parent& in_p)
Chris@49 19 : p(in_p)
Chris@49 20 {
Chris@49 21 arma_extra_debug_sigprint();
Chris@49 22 }
Chris@49 23
Chris@49 24
Chris@49 25
Chris@49 26 template<typename parent, unsigned int mode>
Chris@49 27 arma_inline
Chris@49 28 const Mat<typename parent::elem_type>&
Chris@49 29 subview_each_common<parent,mode>::get_mat_ref_helper(const Mat<typename parent::elem_type>& X) const
Chris@49 30 {
Chris@49 31 return X;
Chris@49 32 }
Chris@49 33
Chris@49 34
Chris@49 35
Chris@49 36 template<typename parent, unsigned int mode>
Chris@49 37 arma_inline
Chris@49 38 const Mat<typename parent::elem_type>&
Chris@49 39 subview_each_common<parent,mode>::get_mat_ref_helper(const subview<typename parent::elem_type>& X) const
Chris@49 40 {
Chris@49 41 return X.m;
Chris@49 42 }
Chris@49 43
Chris@49 44
Chris@49 45
Chris@49 46 template<typename parent, unsigned int mode>
Chris@49 47 arma_inline
Chris@49 48 const Mat<typename parent::elem_type>&
Chris@49 49 subview_each_common<parent,mode>::get_mat_ref() const
Chris@49 50 {
Chris@49 51 return get_mat_ref_helper(p);
Chris@49 52 }
Chris@49 53
Chris@49 54
Chris@49 55
Chris@49 56 template<typename parent, unsigned int mode>
Chris@49 57 inline
Chris@49 58 void
Chris@49 59 subview_each_common<parent,mode>::check_size(const Mat<typename parent::elem_type>& A) const
Chris@49 60 {
Chris@49 61 if(arma_config::debug == true)
Chris@49 62 {
Chris@49 63 if(mode == 0)
Chris@49 64 {
Chris@49 65 if( (A.n_rows != p.n_rows) || (A.n_cols != 1) )
Chris@49 66 {
Chris@49 67 arma_stop( incompat_size_string(A) );
Chris@49 68 }
Chris@49 69 }
Chris@49 70 else
Chris@49 71 {
Chris@49 72 if( (A.n_rows != 1) || (A.n_cols != p.n_cols) )
Chris@49 73 {
Chris@49 74 arma_stop( incompat_size_string(A) );
Chris@49 75 }
Chris@49 76 }
Chris@49 77 }
Chris@49 78 }
Chris@49 79
Chris@49 80
Chris@49 81
Chris@49 82 template<typename parent, unsigned int mode>
Chris@49 83 arma_cold
Chris@49 84 inline
Chris@49 85 const std::string
Chris@49 86 subview_each_common<parent,mode>::incompat_size_string(const Mat<typename parent::elem_type>& A) const
Chris@49 87 {
Chris@49 88 std::stringstream tmp;
Chris@49 89
Chris@49 90 if(mode == 0)
Chris@49 91 {
Chris@49 92 tmp << "each_col(): incompatible size; expected " << p.n_rows << "x1" << ", got " << A.n_rows << 'x' << A.n_cols;
Chris@49 93 }
Chris@49 94 else
Chris@49 95 {
Chris@49 96 tmp << "each_row(): incompatible size; expected 1x" << p.n_cols << ", got " << A.n_rows << 'x' << A.n_cols;
Chris@49 97 }
Chris@49 98
Chris@49 99 return tmp.str();
Chris@49 100 }
Chris@49 101
Chris@49 102
Chris@49 103
Chris@49 104 //
Chris@49 105 //
Chris@49 106 // subview_each1
Chris@49 107
Chris@49 108
Chris@49 109
Chris@49 110 template<typename parent, unsigned int mode>
Chris@49 111 inline
Chris@49 112 subview_each1<parent,mode>::~subview_each1()
Chris@49 113 {
Chris@49 114 arma_extra_debug_sigprint();
Chris@49 115 }
Chris@49 116
Chris@49 117
Chris@49 118
Chris@49 119 template<typename parent, unsigned int mode>
Chris@49 120 inline
Chris@49 121 subview_each1<parent,mode>::subview_each1(parent& in_p)
Chris@49 122 : subview_each_common<parent,mode>::subview_each_common(in_p)
Chris@49 123 {
Chris@49 124 arma_extra_debug_sigprint();
Chris@49 125 }
Chris@49 126
Chris@49 127
Chris@49 128
Chris@49 129 template<typename parent, unsigned int mode>
Chris@49 130 template<typename T1>
Chris@49 131 inline
Chris@49 132 void
Chris@49 133 subview_each1<parent,mode>::operator= (const Base<eT,T1>& in)
Chris@49 134 {
Chris@49 135 arma_extra_debug_sigprint();
Chris@49 136
Chris@49 137 parent& p = subview_each_common<parent,mode>::p;
Chris@49 138
Chris@49 139 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 140 const Mat<eT>& A = tmp.M;
Chris@49 141
Chris@49 142 subview_each_common<parent,mode>::check_size(A);
Chris@49 143
Chris@49 144 const eT* A_mem = A.memptr();
Chris@49 145 const uword p_n_rows = p.n_rows;
Chris@49 146 const uword p_n_cols = p.n_cols;
Chris@49 147
Chris@49 148 if(mode == 0) // each column
Chris@49 149 {
Chris@49 150 for(uword i=0; i < p_n_cols; ++i)
Chris@49 151 {
Chris@49 152 arrayops::copy( p.colptr(i), A_mem, p_n_rows );
Chris@49 153 }
Chris@49 154 }
Chris@49 155 else // each row
Chris@49 156 {
Chris@49 157 for(uword i=0; i < p_n_cols; ++i)
Chris@49 158 {
Chris@49 159 arrayops::inplace_set( p.colptr(i), A_mem[i], p_n_rows);
Chris@49 160 }
Chris@49 161 }
Chris@49 162 }
Chris@49 163
Chris@49 164
Chris@49 165
Chris@49 166 template<typename parent, unsigned int mode>
Chris@49 167 template<typename T1>
Chris@49 168 inline
Chris@49 169 void
Chris@49 170 subview_each1<parent,mode>::operator+= (const Base<eT,T1>& in)
Chris@49 171 {
Chris@49 172 arma_extra_debug_sigprint();
Chris@49 173
Chris@49 174 parent& p = subview_each_common<parent,mode>::p;
Chris@49 175
Chris@49 176 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 177 const Mat<eT>& A = tmp.M;
Chris@49 178
Chris@49 179 subview_each_common<parent,mode>::check_size(A);
Chris@49 180
Chris@49 181 const eT* A_mem = A.memptr();
Chris@49 182 const uword p_n_rows = p.n_rows;
Chris@49 183 const uword p_n_cols = p.n_cols;
Chris@49 184
Chris@49 185 if(mode == 0) // each column
Chris@49 186 {
Chris@49 187 for(uword i=0; i < p_n_cols; ++i)
Chris@49 188 {
Chris@49 189 arrayops::inplace_plus( p.colptr(i), A_mem, p_n_rows );
Chris@49 190 }
Chris@49 191 }
Chris@49 192 else // each row
Chris@49 193 {
Chris@49 194 for(uword i=0; i < p_n_cols; ++i)
Chris@49 195 {
Chris@49 196 arrayops::inplace_plus( p.colptr(i), A_mem[i], p_n_rows);
Chris@49 197 }
Chris@49 198 }
Chris@49 199 }
Chris@49 200
Chris@49 201
Chris@49 202
Chris@49 203 template<typename parent, unsigned int mode>
Chris@49 204 template<typename T1>
Chris@49 205 inline
Chris@49 206 void
Chris@49 207 subview_each1<parent,mode>::operator-= (const Base<eT,T1>& in)
Chris@49 208 {
Chris@49 209 arma_extra_debug_sigprint();
Chris@49 210
Chris@49 211 parent& p = subview_each_common<parent,mode>::p;
Chris@49 212
Chris@49 213 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 214 const Mat<eT>& A = tmp.M;
Chris@49 215
Chris@49 216 subview_each_common<parent,mode>::check_size(A);
Chris@49 217
Chris@49 218 const eT* A_mem = A.memptr();
Chris@49 219 const uword p_n_rows = p.n_rows;
Chris@49 220 const uword p_n_cols = p.n_cols;
Chris@49 221
Chris@49 222 if(mode == 0) // each column
Chris@49 223 {
Chris@49 224 for(uword i=0; i < p_n_cols; ++i)
Chris@49 225 {
Chris@49 226 arrayops::inplace_minus( p.colptr(i), A_mem, p_n_rows );
Chris@49 227 }
Chris@49 228 }
Chris@49 229 else // each row
Chris@49 230 {
Chris@49 231 for(uword i=0; i < p_n_cols; ++i)
Chris@49 232 {
Chris@49 233 arrayops::inplace_minus( p.colptr(i), A_mem[i], p_n_rows);
Chris@49 234 }
Chris@49 235 }
Chris@49 236 }
Chris@49 237
Chris@49 238
Chris@49 239
Chris@49 240 template<typename parent, unsigned int mode>
Chris@49 241 template<typename T1>
Chris@49 242 inline
Chris@49 243 void
Chris@49 244 subview_each1<parent,mode>::operator%= (const Base<eT,T1>& in)
Chris@49 245 {
Chris@49 246 arma_extra_debug_sigprint();
Chris@49 247
Chris@49 248 parent& p = subview_each_common<parent,mode>::p;
Chris@49 249
Chris@49 250 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 251 const Mat<eT>& A = tmp.M;
Chris@49 252
Chris@49 253 subview_each_common<parent,mode>::check_size(A);
Chris@49 254
Chris@49 255 const eT* A_mem = A.memptr();
Chris@49 256 const uword p_n_rows = p.n_rows;
Chris@49 257 const uword p_n_cols = p.n_cols;
Chris@49 258
Chris@49 259 if(mode == 0) // each column
Chris@49 260 {
Chris@49 261 for(uword i=0; i < p_n_cols; ++i)
Chris@49 262 {
Chris@49 263 arrayops::inplace_mul( p.colptr(i), A_mem, p_n_rows );
Chris@49 264 }
Chris@49 265 }
Chris@49 266 else // each row
Chris@49 267 {
Chris@49 268 for(uword i=0; i < p_n_cols; ++i)
Chris@49 269 {
Chris@49 270 arrayops::inplace_mul( p.colptr(i), A_mem[i], p_n_rows);
Chris@49 271 }
Chris@49 272 }
Chris@49 273 }
Chris@49 274
Chris@49 275
Chris@49 276
Chris@49 277 template<typename parent, unsigned int mode>
Chris@49 278 template<typename T1>
Chris@49 279 inline
Chris@49 280 void
Chris@49 281 subview_each1<parent,mode>::operator/= (const Base<eT,T1>& in)
Chris@49 282 {
Chris@49 283 arma_extra_debug_sigprint();
Chris@49 284
Chris@49 285 parent& p = subview_each_common<parent,mode>::p;
Chris@49 286
Chris@49 287 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 288 const Mat<eT>& A = tmp.M;
Chris@49 289
Chris@49 290 subview_each_common<parent,mode>::check_size(A);
Chris@49 291
Chris@49 292 const eT* A_mem = A.memptr();
Chris@49 293 const uword p_n_rows = p.n_rows;
Chris@49 294 const uword p_n_cols = p.n_cols;
Chris@49 295
Chris@49 296 if(mode == 0) // each column
Chris@49 297 {
Chris@49 298 for(uword i=0; i < p_n_cols; ++i)
Chris@49 299 {
Chris@49 300 arrayops::inplace_div( p.colptr(i), A_mem, p_n_rows );
Chris@49 301 }
Chris@49 302 }
Chris@49 303 else // each row
Chris@49 304 {
Chris@49 305 for(uword i=0; i < p_n_cols; ++i)
Chris@49 306 {
Chris@49 307 arrayops::inplace_div( p.colptr(i), A_mem[i], p_n_rows);
Chris@49 308 }
Chris@49 309 }
Chris@49 310 }
Chris@49 311
Chris@49 312
Chris@49 313
Chris@49 314 //
Chris@49 315 //
Chris@49 316 // subview_each2
Chris@49 317
Chris@49 318
Chris@49 319
Chris@49 320 template<typename parent, unsigned int mode, typename TB>
Chris@49 321 inline
Chris@49 322 subview_each2<parent,mode,TB>::~subview_each2()
Chris@49 323 {
Chris@49 324 arma_extra_debug_sigprint();
Chris@49 325 }
Chris@49 326
Chris@49 327
Chris@49 328
Chris@49 329 template<typename parent, unsigned int mode, typename TB>
Chris@49 330 inline
Chris@49 331 subview_each2<parent,mode,TB>::subview_each2(parent& in_p, const Base<uword, TB>& in_indices)
Chris@49 332 : subview_each_common<parent,mode>::subview_each_common(in_p)
Chris@49 333 , base_indices(in_indices)
Chris@49 334 {
Chris@49 335 arma_extra_debug_sigprint();
Chris@49 336 }
Chris@49 337
Chris@49 338
Chris@49 339
Chris@49 340 template<typename parent, unsigned int mode, typename TB>
Chris@49 341 inline
Chris@49 342 void
Chris@49 343 subview_each2<parent,mode,TB>::check_indices(const Mat<uword>& indices) const
Chris@49 344 {
Chris@49 345 if(mode == 0)
Chris@49 346 {
Chris@49 347 arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_col(): list of indices must be a vector" );
Chris@49 348 }
Chris@49 349 else
Chris@49 350 {
Chris@49 351 arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_row(): list of indices must be a vector" );
Chris@49 352 }
Chris@49 353 }
Chris@49 354
Chris@49 355
Chris@49 356
Chris@49 357 template<typename parent, unsigned int mode, typename TB>
Chris@49 358 template<typename T1>
Chris@49 359 inline
Chris@49 360 void
Chris@49 361 subview_each2<parent,mode,TB>::operator= (const Base<eT,T1>& in)
Chris@49 362 {
Chris@49 363 arma_extra_debug_sigprint();
Chris@49 364
Chris@49 365 parent& p = subview_each_common<parent,mode>::p;
Chris@49 366
Chris@49 367 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 368 const Mat<eT>& A = tmp.M;
Chris@49 369
Chris@49 370 subview_each_common<parent,mode>::check_size(A);
Chris@49 371
Chris@49 372 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
Chris@49 373 const Mat<uword>& indices = tmp_indices.M;
Chris@49 374
Chris@49 375 check_indices(indices);
Chris@49 376
Chris@49 377 const eT* A_mem = A.memptr();
Chris@49 378 const uword p_n_rows = p.n_rows;
Chris@49 379 const uword p_n_cols = p.n_cols;
Chris@49 380
Chris@49 381 const uword* indices_mem = indices.memptr();
Chris@49 382 const uword N = indices.n_elem;
Chris@49 383
Chris@49 384 if(mode == 0) // each column
Chris@49 385 {
Chris@49 386 for(uword i=0; i < N; ++i)
Chris@49 387 {
Chris@49 388 const uword col = indices_mem[i];
Chris@49 389
Chris@49 390 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
Chris@49 391
Chris@49 392 arrayops::copy( p.colptr(col), A_mem, p_n_rows );
Chris@49 393 }
Chris@49 394 }
Chris@49 395 else // each row
Chris@49 396 {
Chris@49 397 for(uword i=0; i < N; ++i)
Chris@49 398 {
Chris@49 399 const uword row = indices_mem[i];
Chris@49 400
Chris@49 401 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
Chris@49 402
Chris@49 403 for(uword col=0; col < p_n_cols; ++col)
Chris@49 404 {
Chris@49 405 p.at(row,col) = A_mem[col];
Chris@49 406 }
Chris@49 407 }
Chris@49 408 }
Chris@49 409 }
Chris@49 410
Chris@49 411
Chris@49 412
Chris@49 413 template<typename parent, unsigned int mode, typename TB>
Chris@49 414 template<typename T1>
Chris@49 415 inline
Chris@49 416 void
Chris@49 417 subview_each2<parent,mode,TB>::operator+= (const Base<eT,T1>& in)
Chris@49 418 {
Chris@49 419 arma_extra_debug_sigprint();
Chris@49 420
Chris@49 421 parent& p = subview_each_common<parent,mode>::p;
Chris@49 422
Chris@49 423 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 424 const Mat<eT>& A = tmp.M;
Chris@49 425
Chris@49 426 subview_each_common<parent,mode>::check_size(A);
Chris@49 427
Chris@49 428 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
Chris@49 429 const Mat<uword>& indices = tmp_indices.M;
Chris@49 430
Chris@49 431 check_indices(indices);
Chris@49 432
Chris@49 433 const eT* A_mem = A.memptr();
Chris@49 434 const uword p_n_rows = p.n_rows;
Chris@49 435 const uword p_n_cols = p.n_cols;
Chris@49 436
Chris@49 437 const uword* indices_mem = indices.memptr();
Chris@49 438 const uword N = indices.n_elem;
Chris@49 439
Chris@49 440 if(mode == 0) // each column
Chris@49 441 {
Chris@49 442 for(uword i=0; i < N; ++i)
Chris@49 443 {
Chris@49 444 const uword col = indices_mem[i];
Chris@49 445
Chris@49 446 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
Chris@49 447
Chris@49 448 arrayops::inplace_plus( p.colptr(col), A_mem, p_n_rows );
Chris@49 449 }
Chris@49 450 }
Chris@49 451 else // each row
Chris@49 452 {
Chris@49 453 for(uword i=0; i < N; ++i)
Chris@49 454 {
Chris@49 455 const uword row = indices_mem[i];
Chris@49 456
Chris@49 457 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
Chris@49 458
Chris@49 459 for(uword col=0; col < p_n_cols; ++col)
Chris@49 460 {
Chris@49 461 p.at(row,col) += A_mem[col];
Chris@49 462 }
Chris@49 463 }
Chris@49 464 }
Chris@49 465 }
Chris@49 466
Chris@49 467
Chris@49 468
Chris@49 469 template<typename parent, unsigned int mode, typename TB>
Chris@49 470 template<typename T1>
Chris@49 471 inline
Chris@49 472 void
Chris@49 473 subview_each2<parent,mode,TB>::operator-= (const Base<eT,T1>& in)
Chris@49 474 {
Chris@49 475 arma_extra_debug_sigprint();
Chris@49 476
Chris@49 477 parent& p = subview_each_common<parent,mode>::p;
Chris@49 478
Chris@49 479 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 480 const Mat<eT>& A = tmp.M;
Chris@49 481
Chris@49 482 subview_each_common<parent,mode>::check_size(A);
Chris@49 483
Chris@49 484 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
Chris@49 485 const Mat<uword>& indices = tmp_indices.M;
Chris@49 486
Chris@49 487 check_indices(indices);
Chris@49 488
Chris@49 489 const eT* A_mem = A.memptr();
Chris@49 490 const uword p_n_rows = p.n_rows;
Chris@49 491 const uword p_n_cols = p.n_cols;
Chris@49 492
Chris@49 493 const uword* indices_mem = indices.memptr();
Chris@49 494 const uword N = indices.n_elem;
Chris@49 495
Chris@49 496 if(mode == 0) // each column
Chris@49 497 {
Chris@49 498 for(uword i=0; i < N; ++i)
Chris@49 499 {
Chris@49 500 const uword col = indices_mem[i];
Chris@49 501
Chris@49 502 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
Chris@49 503
Chris@49 504 arrayops::inplace_minus( p.colptr(col), A_mem, p_n_rows );
Chris@49 505 }
Chris@49 506 }
Chris@49 507 else // each row
Chris@49 508 {
Chris@49 509 for(uword i=0; i < N; ++i)
Chris@49 510 {
Chris@49 511 const uword row = indices_mem[i];
Chris@49 512
Chris@49 513 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
Chris@49 514
Chris@49 515 for(uword col=0; col < p_n_cols; ++col)
Chris@49 516 {
Chris@49 517 p.at(row,col) -= A_mem[col];
Chris@49 518 }
Chris@49 519 }
Chris@49 520 }
Chris@49 521 }
Chris@49 522
Chris@49 523
Chris@49 524
Chris@49 525 template<typename parent, unsigned int mode, typename TB>
Chris@49 526 template<typename T1>
Chris@49 527 inline
Chris@49 528 void
Chris@49 529 subview_each2<parent,mode,TB>::operator%= (const Base<eT,T1>& in)
Chris@49 530 {
Chris@49 531 arma_extra_debug_sigprint();
Chris@49 532
Chris@49 533 parent& p = subview_each_common<parent,mode>::p;
Chris@49 534
Chris@49 535 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 536 const Mat<eT>& A = tmp.M;
Chris@49 537
Chris@49 538 subview_each_common<parent,mode>::check_size(A);
Chris@49 539
Chris@49 540 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
Chris@49 541 const Mat<uword>& indices = tmp_indices.M;
Chris@49 542
Chris@49 543 check_indices(indices);
Chris@49 544
Chris@49 545 const eT* A_mem = A.memptr();
Chris@49 546 const uword p_n_rows = p.n_rows;
Chris@49 547 const uword p_n_cols = p.n_cols;
Chris@49 548
Chris@49 549 const uword* indices_mem = indices.memptr();
Chris@49 550 const uword N = indices.n_elem;
Chris@49 551
Chris@49 552 if(mode == 0) // each column
Chris@49 553 {
Chris@49 554 for(uword i=0; i < N; ++i)
Chris@49 555 {
Chris@49 556 const uword col = indices_mem[i];
Chris@49 557
Chris@49 558 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
Chris@49 559
Chris@49 560 arrayops::inplace_mul( p.colptr(col), A_mem, p_n_rows );
Chris@49 561 }
Chris@49 562 }
Chris@49 563 else // each row
Chris@49 564 {
Chris@49 565 for(uword i=0; i < N; ++i)
Chris@49 566 {
Chris@49 567 const uword row = indices_mem[i];
Chris@49 568
Chris@49 569 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
Chris@49 570
Chris@49 571 for(uword col=0; col < p_n_cols; ++col)
Chris@49 572 {
Chris@49 573 p.at(row,col) *= A_mem[col];
Chris@49 574 }
Chris@49 575 }
Chris@49 576 }
Chris@49 577 }
Chris@49 578
Chris@49 579
Chris@49 580
Chris@49 581 template<typename parent, unsigned int mode, typename TB>
Chris@49 582 template<typename T1>
Chris@49 583 inline
Chris@49 584 void
Chris@49 585 subview_each2<parent,mode,TB>::operator/= (const Base<eT,T1>& in)
Chris@49 586 {
Chris@49 587 arma_extra_debug_sigprint();
Chris@49 588
Chris@49 589 parent& p = subview_each_common<parent,mode>::p;
Chris@49 590
Chris@49 591 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
Chris@49 592 const Mat<eT>& A = tmp.M;
Chris@49 593
Chris@49 594 subview_each_common<parent,mode>::check_size(A);
Chris@49 595
Chris@49 596 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
Chris@49 597 const Mat<uword>& indices = tmp_indices.M;
Chris@49 598
Chris@49 599 check_indices(indices);
Chris@49 600
Chris@49 601 const eT* A_mem = A.memptr();
Chris@49 602 const uword p_n_rows = p.n_rows;
Chris@49 603 const uword p_n_cols = p.n_cols;
Chris@49 604
Chris@49 605 const uword* indices_mem = indices.memptr();
Chris@49 606 const uword N = indices.n_elem;
Chris@49 607
Chris@49 608 if(mode == 0) // each column
Chris@49 609 {
Chris@49 610 for(uword i=0; i < N; ++i)
Chris@49 611 {
Chris@49 612 const uword col = indices_mem[i];
Chris@49 613
Chris@49 614 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
Chris@49 615
Chris@49 616 arrayops::inplace_div( p.colptr(col), A_mem, p_n_rows );
Chris@49 617 }
Chris@49 618 }
Chris@49 619 else // each row
Chris@49 620 {
Chris@49 621 for(uword i=0; i < N; ++i)
Chris@49 622 {
Chris@49 623 const uword row = indices_mem[i];
Chris@49 624
Chris@49 625 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
Chris@49 626
Chris@49 627 for(uword col=0; col < p_n_cols; ++col)
Chris@49 628 {
Chris@49 629 p.at(row,col) /= A_mem[col];
Chris@49 630 }
Chris@49 631 }
Chris@49 632 }
Chris@49 633 }
Chris@49 634
Chris@49 635
Chris@49 636
Chris@49 637 //! @}