annotate armadillo-3.900.4/include/armadillo_bits/subview_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-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 template<typename eT>
Chris@49 15 inline
Chris@49 16 subview<eT>::~subview()
Chris@49 17 {
Chris@49 18 arma_extra_debug_sigprint();
Chris@49 19 }
Chris@49 20
Chris@49 21
Chris@49 22 template<typename eT>
Chris@49 23 inline
Chris@49 24 subview<eT>::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 25 : m(in_m)
Chris@49 26 , aux_row1(in_row1)
Chris@49 27 , aux_col1(in_col1)
Chris@49 28 , n_rows(in_n_rows)
Chris@49 29 , n_cols(in_n_cols)
Chris@49 30 , n_elem(in_n_rows*in_n_cols)
Chris@49 31 {
Chris@49 32 arma_extra_debug_sigprint();
Chris@49 33 }
Chris@49 34
Chris@49 35
Chris@49 36
Chris@49 37 template<typename eT>
Chris@49 38 inline
Chris@49 39 void
Chris@49 40 subview<eT>::operator+= (const eT val)
Chris@49 41 {
Chris@49 42 arma_extra_debug_sigprint();
Chris@49 43
Chris@49 44 const uword local_n_cols = n_cols;
Chris@49 45 const uword local_n_rows = n_rows;
Chris@49 46
Chris@49 47 if(local_n_rows == 1)
Chris@49 48 {
Chris@49 49 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 50
Chris@49 51 const uword urow = aux_row1;
Chris@49 52 const uword start_col = aux_col1;
Chris@49 53 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 54
Chris@49 55 uword ii,jj;
Chris@49 56 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
Chris@49 57 {
Chris@49 58 X.at(urow, ii) += val;
Chris@49 59 X.at(urow, jj) += val;
Chris@49 60 }
Chris@49 61
Chris@49 62 if(ii < end_col_plus1)
Chris@49 63 {
Chris@49 64 X.at(urow, ii) += val;
Chris@49 65 }
Chris@49 66 }
Chris@49 67 else
Chris@49 68 {
Chris@49 69 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 70 {
Chris@49 71 arrayops::inplace_plus( colptr(ucol), val, local_n_rows );
Chris@49 72 }
Chris@49 73 }
Chris@49 74 }
Chris@49 75
Chris@49 76
Chris@49 77
Chris@49 78 template<typename eT>
Chris@49 79 inline
Chris@49 80 void
Chris@49 81 subview<eT>::operator-= (const eT val)
Chris@49 82 {
Chris@49 83 arma_extra_debug_sigprint();
Chris@49 84
Chris@49 85 const uword local_n_cols = n_cols;
Chris@49 86 const uword local_n_rows = n_rows;
Chris@49 87
Chris@49 88 if(local_n_rows == 1)
Chris@49 89 {
Chris@49 90 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 91
Chris@49 92 const uword urow = aux_row1;
Chris@49 93 const uword start_col = aux_col1;
Chris@49 94 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 95
Chris@49 96 uword ii,jj;
Chris@49 97 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
Chris@49 98 {
Chris@49 99 X.at(urow, ii) -= val;
Chris@49 100 X.at(urow, jj) -= val;
Chris@49 101 }
Chris@49 102
Chris@49 103 if(ii < end_col_plus1)
Chris@49 104 {
Chris@49 105 X.at(urow, ii) -= val;
Chris@49 106 }
Chris@49 107 }
Chris@49 108 else
Chris@49 109 {
Chris@49 110 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 111 {
Chris@49 112 arrayops::inplace_minus( colptr(ucol), val, local_n_rows );
Chris@49 113 }
Chris@49 114 }
Chris@49 115 }
Chris@49 116
Chris@49 117
Chris@49 118
Chris@49 119 template<typename eT>
Chris@49 120 inline
Chris@49 121 void
Chris@49 122 subview<eT>::operator*= (const eT val)
Chris@49 123 {
Chris@49 124 arma_extra_debug_sigprint();
Chris@49 125
Chris@49 126 const uword local_n_cols = n_cols;
Chris@49 127 const uword local_n_rows = n_rows;
Chris@49 128
Chris@49 129 if(local_n_rows == 1)
Chris@49 130 {
Chris@49 131 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 132
Chris@49 133 const uword urow = aux_row1;
Chris@49 134 const uword start_col = aux_col1;
Chris@49 135 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 136
Chris@49 137 uword ii,jj;
Chris@49 138 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
Chris@49 139 {
Chris@49 140 X.at(urow, ii) *= val;
Chris@49 141 X.at(urow, jj) *= val;
Chris@49 142 }
Chris@49 143
Chris@49 144 if(ii < end_col_plus1)
Chris@49 145 {
Chris@49 146 X.at(urow, ii) *= val;
Chris@49 147 }
Chris@49 148 }
Chris@49 149 else
Chris@49 150 {
Chris@49 151 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 152 {
Chris@49 153 arrayops::inplace_mul( colptr(ucol), val, local_n_rows );
Chris@49 154 }
Chris@49 155 }
Chris@49 156 }
Chris@49 157
Chris@49 158
Chris@49 159
Chris@49 160 template<typename eT>
Chris@49 161 inline
Chris@49 162 void
Chris@49 163 subview<eT>::operator/= (const eT val)
Chris@49 164 {
Chris@49 165 arma_extra_debug_sigprint();
Chris@49 166
Chris@49 167 const uword local_n_cols = n_cols;
Chris@49 168 const uword local_n_rows = n_rows;
Chris@49 169
Chris@49 170 if(local_n_rows == 1)
Chris@49 171 {
Chris@49 172 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 173
Chris@49 174 const uword urow = aux_row1;
Chris@49 175 const uword start_col = aux_col1;
Chris@49 176 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 177
Chris@49 178 uword ii,jj;
Chris@49 179 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
Chris@49 180 {
Chris@49 181 X.at(urow, ii) /= val;
Chris@49 182 X.at(urow, jj) /= val;
Chris@49 183 }
Chris@49 184
Chris@49 185 if(ii < end_col_plus1)
Chris@49 186 {
Chris@49 187 X.at(urow, ii) /= val;
Chris@49 188 }
Chris@49 189 }
Chris@49 190 else
Chris@49 191 {
Chris@49 192 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 193 {
Chris@49 194 arrayops::inplace_div( colptr(ucol), val, local_n_rows );
Chris@49 195 }
Chris@49 196 }
Chris@49 197 }
Chris@49 198
Chris@49 199
Chris@49 200
Chris@49 201 template<typename eT>
Chris@49 202 template<typename T1>
Chris@49 203 inline
Chris@49 204 void
Chris@49 205 subview<eT>::operator= (const Base<eT,T1>& in)
Chris@49 206 {
Chris@49 207 arma_extra_debug_sigprint();
Chris@49 208
Chris@49 209 const Proxy<T1> P(in.get_ref());
Chris@49 210
Chris@49 211 subview<eT>& s = *this;
Chris@49 212
Chris@49 213 const uword s_n_rows = s.n_rows;
Chris@49 214 const uword s_n_cols = s.n_cols;
Chris@49 215
Chris@49 216 arma_debug_assert_same_size(s, P, "copy into submatrix");
Chris@49 217
Chris@49 218 const bool is_alias = P.is_alias(s.m);
Chris@49 219
Chris@49 220 arma_extra_debug_warn(is_alias, "aliasing detected");
Chris@49 221
Chris@49 222 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
Chris@49 223 {
Chris@49 224 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
Chris@49 225 const Mat<eT>& x = tmp.M;
Chris@49 226
Chris@49 227 if(s_n_rows == 1)
Chris@49 228 {
Chris@49 229 const eT* x_mem = x.memptr();
Chris@49 230
Chris@49 231 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 232
Chris@49 233 const uword urow = aux_row1;
Chris@49 234 const uword start_col = aux_col1;
Chris@49 235
Chris@49 236 uword ii,jj;
Chris@49 237 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 238 {
Chris@49 239 A.at(urow, start_col+ii) = x_mem[ii];
Chris@49 240 A.at(urow, start_col+jj) = x_mem[jj];
Chris@49 241 }
Chris@49 242
Chris@49 243 if(ii < s_n_cols)
Chris@49 244 {
Chris@49 245 A.at(urow, start_col+ii) = x_mem[ii];
Chris@49 246 }
Chris@49 247 }
Chris@49 248 else
Chris@49 249 {
Chris@49 250 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 251 {
Chris@49 252 arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 253 }
Chris@49 254 }
Chris@49 255 }
Chris@49 256 else
Chris@49 257 {
Chris@49 258 if(s_n_rows == 1)
Chris@49 259 {
Chris@49 260 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 261
Chris@49 262 const uword urow = aux_row1;
Chris@49 263 const uword start_col = aux_col1;
Chris@49 264
Chris@49 265 uword ii,jj;
Chris@49 266 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 267 {
Chris@49 268 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 269 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
Chris@49 270
Chris@49 271 A.at(urow, start_col+ii) = tmp1;
Chris@49 272 A.at(urow, start_col+jj) = tmp2;
Chris@49 273 }
Chris@49 274
Chris@49 275 if(ii < s_n_cols)
Chris@49 276 {
Chris@49 277 A.at(urow, start_col+ii) = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 278 }
Chris@49 279 }
Chris@49 280 else
Chris@49 281 {
Chris@49 282 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 283 {
Chris@49 284 eT* s_col_data = s.colptr(ucol);
Chris@49 285
Chris@49 286 uword ii,jj;
Chris@49 287 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
Chris@49 288 {
Chris@49 289 const eT tmp1 = P.at(ii,ucol);
Chris@49 290 const eT tmp2 = P.at(jj,ucol);
Chris@49 291
Chris@49 292 s_col_data[ii] = tmp1;
Chris@49 293 s_col_data[jj] = tmp2;
Chris@49 294 }
Chris@49 295
Chris@49 296 if(ii < s_n_rows)
Chris@49 297 {
Chris@49 298 s_col_data[ii] = P.at(ii,ucol);
Chris@49 299 }
Chris@49 300 }
Chris@49 301 }
Chris@49 302 }
Chris@49 303 }
Chris@49 304
Chris@49 305
Chris@49 306
Chris@49 307 template<typename eT>
Chris@49 308 template<typename T1>
Chris@49 309 inline
Chris@49 310 void
Chris@49 311 subview<eT>::operator+= (const Base<eT,T1>& in)
Chris@49 312 {
Chris@49 313 arma_extra_debug_sigprint();
Chris@49 314
Chris@49 315 const Proxy<T1> P(in.get_ref());
Chris@49 316
Chris@49 317 subview<eT>& s = *this;
Chris@49 318
Chris@49 319 const uword s_n_rows = s.n_rows;
Chris@49 320 const uword s_n_cols = s.n_cols;
Chris@49 321
Chris@49 322 arma_debug_assert_same_size(s, P, "addition");
Chris@49 323
Chris@49 324 const bool is_alias = P.is_alias(s.m);
Chris@49 325
Chris@49 326 arma_extra_debug_warn(is_alias, "aliasing detected");
Chris@49 327
Chris@49 328 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
Chris@49 329 {
Chris@49 330 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
Chris@49 331 const Mat<eT>& x = tmp.M;
Chris@49 332
Chris@49 333 if(s_n_rows == 1)
Chris@49 334 {
Chris@49 335 const eT* x_mem = x.memptr();
Chris@49 336
Chris@49 337 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 338
Chris@49 339 const uword urow = aux_row1;
Chris@49 340 const uword start_col = aux_col1;
Chris@49 341
Chris@49 342 uword ii,jj;
Chris@49 343 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 344 {
Chris@49 345 A.at(urow, start_col+ii) += x_mem[ii];
Chris@49 346 A.at(urow, start_col+jj) += x_mem[jj];
Chris@49 347 }
Chris@49 348
Chris@49 349 if(ii < s_n_cols)
Chris@49 350 {
Chris@49 351 A.at(urow, start_col+ii) += x_mem[ii];
Chris@49 352 }
Chris@49 353 }
Chris@49 354 else
Chris@49 355 {
Chris@49 356 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 357 {
Chris@49 358 arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 359 }
Chris@49 360 }
Chris@49 361 }
Chris@49 362 else
Chris@49 363 {
Chris@49 364 if(s_n_rows == 1)
Chris@49 365 {
Chris@49 366 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 367
Chris@49 368 const uword urow = aux_row1;
Chris@49 369 const uword start_col = aux_col1;
Chris@49 370
Chris@49 371 uword ii,jj;
Chris@49 372 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 373 {
Chris@49 374 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 375 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
Chris@49 376
Chris@49 377 A.at(urow, start_col+ii) += tmp1;
Chris@49 378 A.at(urow, start_col+jj) += tmp2;
Chris@49 379 }
Chris@49 380
Chris@49 381 if(ii < s_n_cols)
Chris@49 382 {
Chris@49 383 A.at(urow, start_col+ii) += (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 384 }
Chris@49 385 }
Chris@49 386 else
Chris@49 387 {
Chris@49 388 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 389 {
Chris@49 390 eT* s_col_data = s.colptr(ucol);
Chris@49 391
Chris@49 392 uword ii,jj;
Chris@49 393 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
Chris@49 394 {
Chris@49 395 const eT val1 = P.at(ii,ucol);
Chris@49 396 const eT val2 = P.at(jj,ucol);
Chris@49 397
Chris@49 398 s_col_data[ii] += val1;
Chris@49 399 s_col_data[jj] += val2;
Chris@49 400 }
Chris@49 401
Chris@49 402 if(ii < s_n_rows)
Chris@49 403 {
Chris@49 404 s_col_data[ii] += P.at(ii,ucol);
Chris@49 405 }
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 eT>
Chris@49 414 template<typename T1>
Chris@49 415 inline
Chris@49 416 void
Chris@49 417 subview<eT>::operator-= (const Base<eT,T1>& in)
Chris@49 418 {
Chris@49 419 arma_extra_debug_sigprint();
Chris@49 420
Chris@49 421 const Proxy<T1> P(in.get_ref());
Chris@49 422
Chris@49 423 subview<eT>& s = *this;
Chris@49 424
Chris@49 425 const uword s_n_rows = s.n_rows;
Chris@49 426 const uword s_n_cols = s.n_cols;
Chris@49 427
Chris@49 428 arma_debug_assert_same_size(s, P, "subtraction");
Chris@49 429
Chris@49 430 const bool is_alias = P.is_alias(s.m);
Chris@49 431
Chris@49 432 arma_extra_debug_warn(is_alias, "aliasing detected");
Chris@49 433
Chris@49 434 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
Chris@49 435 {
Chris@49 436 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
Chris@49 437 const Mat<eT>& x = tmp.M;
Chris@49 438
Chris@49 439 if(s_n_rows == 1)
Chris@49 440 {
Chris@49 441 const eT* x_mem = x.memptr();
Chris@49 442
Chris@49 443 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 444
Chris@49 445 const uword urow = aux_row1;
Chris@49 446 const uword start_col = aux_col1;
Chris@49 447
Chris@49 448 uword ii,jj;
Chris@49 449 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 450 {
Chris@49 451 A.at(urow, start_col+ii) -= x_mem[ii];
Chris@49 452 A.at(urow, start_col+jj) -= x_mem[jj];
Chris@49 453 }
Chris@49 454
Chris@49 455 if(ii < s_n_cols)
Chris@49 456 {
Chris@49 457 A.at(urow, start_col+ii) -= x_mem[ii];
Chris@49 458 }
Chris@49 459 }
Chris@49 460 else
Chris@49 461 {
Chris@49 462 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 463 {
Chris@49 464 arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 465 }
Chris@49 466 }
Chris@49 467 }
Chris@49 468 else
Chris@49 469 {
Chris@49 470 if(s_n_rows == 1)
Chris@49 471 {
Chris@49 472 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 473
Chris@49 474 const uword urow = aux_row1;
Chris@49 475 const uword start_col = aux_col1;
Chris@49 476
Chris@49 477 uword ii,jj;
Chris@49 478 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 479 {
Chris@49 480 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 481 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
Chris@49 482
Chris@49 483 A.at(urow, start_col+ii) -= tmp1;
Chris@49 484 A.at(urow, start_col+jj) -= tmp2;
Chris@49 485 }
Chris@49 486
Chris@49 487 if(ii < s_n_cols)
Chris@49 488 {
Chris@49 489 A.at(urow, start_col+ii) -= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 490 }
Chris@49 491 }
Chris@49 492 else
Chris@49 493 {
Chris@49 494 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 495 {
Chris@49 496 eT* s_col_data = s.colptr(ucol);
Chris@49 497
Chris@49 498 uword ii,jj;
Chris@49 499 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
Chris@49 500 {
Chris@49 501 const eT val1 = P.at(ii,ucol);
Chris@49 502 const eT val2 = P.at(jj,ucol);
Chris@49 503
Chris@49 504 s_col_data[ii] -= val1;
Chris@49 505 s_col_data[jj] -= val2;
Chris@49 506 }
Chris@49 507
Chris@49 508 if(ii < s_n_rows)
Chris@49 509 {
Chris@49 510 s_col_data[ii] -= P.at(ii,ucol);
Chris@49 511 }
Chris@49 512 }
Chris@49 513 }
Chris@49 514 }
Chris@49 515 }
Chris@49 516
Chris@49 517
Chris@49 518
Chris@49 519 template<typename eT>
Chris@49 520 template<typename T1>
Chris@49 521 inline
Chris@49 522 void
Chris@49 523 subview<eT>::operator%= (const Base<eT,T1>& in)
Chris@49 524 {
Chris@49 525 arma_extra_debug_sigprint();
Chris@49 526
Chris@49 527 const Proxy<T1> P(in.get_ref());
Chris@49 528
Chris@49 529 subview<eT>& s = *this;
Chris@49 530
Chris@49 531 const uword s_n_rows = s.n_rows;
Chris@49 532 const uword s_n_cols = s.n_cols;
Chris@49 533
Chris@49 534 arma_debug_assert_same_size(s, P, "element-wise multiplication");
Chris@49 535
Chris@49 536 const bool is_alias = P.is_alias(s.m);
Chris@49 537
Chris@49 538 arma_extra_debug_warn(is_alias, "aliasing detected");
Chris@49 539
Chris@49 540 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
Chris@49 541 {
Chris@49 542 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
Chris@49 543 const Mat<eT>& x = tmp.M;
Chris@49 544
Chris@49 545 if(s_n_rows == 1)
Chris@49 546 {
Chris@49 547 const eT* x_mem = x.memptr();
Chris@49 548
Chris@49 549 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 550
Chris@49 551 const uword urow = aux_row1;
Chris@49 552 const uword start_col = aux_col1;
Chris@49 553
Chris@49 554 uword ii,jj;
Chris@49 555 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 556 {
Chris@49 557 A.at(urow, start_col+ii) *= x_mem[ii];
Chris@49 558 A.at(urow, start_col+jj) *= x_mem[jj];
Chris@49 559 }
Chris@49 560
Chris@49 561 if(ii < s_n_cols)
Chris@49 562 {
Chris@49 563 A.at(urow, start_col+ii) *= x_mem[ii];
Chris@49 564 }
Chris@49 565 }
Chris@49 566 else
Chris@49 567 {
Chris@49 568 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 569 {
Chris@49 570 arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 571 }
Chris@49 572 }
Chris@49 573 }
Chris@49 574 else
Chris@49 575 {
Chris@49 576 if(s_n_rows == 1)
Chris@49 577 {
Chris@49 578 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 579
Chris@49 580 const uword urow = aux_row1;
Chris@49 581 const uword start_col = aux_col1;
Chris@49 582
Chris@49 583 uword ii,jj;
Chris@49 584 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 585 {
Chris@49 586 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 587 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
Chris@49 588
Chris@49 589 A.at(urow, start_col+ii) *= tmp1;
Chris@49 590 A.at(urow, start_col+jj) *= tmp2;
Chris@49 591 }
Chris@49 592
Chris@49 593 if(ii < s_n_cols)
Chris@49 594 {
Chris@49 595 A.at(urow, start_col+ii) *= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 596 }
Chris@49 597 }
Chris@49 598 else
Chris@49 599 {
Chris@49 600 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 601 {
Chris@49 602 eT* s_col_data = s.colptr(ucol);
Chris@49 603
Chris@49 604 uword ii,jj;
Chris@49 605 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
Chris@49 606 {
Chris@49 607 const eT val1 = P.at(ii,ucol);
Chris@49 608 const eT val2 = P.at(jj,ucol);
Chris@49 609
Chris@49 610 s_col_data[ii] *= val1;
Chris@49 611 s_col_data[jj] *= val2;
Chris@49 612 }
Chris@49 613
Chris@49 614 if(ii < s_n_rows)
Chris@49 615 {
Chris@49 616 s_col_data[ii] *= P.at(ii,ucol);
Chris@49 617 }
Chris@49 618 }
Chris@49 619 }
Chris@49 620 }
Chris@49 621 }
Chris@49 622
Chris@49 623
Chris@49 624
Chris@49 625 template<typename eT>
Chris@49 626 template<typename T1>
Chris@49 627 inline
Chris@49 628 void
Chris@49 629 subview<eT>::operator/= (const Base<eT,T1>& in)
Chris@49 630 {
Chris@49 631 arma_extra_debug_sigprint();
Chris@49 632
Chris@49 633 const Proxy<T1> P(in.get_ref());
Chris@49 634
Chris@49 635 subview<eT>& s = *this;
Chris@49 636
Chris@49 637 const uword s_n_rows = s.n_rows;
Chris@49 638 const uword s_n_cols = s.n_cols;
Chris@49 639
Chris@49 640 arma_debug_assert_same_size(s, P, "element-wise division");
Chris@49 641
Chris@49 642 const bool is_alias = P.is_alias(s.m);
Chris@49 643
Chris@49 644 arma_extra_debug_warn(is_alias, "aliasing detected");
Chris@49 645
Chris@49 646 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
Chris@49 647 {
Chris@49 648 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
Chris@49 649 const Mat<eT>& x = tmp.M;
Chris@49 650
Chris@49 651 if(s_n_rows == 1)
Chris@49 652 {
Chris@49 653 const eT* x_mem = x.memptr();
Chris@49 654
Chris@49 655 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 656
Chris@49 657 const uword urow = aux_row1;
Chris@49 658 const uword start_col = aux_col1;
Chris@49 659
Chris@49 660 uword ii,jj;
Chris@49 661 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 662 {
Chris@49 663 A.at(urow, start_col+ii) /= x_mem[ii];
Chris@49 664 A.at(urow, start_col+jj) /= x_mem[jj];
Chris@49 665 }
Chris@49 666
Chris@49 667 if(ii < s_n_cols)
Chris@49 668 {
Chris@49 669 A.at(urow, start_col+ii) /= x_mem[ii];
Chris@49 670 }
Chris@49 671 }
Chris@49 672 else
Chris@49 673 {
Chris@49 674 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 675 {
Chris@49 676 arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 677 }
Chris@49 678 }
Chris@49 679 }
Chris@49 680 else
Chris@49 681 {
Chris@49 682 if(s_n_rows == 1)
Chris@49 683 {
Chris@49 684 Mat<eT>& A = const_cast< Mat<eT>& >(m);
Chris@49 685
Chris@49 686 const uword urow = aux_row1;
Chris@49 687 const uword start_col = aux_col1;
Chris@49 688
Chris@49 689 uword ii,jj;
Chris@49 690 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 691 {
Chris@49 692 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 693 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
Chris@49 694
Chris@49 695 A.at(urow, start_col+ii) /= tmp1;
Chris@49 696 A.at(urow, start_col+jj) /= tmp2;
Chris@49 697 }
Chris@49 698
Chris@49 699 if(ii < s_n_cols)
Chris@49 700 {
Chris@49 701 A.at(urow, start_col+ii) /= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
Chris@49 702 }
Chris@49 703 }
Chris@49 704 else
Chris@49 705 {
Chris@49 706 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 707 {
Chris@49 708 eT* s_col_data = s.colptr(ucol);
Chris@49 709
Chris@49 710 uword ii,jj;
Chris@49 711 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
Chris@49 712 {
Chris@49 713 const eT val1 = P.at(ii,ucol);
Chris@49 714 const eT val2 = P.at(jj,ucol);
Chris@49 715
Chris@49 716 s_col_data[ii] /= val1;
Chris@49 717 s_col_data[jj] /= val2;
Chris@49 718 }
Chris@49 719
Chris@49 720 if(ii < s_n_rows)
Chris@49 721 {
Chris@49 722 s_col_data[ii] /= P.at(ii,ucol);
Chris@49 723 }
Chris@49 724 }
Chris@49 725 }
Chris@49 726 }
Chris@49 727 }
Chris@49 728
Chris@49 729
Chris@49 730
Chris@49 731 //! x.submat(...) = y.submat(...)
Chris@49 732 template<typename eT>
Chris@49 733 inline
Chris@49 734 void
Chris@49 735 subview<eT>::operator= (const subview<eT>& x_in)
Chris@49 736 {
Chris@49 737 arma_extra_debug_sigprint();
Chris@49 738
Chris@49 739 const bool overlap = check_overlap(x_in);
Chris@49 740
Chris@49 741 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
Chris@49 742 const subview<eT>* tmp_subview = overlap ? new subview<eT>(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
Chris@49 743 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
Chris@49 744
Chris@49 745 subview<eT>& s = *this;
Chris@49 746
Chris@49 747 arma_debug_assert_same_size(s, x, "copy into submatrix");
Chris@49 748
Chris@49 749 const uword s_n_cols = s.n_cols;
Chris@49 750 const uword s_n_rows = s.n_rows;
Chris@49 751
Chris@49 752 if(s_n_rows == 1)
Chris@49 753 {
Chris@49 754 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
Chris@49 755 const Mat<eT>& B = x.m;
Chris@49 756
Chris@49 757 const uword row_A = s.aux_row1;
Chris@49 758 const uword row_B = x.aux_row1;
Chris@49 759
Chris@49 760 const uword start_col_A = s.aux_col1;
Chris@49 761 const uword start_col_B = x.aux_col1;
Chris@49 762
Chris@49 763 uword ii,jj;
Chris@49 764 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 765 {
Chris@49 766 const eT tmp1 = B.at(row_B, start_col_B + ii);
Chris@49 767 const eT tmp2 = B.at(row_B, start_col_B + jj);
Chris@49 768
Chris@49 769 A.at(row_A, start_col_A + ii) = tmp1;
Chris@49 770 A.at(row_A, start_col_A + jj) = tmp2;
Chris@49 771 }
Chris@49 772
Chris@49 773 if(ii < s_n_cols)
Chris@49 774 {
Chris@49 775 A.at(row_A, start_col_A + ii) = B.at(row_B, start_col_B + ii);
Chris@49 776 }
Chris@49 777 }
Chris@49 778 else
Chris@49 779 {
Chris@49 780 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 781 {
Chris@49 782 arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 783 }
Chris@49 784 }
Chris@49 785
Chris@49 786 if(overlap)
Chris@49 787 {
Chris@49 788 delete tmp_subview;
Chris@49 789 delete tmp_mat;
Chris@49 790 }
Chris@49 791 }
Chris@49 792
Chris@49 793
Chris@49 794
Chris@49 795 template<typename eT>
Chris@49 796 inline
Chris@49 797 void
Chris@49 798 subview<eT>::operator+= (const subview<eT>& x_in)
Chris@49 799 {
Chris@49 800 arma_extra_debug_sigprint();
Chris@49 801
Chris@49 802 const bool overlap = check_overlap(x_in);
Chris@49 803
Chris@49 804 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
Chris@49 805 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
Chris@49 806 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
Chris@49 807
Chris@49 808 subview<eT>& s = *this;
Chris@49 809
Chris@49 810 arma_debug_assert_same_size(s, x, "addition");
Chris@49 811
Chris@49 812 const uword s_n_rows = s.n_rows;
Chris@49 813 const uword s_n_cols = s.n_cols;
Chris@49 814
Chris@49 815 if(s_n_rows == 1)
Chris@49 816 {
Chris@49 817 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
Chris@49 818 const Mat<eT>& B = x.m;
Chris@49 819
Chris@49 820 const uword row_A = s.aux_row1;
Chris@49 821 const uword row_B = x.aux_row1;
Chris@49 822
Chris@49 823 const uword start_col_A = s.aux_col1;
Chris@49 824 const uword start_col_B = x.aux_col1;
Chris@49 825
Chris@49 826 uword ii,jj;
Chris@49 827
Chris@49 828 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 829 {
Chris@49 830 const eT tmp1 = B.at(row_B, start_col_B + ii);
Chris@49 831 const eT tmp2 = B.at(row_B, start_col_B + jj);
Chris@49 832
Chris@49 833 A.at(row_A, start_col_A + ii) += tmp1;
Chris@49 834 A.at(row_A, start_col_A + jj) += tmp2;
Chris@49 835 }
Chris@49 836
Chris@49 837 if(ii < s_n_cols)
Chris@49 838 {
Chris@49 839 A.at(row_A, start_col_A + ii) += B.at(row_B, start_col_B + ii);
Chris@49 840 }
Chris@49 841 }
Chris@49 842 else
Chris@49 843 {
Chris@49 844 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 845 {
Chris@49 846 arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 847 }
Chris@49 848 }
Chris@49 849
Chris@49 850 if(overlap)
Chris@49 851 {
Chris@49 852 delete tmp_subview;
Chris@49 853 delete tmp_mat;
Chris@49 854 }
Chris@49 855 }
Chris@49 856
Chris@49 857
Chris@49 858
Chris@49 859 template<typename eT>
Chris@49 860 inline
Chris@49 861 void
Chris@49 862 subview<eT>::operator-= (const subview<eT>& x_in)
Chris@49 863 {
Chris@49 864 arma_extra_debug_sigprint();
Chris@49 865
Chris@49 866 const bool overlap = check_overlap(x_in);
Chris@49 867
Chris@49 868 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
Chris@49 869 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
Chris@49 870 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
Chris@49 871
Chris@49 872 subview<eT>& s = *this;
Chris@49 873
Chris@49 874 arma_debug_assert_same_size(s, x, "subtraction");
Chris@49 875
Chris@49 876 const uword s_n_rows = s.n_rows;
Chris@49 877 const uword s_n_cols = s.n_cols;
Chris@49 878
Chris@49 879 if(s_n_rows == 1)
Chris@49 880 {
Chris@49 881 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
Chris@49 882 const Mat<eT>& B = x.m;
Chris@49 883
Chris@49 884 const uword row_A = s.aux_row1;
Chris@49 885 const uword row_B = x.aux_row1;
Chris@49 886
Chris@49 887 const uword start_col_A = s.aux_col1;
Chris@49 888 const uword start_col_B = x.aux_col1;
Chris@49 889
Chris@49 890 uword ii,jj;
Chris@49 891 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 892 {
Chris@49 893 const eT tmp1 = B.at(row_B, start_col_B + ii);
Chris@49 894 const eT tmp2 = B.at(row_B, start_col_B + jj);
Chris@49 895
Chris@49 896 A.at(row_A, start_col_A + ii) -= tmp1;
Chris@49 897 A.at(row_A, start_col_A + jj) -= tmp2;
Chris@49 898 }
Chris@49 899
Chris@49 900 if(ii < s_n_cols)
Chris@49 901 {
Chris@49 902 A.at(row_A, start_col_A + ii) -= B.at(row_B, start_col_B + ii);
Chris@49 903 }
Chris@49 904 }
Chris@49 905 else
Chris@49 906 {
Chris@49 907 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 908 {
Chris@49 909 arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 910 }
Chris@49 911 }
Chris@49 912
Chris@49 913 if(overlap)
Chris@49 914 {
Chris@49 915 delete tmp_subview;
Chris@49 916 delete tmp_mat;
Chris@49 917 }
Chris@49 918
Chris@49 919 }
Chris@49 920
Chris@49 921
Chris@49 922
Chris@49 923 template<typename eT>
Chris@49 924 inline
Chris@49 925 void
Chris@49 926 subview<eT>::operator%= (const subview& x_in)
Chris@49 927 {
Chris@49 928 arma_extra_debug_sigprint();
Chris@49 929
Chris@49 930 const bool overlap = check_overlap(x_in);
Chris@49 931
Chris@49 932 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
Chris@49 933 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
Chris@49 934 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
Chris@49 935
Chris@49 936 subview<eT>& s = *this;
Chris@49 937
Chris@49 938 arma_debug_assert_same_size(s, x, "element-wise multiplication");
Chris@49 939
Chris@49 940 const uword s_n_rows = s.n_rows;
Chris@49 941 const uword s_n_cols = s.n_cols;
Chris@49 942
Chris@49 943 if(s_n_rows == 1)
Chris@49 944 {
Chris@49 945 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
Chris@49 946 const Mat<eT>& B = x.m;
Chris@49 947
Chris@49 948 const uword row_A = s.aux_row1;
Chris@49 949 const uword row_B = x.aux_row1;
Chris@49 950
Chris@49 951 const uword start_col_A = s.aux_col1;
Chris@49 952 const uword start_col_B = x.aux_col1;
Chris@49 953
Chris@49 954 uword ii,jj;
Chris@49 955 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 956 {
Chris@49 957 const eT tmp1 = B.at(row_B, start_col_B + ii);
Chris@49 958 const eT tmp2 = B.at(row_B, start_col_B + jj);
Chris@49 959
Chris@49 960 A.at(row_A, start_col_A + ii) *= tmp1;
Chris@49 961 A.at(row_A, start_col_A + jj) *= tmp2;
Chris@49 962 }
Chris@49 963
Chris@49 964 if(ii < s_n_cols)
Chris@49 965 {
Chris@49 966 A.at(row_A, start_col_A + ii) *= B.at(row_B, start_col_B + ii);
Chris@49 967 }
Chris@49 968 }
Chris@49 969 else
Chris@49 970 {
Chris@49 971 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 972 {
Chris@49 973 arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 974 }
Chris@49 975 }
Chris@49 976
Chris@49 977 if(overlap)
Chris@49 978 {
Chris@49 979 delete tmp_subview;
Chris@49 980 delete tmp_mat;
Chris@49 981 }
Chris@49 982
Chris@49 983 }
Chris@49 984
Chris@49 985
Chris@49 986
Chris@49 987 template<typename eT>
Chris@49 988 inline
Chris@49 989 void
Chris@49 990 subview<eT>::operator/= (const subview& x_in)
Chris@49 991 {
Chris@49 992 arma_extra_debug_sigprint();
Chris@49 993
Chris@49 994 const bool overlap = check_overlap(x_in);
Chris@49 995
Chris@49 996 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
Chris@49 997 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
Chris@49 998 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
Chris@49 999
Chris@49 1000 subview<eT>& s = *this;
Chris@49 1001
Chris@49 1002 arma_debug_assert_same_size(s, x, "element-wise division");
Chris@49 1003
Chris@49 1004 const uword s_n_rows = s.n_rows;
Chris@49 1005 const uword s_n_cols = s.n_cols;
Chris@49 1006
Chris@49 1007 if(s_n_rows == 1)
Chris@49 1008 {
Chris@49 1009 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
Chris@49 1010 const Mat<eT>& B = x.m;
Chris@49 1011
Chris@49 1012 const uword row_A = s.aux_row1;
Chris@49 1013 const uword row_B = x.aux_row1;
Chris@49 1014
Chris@49 1015 const uword start_col_A = s.aux_col1;
Chris@49 1016 const uword start_col_B = x.aux_col1;
Chris@49 1017
Chris@49 1018 uword ii,jj;
Chris@49 1019 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
Chris@49 1020 {
Chris@49 1021 const eT tmp1 = B.at(row_B, start_col_B + ii);
Chris@49 1022 const eT tmp2 = B.at(row_B, start_col_B + jj);
Chris@49 1023
Chris@49 1024 A.at(row_A, start_col_A + ii) /= tmp1;
Chris@49 1025 A.at(row_A, start_col_A + jj) /= tmp2;
Chris@49 1026 }
Chris@49 1027
Chris@49 1028 if(ii < s_n_cols)
Chris@49 1029 {
Chris@49 1030 A.at(row_A, start_col_A + ii) /= B.at(row_B, start_col_B + ii);
Chris@49 1031 }
Chris@49 1032 }
Chris@49 1033 else
Chris@49 1034 {
Chris@49 1035 for(uword ucol=0; ucol < s_n_cols; ++ucol)
Chris@49 1036 {
Chris@49 1037 arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows );
Chris@49 1038 }
Chris@49 1039 }
Chris@49 1040
Chris@49 1041 if(overlap)
Chris@49 1042 {
Chris@49 1043 delete tmp_subview;
Chris@49 1044 delete tmp_mat;
Chris@49 1045 }
Chris@49 1046
Chris@49 1047 }
Chris@49 1048
Chris@49 1049
Chris@49 1050
Chris@49 1051 //! transform each element in the subview using a functor
Chris@49 1052 template<typename eT>
Chris@49 1053 template<typename functor>
Chris@49 1054 inline
Chris@49 1055 void
Chris@49 1056 subview<eT>::transform(functor F)
Chris@49 1057 {
Chris@49 1058 arma_extra_debug_sigprint();
Chris@49 1059
Chris@49 1060 const uword local_n_cols = n_cols;
Chris@49 1061 const uword local_n_rows = n_rows;
Chris@49 1062
Chris@49 1063 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 1064
Chris@49 1065 if(local_n_rows == 1)
Chris@49 1066 {
Chris@49 1067 const uword urow = aux_row1;
Chris@49 1068 const uword start_col = aux_col1;
Chris@49 1069 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 1070
Chris@49 1071 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
Chris@49 1072 {
Chris@49 1073 X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) );
Chris@49 1074 }
Chris@49 1075 }
Chris@49 1076 else
Chris@49 1077 {
Chris@49 1078 const uword start_col = aux_col1;
Chris@49 1079 const uword start_row = aux_row1;
Chris@49 1080
Chris@49 1081 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 1082 const uword end_row_plus1 = start_row + local_n_rows;
Chris@49 1083
Chris@49 1084 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
Chris@49 1085 for(uword urow = start_row; urow < end_row_plus1; ++urow)
Chris@49 1086 {
Chris@49 1087 X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) );
Chris@49 1088 }
Chris@49 1089 }
Chris@49 1090 }
Chris@49 1091
Chris@49 1092
Chris@49 1093
Chris@49 1094 //! imbue (fill) the subview with values provided by a functor
Chris@49 1095 template<typename eT>
Chris@49 1096 template<typename functor>
Chris@49 1097 inline
Chris@49 1098 void
Chris@49 1099 subview<eT>::imbue(functor F)
Chris@49 1100 {
Chris@49 1101 arma_extra_debug_sigprint();
Chris@49 1102
Chris@49 1103 const uword local_n_cols = n_cols;
Chris@49 1104 const uword local_n_rows = n_rows;
Chris@49 1105
Chris@49 1106 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 1107
Chris@49 1108 if(local_n_rows == 1)
Chris@49 1109 {
Chris@49 1110 const uword urow = aux_row1;
Chris@49 1111 const uword start_col = aux_col1;
Chris@49 1112 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 1113
Chris@49 1114 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
Chris@49 1115 {
Chris@49 1116 X.at(urow, ucol) = eT( F() );
Chris@49 1117 }
Chris@49 1118 }
Chris@49 1119 else
Chris@49 1120 {
Chris@49 1121 const uword start_col = aux_col1;
Chris@49 1122 const uword start_row = aux_row1;
Chris@49 1123
Chris@49 1124 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 1125 const uword end_row_plus1 = start_row + local_n_rows;
Chris@49 1126
Chris@49 1127 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
Chris@49 1128 for(uword urow = start_row; urow < end_row_plus1; ++urow)
Chris@49 1129 {
Chris@49 1130 X.at(urow, ucol) = eT( F() );
Chris@49 1131 }
Chris@49 1132 }
Chris@49 1133 }
Chris@49 1134
Chris@49 1135
Chris@49 1136
Chris@49 1137 template<typename eT>
Chris@49 1138 inline
Chris@49 1139 void
Chris@49 1140 subview<eT>::fill(const eT val)
Chris@49 1141 {
Chris@49 1142 arma_extra_debug_sigprint();
Chris@49 1143
Chris@49 1144 const uword local_n_cols = n_cols;
Chris@49 1145 const uword local_n_rows = n_rows;
Chris@49 1146
Chris@49 1147 if(local_n_rows == 1)
Chris@49 1148 {
Chris@49 1149 Mat<eT>& X = const_cast< Mat<eT>& >(m);
Chris@49 1150
Chris@49 1151 const uword urow = aux_row1;
Chris@49 1152 const uword start_col = aux_col1;
Chris@49 1153 const uword end_col_plus1 = start_col + local_n_cols;
Chris@49 1154
Chris@49 1155 uword ii,jj;
Chris@49 1156 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
Chris@49 1157 {
Chris@49 1158 X.at(urow, ii) = val;
Chris@49 1159 X.at(urow, jj) = val;
Chris@49 1160 }
Chris@49 1161
Chris@49 1162 if(ii < end_col_plus1)
Chris@49 1163 {
Chris@49 1164 X.at(urow, ii) = val;
Chris@49 1165 }
Chris@49 1166 }
Chris@49 1167 else
Chris@49 1168 {
Chris@49 1169 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 1170 {
Chris@49 1171 arrayops::inplace_set( colptr(ucol), val, local_n_rows );
Chris@49 1172 }
Chris@49 1173 }
Chris@49 1174 }
Chris@49 1175
Chris@49 1176
Chris@49 1177
Chris@49 1178 template<typename eT>
Chris@49 1179 inline
Chris@49 1180 void
Chris@49 1181 subview<eT>::zeros()
Chris@49 1182 {
Chris@49 1183 arma_extra_debug_sigprint();
Chris@49 1184
Chris@49 1185 (*this).fill(eT(0));
Chris@49 1186 }
Chris@49 1187
Chris@49 1188
Chris@49 1189
Chris@49 1190 template<typename eT>
Chris@49 1191 inline
Chris@49 1192 void
Chris@49 1193 subview<eT>::ones()
Chris@49 1194 {
Chris@49 1195 arma_extra_debug_sigprint();
Chris@49 1196
Chris@49 1197 (*this).fill(eT(1));
Chris@49 1198 }
Chris@49 1199
Chris@49 1200
Chris@49 1201
Chris@49 1202 template<typename eT>
Chris@49 1203 inline
Chris@49 1204 void
Chris@49 1205 subview<eT>::eye()
Chris@49 1206 {
Chris@49 1207 arma_extra_debug_sigprint();
Chris@49 1208
Chris@49 1209 fill(eT(0));
Chris@49 1210
Chris@49 1211 const uword N = (std::min)(n_rows, n_cols);
Chris@49 1212
Chris@49 1213 for(uword ii=0; ii < N; ++ii)
Chris@49 1214 {
Chris@49 1215 at(ii,ii) = eT(1);
Chris@49 1216 }
Chris@49 1217 }
Chris@49 1218
Chris@49 1219
Chris@49 1220
Chris@49 1221 template<typename eT>
Chris@49 1222 inline
Chris@49 1223 eT
Chris@49 1224 subview<eT>::at_alt(const uword ii) const
Chris@49 1225 {
Chris@49 1226 return operator[](ii);
Chris@49 1227 }
Chris@49 1228
Chris@49 1229
Chris@49 1230
Chris@49 1231 template<typename eT>
Chris@49 1232 inline
Chris@49 1233 eT&
Chris@49 1234 subview<eT>::operator[](const uword ii)
Chris@49 1235 {
Chris@49 1236 const uword in_col = ii / n_rows;
Chris@49 1237 const uword in_row = ii % n_rows;
Chris@49 1238
Chris@49 1239 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1240
Chris@49 1241 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
Chris@49 1242 }
Chris@49 1243
Chris@49 1244
Chris@49 1245
Chris@49 1246 template<typename eT>
Chris@49 1247 inline
Chris@49 1248 eT
Chris@49 1249 subview<eT>::operator[](const uword ii) const
Chris@49 1250 {
Chris@49 1251 const uword in_col = ii / n_rows;
Chris@49 1252 const uword in_row = ii % n_rows;
Chris@49 1253
Chris@49 1254 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1255
Chris@49 1256 return m.mem[index];
Chris@49 1257 }
Chris@49 1258
Chris@49 1259
Chris@49 1260
Chris@49 1261 template<typename eT>
Chris@49 1262 inline
Chris@49 1263 eT&
Chris@49 1264 subview<eT>::operator()(const uword ii)
Chris@49 1265 {
Chris@49 1266 arma_debug_check( (ii >= n_elem), "subview::operator(): index out of bounds");
Chris@49 1267
Chris@49 1268 const uword in_col = ii / n_rows;
Chris@49 1269 const uword in_row = ii % n_rows;
Chris@49 1270
Chris@49 1271 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1272
Chris@49 1273 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
Chris@49 1274 }
Chris@49 1275
Chris@49 1276
Chris@49 1277
Chris@49 1278 template<typename eT>
Chris@49 1279 inline
Chris@49 1280 eT
Chris@49 1281 subview<eT>::operator()(const uword ii) const
Chris@49 1282 {
Chris@49 1283 arma_debug_check( (ii >= n_elem), "subview::operator(): index out of bounds");
Chris@49 1284
Chris@49 1285 const uword in_col = ii / n_rows;
Chris@49 1286 const uword in_row = ii % n_rows;
Chris@49 1287
Chris@49 1288 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1289
Chris@49 1290 return m.mem[index];
Chris@49 1291 }
Chris@49 1292
Chris@49 1293
Chris@49 1294
Chris@49 1295 template<typename eT>
Chris@49 1296 inline
Chris@49 1297 eT&
Chris@49 1298 subview<eT>::operator()(const uword in_row, const uword in_col)
Chris@49 1299 {
Chris@49 1300 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview::operator(): index out of bounds");
Chris@49 1301
Chris@49 1302 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1303
Chris@49 1304 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
Chris@49 1305 }
Chris@49 1306
Chris@49 1307
Chris@49 1308
Chris@49 1309 template<typename eT>
Chris@49 1310 inline
Chris@49 1311 eT
Chris@49 1312 subview<eT>::operator()(const uword in_row, const uword in_col) const
Chris@49 1313 {
Chris@49 1314 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview::operator(): index out of bounds");
Chris@49 1315
Chris@49 1316 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1317
Chris@49 1318 return m.mem[index];
Chris@49 1319 }
Chris@49 1320
Chris@49 1321
Chris@49 1322
Chris@49 1323 template<typename eT>
Chris@49 1324 inline
Chris@49 1325 eT&
Chris@49 1326 subview<eT>::at(const uword in_row, const uword in_col)
Chris@49 1327 {
Chris@49 1328 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1329
Chris@49 1330 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
Chris@49 1331 }
Chris@49 1332
Chris@49 1333
Chris@49 1334
Chris@49 1335 template<typename eT>
Chris@49 1336 inline
Chris@49 1337 eT
Chris@49 1338 subview<eT>::at(const uword in_row, const uword in_col) const
Chris@49 1339 {
Chris@49 1340 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1341
Chris@49 1342 return m.mem[index];
Chris@49 1343 }
Chris@49 1344
Chris@49 1345
Chris@49 1346
Chris@49 1347 template<typename eT>
Chris@49 1348 arma_inline
Chris@49 1349 eT*
Chris@49 1350 subview<eT>::colptr(const uword in_col)
Chris@49 1351 {
Chris@49 1352 return & access::rw((const_cast< Mat<eT>& >(m)).mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]);
Chris@49 1353 }
Chris@49 1354
Chris@49 1355
Chris@49 1356
Chris@49 1357 template<typename eT>
Chris@49 1358 arma_inline
Chris@49 1359 const eT*
Chris@49 1360 subview<eT>::colptr(const uword in_col) const
Chris@49 1361 {
Chris@49 1362 return & m.mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ];
Chris@49 1363 }
Chris@49 1364
Chris@49 1365
Chris@49 1366
Chris@49 1367 template<typename eT>
Chris@49 1368 inline
Chris@49 1369 bool
Chris@49 1370 subview<eT>::check_overlap(const subview<eT>& x) const
Chris@49 1371 {
Chris@49 1372 const subview<eT>& s = *this;
Chris@49 1373
Chris@49 1374 if(&s.m != &x.m)
Chris@49 1375 {
Chris@49 1376 return false;
Chris@49 1377 }
Chris@49 1378 else
Chris@49 1379 {
Chris@49 1380 if( (s.n_elem == 0) || (x.n_elem == 0) )
Chris@49 1381 {
Chris@49 1382 return false;
Chris@49 1383 }
Chris@49 1384 else
Chris@49 1385 {
Chris@49 1386 const uword s_row_start = s.aux_row1;
Chris@49 1387 const uword s_row_end_p1 = s_row_start + s.n_rows;
Chris@49 1388
Chris@49 1389 const uword s_col_start = s.aux_col1;
Chris@49 1390 const uword s_col_end_p1 = s_col_start + s.n_cols;
Chris@49 1391
Chris@49 1392
Chris@49 1393 const uword x_row_start = x.aux_row1;
Chris@49 1394 const uword x_row_end_p1 = x_row_start + x.n_rows;
Chris@49 1395
Chris@49 1396 const uword x_col_start = x.aux_col1;
Chris@49 1397 const uword x_col_end_p1 = x_col_start + x.n_cols;
Chris@49 1398
Chris@49 1399
Chris@49 1400 const bool outside_rows = ( (x_row_start >= s_row_end_p1) || (s_row_start >= x_row_end_p1) );
Chris@49 1401 const bool outside_cols = ( (x_col_start >= s_col_end_p1) || (s_col_start >= x_col_end_p1) );
Chris@49 1402
Chris@49 1403 return ( (outside_rows == false) && (outside_cols == false) );
Chris@49 1404 }
Chris@49 1405 }
Chris@49 1406 }
Chris@49 1407
Chris@49 1408
Chris@49 1409
Chris@49 1410 template<typename eT>
Chris@49 1411 inline
Chris@49 1412 bool
Chris@49 1413 subview<eT>::is_vec() const
Chris@49 1414 {
Chris@49 1415 return ( (n_rows == 1) || (n_cols == 1) );
Chris@49 1416 }
Chris@49 1417
Chris@49 1418
Chris@49 1419
Chris@49 1420 //! X = Y.submat(...)
Chris@49 1421 template<typename eT>
Chris@49 1422 inline
Chris@49 1423 void
Chris@49 1424 subview<eT>::extract(Mat<eT>& out, const subview<eT>& in)
Chris@49 1425 {
Chris@49 1426 arma_extra_debug_sigprint();
Chris@49 1427
Chris@49 1428 // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;
Chris@49 1429 // size setting and alias checking is done by either the Mat contructor or operator=()
Chris@49 1430
Chris@49 1431 const uword n_rows = in.n_rows; // number of rows in the subview
Chris@49 1432 const uword n_cols = in.n_cols; // number of columns in the subview
Chris@49 1433
Chris@49 1434 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.m.n_rows % in.m.n_cols );
Chris@49 1435
Chris@49 1436
Chris@49 1437 if(in.is_vec() == true)
Chris@49 1438 {
Chris@49 1439 if(n_cols == 1) // a column vector
Chris@49 1440 {
Chris@49 1441 arma_extra_debug_print("subview::extract(): copying col (going across rows)");
Chris@49 1442
Chris@49 1443 // in.colptr(0) the first column of the subview, taking into account any row offset
Chris@49 1444 arrayops::copy( out.memptr(), in.colptr(0), n_rows );
Chris@49 1445 }
Chris@49 1446 else // a row vector (possibly empty)
Chris@49 1447 {
Chris@49 1448 arma_extra_debug_print("subview::extract(): copying row (going across columns)");
Chris@49 1449
Chris@49 1450 const Mat<eT>& X = in.m;
Chris@49 1451
Chris@49 1452 eT* out_mem = out.memptr();
Chris@49 1453
Chris@49 1454 const uword row = in.aux_row1;
Chris@49 1455 const uword start_col = in.aux_col1;
Chris@49 1456
Chris@49 1457 uword i,j;
Chris@49 1458
Chris@49 1459 for(i=0, j=1; j < n_cols; i+=2, j+=2)
Chris@49 1460 {
Chris@49 1461 const eT tmp1 = X.at(row, start_col+i);
Chris@49 1462 const eT tmp2 = X.at(row, start_col+j);
Chris@49 1463
Chris@49 1464 out_mem[i] = tmp1;
Chris@49 1465 out_mem[j] = tmp2;
Chris@49 1466 }
Chris@49 1467
Chris@49 1468 if(i < n_cols)
Chris@49 1469 {
Chris@49 1470 out_mem[i] = X.at(row, start_col+i);
Chris@49 1471 }
Chris@49 1472 }
Chris@49 1473 }
Chris@49 1474 else // general submatrix
Chris@49 1475 {
Chris@49 1476 arma_extra_debug_print("subview::extract(): general submatrix");
Chris@49 1477
Chris@49 1478 for(uword col=0; col < n_cols; ++col)
Chris@49 1479 {
Chris@49 1480 arrayops::copy( out.colptr(col), in.colptr(col), n_rows );
Chris@49 1481 }
Chris@49 1482 }
Chris@49 1483 }
Chris@49 1484
Chris@49 1485
Chris@49 1486
Chris@49 1487 //! X += Y.submat(...)
Chris@49 1488 template<typename eT>
Chris@49 1489 inline
Chris@49 1490 void
Chris@49 1491 subview<eT>::plus_inplace(Mat<eT>& out, const subview<eT>& in)
Chris@49 1492 {
Chris@49 1493 arma_extra_debug_sigprint();
Chris@49 1494
Chris@49 1495 arma_debug_assert_same_size(out, in, "addition");
Chris@49 1496
Chris@49 1497 const uword n_rows = in.n_rows;
Chris@49 1498 const uword n_cols = in.n_cols;
Chris@49 1499
Chris@49 1500 if(n_rows == 1)
Chris@49 1501 {
Chris@49 1502 eT* out_mem = out.memptr();
Chris@49 1503
Chris@49 1504 const Mat<eT>& X = in.m;
Chris@49 1505
Chris@49 1506 const uword row = in.aux_row1;
Chris@49 1507 const uword start_col = in.aux_col1;
Chris@49 1508
Chris@49 1509 uword i,j;
Chris@49 1510 for(i=0, j=1; j < n_cols; i+=2, j+=2)
Chris@49 1511 {
Chris@49 1512 const eT tmp1 = X.at(row, start_col+i);
Chris@49 1513 const eT tmp2 = X.at(row, start_col+j);
Chris@49 1514
Chris@49 1515 out_mem[i] += tmp1;
Chris@49 1516 out_mem[j] += tmp2;
Chris@49 1517 }
Chris@49 1518
Chris@49 1519 if(i < n_cols)
Chris@49 1520 {
Chris@49 1521 out_mem[i] += X.at(row, start_col+i);
Chris@49 1522 }
Chris@49 1523 }
Chris@49 1524 else
Chris@49 1525 {
Chris@49 1526 for(uword col=0; col < n_cols; ++col)
Chris@49 1527 {
Chris@49 1528 arrayops::inplace_plus(out.colptr(col), in.colptr(col), n_rows);
Chris@49 1529 }
Chris@49 1530 }
Chris@49 1531 }
Chris@49 1532
Chris@49 1533
Chris@49 1534
Chris@49 1535 //! X -= Y.submat(...)
Chris@49 1536 template<typename eT>
Chris@49 1537 inline
Chris@49 1538 void
Chris@49 1539 subview<eT>::minus_inplace(Mat<eT>& out, const subview<eT>& in)
Chris@49 1540 {
Chris@49 1541 arma_extra_debug_sigprint();
Chris@49 1542
Chris@49 1543 arma_debug_assert_same_size(out, in, "subtraction");
Chris@49 1544
Chris@49 1545 const uword n_rows = in.n_rows;
Chris@49 1546 const uword n_cols = in.n_cols;
Chris@49 1547
Chris@49 1548 if(n_rows == 1)
Chris@49 1549 {
Chris@49 1550 eT* out_mem = out.memptr();
Chris@49 1551
Chris@49 1552 const Mat<eT>& X = in.m;
Chris@49 1553
Chris@49 1554 const uword row = in.aux_row1;
Chris@49 1555 const uword start_col = in.aux_col1;
Chris@49 1556
Chris@49 1557 uword i,j;
Chris@49 1558 for(i=0, j=1; j < n_cols; i+=2, j+=2)
Chris@49 1559 {
Chris@49 1560 const eT tmp1 = X.at(row, start_col+i);
Chris@49 1561 const eT tmp2 = X.at(row, start_col+j);
Chris@49 1562
Chris@49 1563 out_mem[i] -= tmp1;
Chris@49 1564 out_mem[j] -= tmp2;
Chris@49 1565 }
Chris@49 1566
Chris@49 1567 if(i < n_cols)
Chris@49 1568 {
Chris@49 1569 out_mem[i] -= X.at(row, start_col+i);
Chris@49 1570 }
Chris@49 1571 }
Chris@49 1572 else
Chris@49 1573 {
Chris@49 1574 for(uword col=0; col < n_cols; ++col)
Chris@49 1575 {
Chris@49 1576 arrayops::inplace_minus(out.colptr(col), in.colptr(col), n_rows);
Chris@49 1577 }
Chris@49 1578 }
Chris@49 1579 }
Chris@49 1580
Chris@49 1581
Chris@49 1582
Chris@49 1583 //! X %= Y.submat(...)
Chris@49 1584 template<typename eT>
Chris@49 1585 inline
Chris@49 1586 void
Chris@49 1587 subview<eT>::schur_inplace(Mat<eT>& out, const subview<eT>& in)
Chris@49 1588 {
Chris@49 1589 arma_extra_debug_sigprint();
Chris@49 1590
Chris@49 1591 arma_debug_assert_same_size(out, in, "element-wise multiplication");
Chris@49 1592
Chris@49 1593 const uword n_rows = in.n_rows;
Chris@49 1594 const uword n_cols = in.n_cols;
Chris@49 1595
Chris@49 1596 if(n_rows == 1)
Chris@49 1597 {
Chris@49 1598 eT* out_mem = out.memptr();
Chris@49 1599
Chris@49 1600 const Mat<eT>& X = in.m;
Chris@49 1601
Chris@49 1602 const uword row = in.aux_row1;
Chris@49 1603 const uword start_col = in.aux_col1;
Chris@49 1604
Chris@49 1605 uword i,j;
Chris@49 1606 for(i=0, j=1; j < n_cols; i+=2, j+=2)
Chris@49 1607 {
Chris@49 1608 const eT tmp1 = X.at(row, start_col+i);
Chris@49 1609 const eT tmp2 = X.at(row, start_col+j);
Chris@49 1610
Chris@49 1611 out_mem[i] *= tmp1;
Chris@49 1612 out_mem[j] *= tmp2;
Chris@49 1613 }
Chris@49 1614
Chris@49 1615 if(i < n_cols)
Chris@49 1616 {
Chris@49 1617 out_mem[i] *= X.at(row, start_col+i);
Chris@49 1618 }
Chris@49 1619 }
Chris@49 1620 else
Chris@49 1621 {
Chris@49 1622 for(uword col=0; col < n_cols; ++col)
Chris@49 1623 {
Chris@49 1624 arrayops::inplace_mul(out.colptr(col), in.colptr(col), n_rows);
Chris@49 1625 }
Chris@49 1626 }
Chris@49 1627 }
Chris@49 1628
Chris@49 1629
Chris@49 1630
Chris@49 1631 //! X /= Y.submat(...)
Chris@49 1632 template<typename eT>
Chris@49 1633 inline
Chris@49 1634 void
Chris@49 1635 subview<eT>::div_inplace(Mat<eT>& out, const subview<eT>& in)
Chris@49 1636 {
Chris@49 1637 arma_extra_debug_sigprint();
Chris@49 1638
Chris@49 1639 arma_debug_assert_same_size(out, in, "element-wise division");
Chris@49 1640
Chris@49 1641 const uword n_rows = in.n_rows;
Chris@49 1642 const uword n_cols = in.n_cols;
Chris@49 1643
Chris@49 1644 if(n_rows == 1)
Chris@49 1645 {
Chris@49 1646 eT* out_mem = out.memptr();
Chris@49 1647
Chris@49 1648 const Mat<eT>& X = in.m;
Chris@49 1649
Chris@49 1650 const uword row = in.aux_row1;
Chris@49 1651 const uword start_col = in.aux_col1;
Chris@49 1652
Chris@49 1653 uword i,j;
Chris@49 1654 for(i=0, j=1; j < n_cols; i+=2, j+=2)
Chris@49 1655 {
Chris@49 1656 const eT tmp1 = X.at(row, start_col+i);
Chris@49 1657 const eT tmp2 = X.at(row, start_col+j);
Chris@49 1658
Chris@49 1659 out_mem[i] /= tmp1;
Chris@49 1660 out_mem[j] /= tmp2;
Chris@49 1661 }
Chris@49 1662
Chris@49 1663 if(i < n_cols)
Chris@49 1664 {
Chris@49 1665 out_mem[i] /= X.at(row, start_col+i);
Chris@49 1666 }
Chris@49 1667 }
Chris@49 1668 else
Chris@49 1669 {
Chris@49 1670 for(uword col=0; col < n_cols; ++col)
Chris@49 1671 {
Chris@49 1672 arrayops::inplace_div(out.colptr(col), in.colptr(col), n_rows);
Chris@49 1673 }
Chris@49 1674 }
Chris@49 1675 }
Chris@49 1676
Chris@49 1677
Chris@49 1678
Chris@49 1679 //! creation of subview (row vector)
Chris@49 1680 template<typename eT>
Chris@49 1681 inline
Chris@49 1682 subview_row<eT>
Chris@49 1683 subview<eT>::row(const uword row_num)
Chris@49 1684 {
Chris@49 1685 arma_extra_debug_sigprint();
Chris@49 1686
Chris@49 1687 arma_debug_check( row_num >= n_rows, "subview::row(): out of bounds" );
Chris@49 1688
Chris@49 1689 const uword base_row = aux_row1 + row_num;
Chris@49 1690
Chris@49 1691 return subview_row<eT>(m, base_row, aux_col1, n_cols);
Chris@49 1692 }
Chris@49 1693
Chris@49 1694
Chris@49 1695
Chris@49 1696 //! creation of subview (row vector)
Chris@49 1697 template<typename eT>
Chris@49 1698 inline
Chris@49 1699 const subview_row<eT>
Chris@49 1700 subview<eT>::row(const uword row_num) const
Chris@49 1701 {
Chris@49 1702 arma_extra_debug_sigprint();
Chris@49 1703
Chris@49 1704 arma_debug_check( row_num >= n_rows, "subview::row(): out of bounds" );
Chris@49 1705
Chris@49 1706 const uword base_row = aux_row1 + row_num;
Chris@49 1707
Chris@49 1708 return subview_row<eT>(m, base_row, aux_col1, n_cols);
Chris@49 1709 }
Chris@49 1710
Chris@49 1711
Chris@49 1712
Chris@49 1713 template<typename eT>
Chris@49 1714 inline
Chris@49 1715 subview_row<eT>
Chris@49 1716 subview<eT>::operator()(const uword row_num, const span& col_span)
Chris@49 1717 {
Chris@49 1718 arma_extra_debug_sigprint();
Chris@49 1719
Chris@49 1720 const bool col_all = col_span.whole;
Chris@49 1721
Chris@49 1722 const uword local_n_cols = n_cols;
Chris@49 1723
Chris@49 1724 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 1725 const uword in_col2 = col_span.b;
Chris@49 1726 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 1727
Chris@49 1728 const uword base_col1 = aux_col1 + in_col1;
Chris@49 1729 const uword base_row = aux_row1 + row_num;
Chris@49 1730
Chris@49 1731 arma_debug_check
Chris@49 1732 (
Chris@49 1733 (row_num >= n_rows)
Chris@49 1734 ||
Chris@49 1735 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 1736 ,
Chris@49 1737 "subview::operator(): indices out of bounds or incorrectly used"
Chris@49 1738 );
Chris@49 1739
Chris@49 1740 return subview_row<eT>(m, base_row, base_col1, submat_n_cols);
Chris@49 1741 }
Chris@49 1742
Chris@49 1743
Chris@49 1744
Chris@49 1745 template<typename eT>
Chris@49 1746 inline
Chris@49 1747 const subview_row<eT>
Chris@49 1748 subview<eT>::operator()(const uword row_num, const span& col_span) const
Chris@49 1749 {
Chris@49 1750 arma_extra_debug_sigprint();
Chris@49 1751
Chris@49 1752 const bool col_all = col_span.whole;
Chris@49 1753
Chris@49 1754 const uword local_n_cols = n_cols;
Chris@49 1755
Chris@49 1756 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 1757 const uword in_col2 = col_span.b;
Chris@49 1758 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 1759
Chris@49 1760 const uword base_col1 = aux_col1 + in_col1;
Chris@49 1761 const uword base_row = aux_row1 + row_num;
Chris@49 1762
Chris@49 1763 arma_debug_check
Chris@49 1764 (
Chris@49 1765 (row_num >= n_rows)
Chris@49 1766 ||
Chris@49 1767 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 1768 ,
Chris@49 1769 "subview::operator(): indices out of bounds or incorrectly used"
Chris@49 1770 );
Chris@49 1771
Chris@49 1772 return subview_row<eT>(m, base_row, base_col1, submat_n_cols);
Chris@49 1773 }
Chris@49 1774
Chris@49 1775
Chris@49 1776
Chris@49 1777 //! creation of subview (column vector)
Chris@49 1778 template<typename eT>
Chris@49 1779 inline
Chris@49 1780 subview_col<eT>
Chris@49 1781 subview<eT>::col(const uword col_num)
Chris@49 1782 {
Chris@49 1783 arma_extra_debug_sigprint();
Chris@49 1784
Chris@49 1785 arma_debug_check( col_num >= n_cols, "subview::col(): out of bounds");
Chris@49 1786
Chris@49 1787 const uword base_col = aux_col1 + col_num;
Chris@49 1788
Chris@49 1789 return subview_col<eT>(m, base_col, aux_row1, n_rows);
Chris@49 1790 }
Chris@49 1791
Chris@49 1792
Chris@49 1793
Chris@49 1794 //! creation of subview (column vector)
Chris@49 1795 template<typename eT>
Chris@49 1796 inline
Chris@49 1797 const subview_col<eT>
Chris@49 1798 subview<eT>::col(const uword col_num) const
Chris@49 1799 {
Chris@49 1800 arma_extra_debug_sigprint();
Chris@49 1801
Chris@49 1802 arma_debug_check( col_num >= n_cols, "subview::col(): out of bounds");
Chris@49 1803
Chris@49 1804 const uword base_col = aux_col1 + col_num;
Chris@49 1805
Chris@49 1806 return subview_col<eT>(m, base_col, aux_row1, n_rows);
Chris@49 1807 }
Chris@49 1808
Chris@49 1809
Chris@49 1810
Chris@49 1811 template<typename eT>
Chris@49 1812 inline
Chris@49 1813 subview_col<eT>
Chris@49 1814 subview<eT>::operator()(const span& row_span, const uword col_num)
Chris@49 1815 {
Chris@49 1816 arma_extra_debug_sigprint();
Chris@49 1817
Chris@49 1818 const bool row_all = row_span.whole;
Chris@49 1819
Chris@49 1820 const uword local_n_rows = n_rows;
Chris@49 1821
Chris@49 1822 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 1823 const uword in_row2 = row_span.b;
Chris@49 1824 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 1825
Chris@49 1826 const uword base_row1 = aux_row1 + in_row1;
Chris@49 1827 const uword base_col = aux_col1 + col_num;
Chris@49 1828
Chris@49 1829 arma_debug_check
Chris@49 1830 (
Chris@49 1831 (col_num >= n_cols)
Chris@49 1832 ||
Chris@49 1833 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 1834 ,
Chris@49 1835 "subview::operator(): indices out of bounds or incorrectly used"
Chris@49 1836 );
Chris@49 1837
Chris@49 1838 return subview_col<eT>(m, base_col, base_row1, submat_n_rows);
Chris@49 1839 }
Chris@49 1840
Chris@49 1841
Chris@49 1842
Chris@49 1843 template<typename eT>
Chris@49 1844 inline
Chris@49 1845 const subview_col<eT>
Chris@49 1846 subview<eT>::operator()(const span& row_span, const uword col_num) const
Chris@49 1847 {
Chris@49 1848 arma_extra_debug_sigprint();
Chris@49 1849
Chris@49 1850 const bool row_all = row_span.whole;
Chris@49 1851
Chris@49 1852 const uword local_n_rows = n_rows;
Chris@49 1853
Chris@49 1854 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 1855 const uword in_row2 = row_span.b;
Chris@49 1856 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 1857
Chris@49 1858 const uword base_row1 = aux_row1 + in_row1;
Chris@49 1859 const uword base_col = aux_col1 + col_num;
Chris@49 1860
Chris@49 1861 arma_debug_check
Chris@49 1862 (
Chris@49 1863 (col_num >= n_cols)
Chris@49 1864 ||
Chris@49 1865 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 1866 ,
Chris@49 1867 "subview::operator(): indices out of bounds or incorrectly used"
Chris@49 1868 );
Chris@49 1869
Chris@49 1870 return subview_col<eT>(m, base_col, base_row1, submat_n_rows);
Chris@49 1871 }
Chris@49 1872
Chris@49 1873
Chris@49 1874
Chris@49 1875 //! create a Col object which uses memory from an existing matrix object.
Chris@49 1876 //! this approach is currently not alias safe
Chris@49 1877 //! and does not take into account that the parent matrix object could be deleted.
Chris@49 1878 //! if deleted memory is accessed by the created Col object,
Chris@49 1879 //! it will cause memory corruption and/or a crash
Chris@49 1880 template<typename eT>
Chris@49 1881 inline
Chris@49 1882 Col<eT>
Chris@49 1883 subview<eT>::unsafe_col(const uword col_num)
Chris@49 1884 {
Chris@49 1885 arma_extra_debug_sigprint();
Chris@49 1886
Chris@49 1887 arma_debug_check( col_num >= n_cols, "subview::unsafe_col(): out of bounds");
Chris@49 1888
Chris@49 1889 return Col<eT>(colptr(col_num), n_rows, false, true);
Chris@49 1890 }
Chris@49 1891
Chris@49 1892
Chris@49 1893
Chris@49 1894 //! create a Col object which uses memory from an existing matrix object.
Chris@49 1895 //! this approach is currently not alias safe
Chris@49 1896 //! and does not take into account that the parent matrix object could be deleted.
Chris@49 1897 //! if deleted memory is accessed by the created Col object,
Chris@49 1898 //! it will cause memory corruption and/or a crash
Chris@49 1899 template<typename eT>
Chris@49 1900 inline
Chris@49 1901 const Col<eT>
Chris@49 1902 subview<eT>::unsafe_col(const uword col_num) const
Chris@49 1903 {
Chris@49 1904 arma_extra_debug_sigprint();
Chris@49 1905
Chris@49 1906 arma_debug_check( col_num >= n_cols, "subview::unsafe_col(): out of bounds");
Chris@49 1907
Chris@49 1908 return Col<eT>(const_cast<eT*>(colptr(col_num)), n_rows, false, true);
Chris@49 1909 }
Chris@49 1910
Chris@49 1911
Chris@49 1912
Chris@49 1913 //! creation of subview (submatrix comprised of specified row vectors)
Chris@49 1914 template<typename eT>
Chris@49 1915 inline
Chris@49 1916 subview<eT>
Chris@49 1917 subview<eT>::rows(const uword in_row1, const uword in_row2)
Chris@49 1918 {
Chris@49 1919 arma_extra_debug_sigprint();
Chris@49 1920
Chris@49 1921 arma_debug_check
Chris@49 1922 (
Chris@49 1923 (in_row1 > in_row2) || (in_row2 >= n_rows),
Chris@49 1924 "subview::rows(): indices out of bounds or incorrectly used"
Chris@49 1925 );
Chris@49 1926
Chris@49 1927 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 1928 const uword base_row1 = aux_row1 + in_row1;
Chris@49 1929
Chris@49 1930 return subview<eT>(m, base_row1, aux_col1, subview_n_rows, n_cols );
Chris@49 1931 }
Chris@49 1932
Chris@49 1933
Chris@49 1934
Chris@49 1935 //! creation of subview (submatrix comprised of specified row vectors)
Chris@49 1936 template<typename eT>
Chris@49 1937 inline
Chris@49 1938 const subview<eT>
Chris@49 1939 subview<eT>::rows(const uword in_row1, const uword in_row2) const
Chris@49 1940 {
Chris@49 1941 arma_extra_debug_sigprint();
Chris@49 1942
Chris@49 1943 arma_debug_check
Chris@49 1944 (
Chris@49 1945 (in_row1 > in_row2) || (in_row2 >= n_rows),
Chris@49 1946 "subview::rows(): indices out of bounds or incorrectly used"
Chris@49 1947 );
Chris@49 1948
Chris@49 1949 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 1950 const uword base_row1 = aux_row1 + in_row1;
Chris@49 1951
Chris@49 1952 return subview<eT>(m, base_row1, aux_col1, subview_n_rows, n_cols );
Chris@49 1953 }
Chris@49 1954
Chris@49 1955
Chris@49 1956
Chris@49 1957 //! creation of subview (submatrix comprised of specified column vectors)
Chris@49 1958 template<typename eT>
Chris@49 1959 inline
Chris@49 1960 subview<eT>
Chris@49 1961 subview<eT>::cols(const uword in_col1, const uword in_col2)
Chris@49 1962 {
Chris@49 1963 arma_extra_debug_sigprint();
Chris@49 1964
Chris@49 1965 arma_debug_check
Chris@49 1966 (
Chris@49 1967 (in_col1 > in_col2) || (in_col2 >= n_cols),
Chris@49 1968 "subview::cols(): indices out of bounds or incorrectly used"
Chris@49 1969 );
Chris@49 1970
Chris@49 1971 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 1972 const uword base_col1 = aux_col1 + in_col1;
Chris@49 1973
Chris@49 1974 return subview<eT>(m, aux_row1, base_col1, n_rows, subview_n_cols);
Chris@49 1975 }
Chris@49 1976
Chris@49 1977
Chris@49 1978
Chris@49 1979 //! creation of subview (submatrix comprised of specified column vectors)
Chris@49 1980 template<typename eT>
Chris@49 1981 inline
Chris@49 1982 const subview<eT>
Chris@49 1983 subview<eT>::cols(const uword in_col1, const uword in_col2) const
Chris@49 1984 {
Chris@49 1985 arma_extra_debug_sigprint();
Chris@49 1986
Chris@49 1987 arma_debug_check
Chris@49 1988 (
Chris@49 1989 (in_col1 > in_col2) || (in_col2 >= n_cols),
Chris@49 1990 "subview::cols(): indices out of bounds or incorrectly used"
Chris@49 1991 );
Chris@49 1992
Chris@49 1993 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 1994 const uword base_col1 = aux_col1 + in_col1;
Chris@49 1995
Chris@49 1996 return subview<eT>(m, aux_row1, base_col1, n_rows, subview_n_cols);
Chris@49 1997 }
Chris@49 1998
Chris@49 1999
Chris@49 2000
Chris@49 2001 //! creation of subview (submatrix)
Chris@49 2002 template<typename eT>
Chris@49 2003 inline
Chris@49 2004 subview<eT>
Chris@49 2005 subview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)
Chris@49 2006 {
Chris@49 2007 arma_extra_debug_sigprint();
Chris@49 2008
Chris@49 2009 arma_debug_check
Chris@49 2010 (
Chris@49 2011 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
Chris@49 2012 "subview::submat(): indices out of bounds or incorrectly used"
Chris@49 2013 );
Chris@49 2014
Chris@49 2015 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2016 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2017
Chris@49 2018 const uword base_row1 = aux_row1 + in_row1;
Chris@49 2019 const uword base_col1 = aux_col1 + in_col1;
Chris@49 2020
Chris@49 2021 return subview<eT>(m, base_row1, base_col1, subview_n_rows, subview_n_cols);
Chris@49 2022 }
Chris@49 2023
Chris@49 2024
Chris@49 2025
Chris@49 2026 //! creation of subview (generic submatrix)
Chris@49 2027 template<typename eT>
Chris@49 2028 inline
Chris@49 2029 const subview<eT>
Chris@49 2030 subview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const
Chris@49 2031 {
Chris@49 2032 arma_extra_debug_sigprint();
Chris@49 2033
Chris@49 2034 arma_debug_check
Chris@49 2035 (
Chris@49 2036 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
Chris@49 2037 "subview::submat(): indices out of bounds or incorrectly used"
Chris@49 2038 );
Chris@49 2039
Chris@49 2040 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2041 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2042
Chris@49 2043 const uword base_row1 = aux_row1 + in_row1;
Chris@49 2044 const uword base_col1 = aux_col1 + in_col1;
Chris@49 2045
Chris@49 2046 return subview<eT>(m, base_row1, base_col1, subview_n_rows, subview_n_cols);
Chris@49 2047 }
Chris@49 2048
Chris@49 2049
Chris@49 2050
Chris@49 2051 //! creation of subview (submatrix)
Chris@49 2052 template<typename eT>
Chris@49 2053 inline
Chris@49 2054 subview<eT>
Chris@49 2055 subview<eT>::submat(const span& row_span, const span& col_span)
Chris@49 2056 {
Chris@49 2057 arma_extra_debug_sigprint();
Chris@49 2058
Chris@49 2059 const bool row_all = row_span.whole;
Chris@49 2060 const bool col_all = col_span.whole;
Chris@49 2061
Chris@49 2062 const uword local_n_rows = n_rows;
Chris@49 2063 const uword local_n_cols = n_cols;
Chris@49 2064
Chris@49 2065 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 2066 const uword in_row2 = row_span.b;
Chris@49 2067 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 2068
Chris@49 2069 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 2070 const uword in_col2 = col_span.b;
Chris@49 2071 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 2072
Chris@49 2073 arma_debug_check
Chris@49 2074 (
Chris@49 2075 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 2076 ||
Chris@49 2077 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 2078 ,
Chris@49 2079 "subview::submat(): indices out of bounds or incorrectly used"
Chris@49 2080 );
Chris@49 2081
Chris@49 2082 const uword base_row1 = aux_row1 + in_row1;
Chris@49 2083 const uword base_col1 = aux_col1 + in_col1;
Chris@49 2084
Chris@49 2085 return subview<eT>(m, base_row1, base_col1, submat_n_rows, submat_n_cols);
Chris@49 2086 }
Chris@49 2087
Chris@49 2088
Chris@49 2089
Chris@49 2090 //! creation of subview (generic submatrix)
Chris@49 2091 template<typename eT>
Chris@49 2092 inline
Chris@49 2093 const subview<eT>
Chris@49 2094 subview<eT>::submat(const span& row_span, const span& col_span) const
Chris@49 2095 {
Chris@49 2096 arma_extra_debug_sigprint();
Chris@49 2097
Chris@49 2098 const bool row_all = row_span.whole;
Chris@49 2099 const bool col_all = col_span.whole;
Chris@49 2100
Chris@49 2101 const uword local_n_rows = n_rows;
Chris@49 2102 const uword local_n_cols = n_cols;
Chris@49 2103
Chris@49 2104 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 2105 const uword in_row2 = row_span.b;
Chris@49 2106 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 2107
Chris@49 2108 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 2109 const uword in_col2 = col_span.b;
Chris@49 2110 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 2111
Chris@49 2112 arma_debug_check
Chris@49 2113 (
Chris@49 2114 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 2115 ||
Chris@49 2116 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 2117 ,
Chris@49 2118 "subview::submat(): indices out of bounds or incorrectly used"
Chris@49 2119 );
Chris@49 2120
Chris@49 2121 const uword base_row1 = aux_row1 + in_row1;
Chris@49 2122 const uword base_col1 = aux_col1 + in_col1;
Chris@49 2123
Chris@49 2124 return subview<eT>(m, base_row1, base_col1, submat_n_rows, submat_n_cols);
Chris@49 2125 }
Chris@49 2126
Chris@49 2127
Chris@49 2128
Chris@49 2129 template<typename eT>
Chris@49 2130 inline
Chris@49 2131 subview<eT>
Chris@49 2132 subview<eT>::operator()(const span& row_span, const span& col_span)
Chris@49 2133 {
Chris@49 2134 arma_extra_debug_sigprint();
Chris@49 2135
Chris@49 2136 return (*this).submat(row_span, col_span);
Chris@49 2137 }
Chris@49 2138
Chris@49 2139
Chris@49 2140
Chris@49 2141 template<typename eT>
Chris@49 2142 inline
Chris@49 2143 const subview<eT>
Chris@49 2144 subview<eT>::operator()(const span& row_span, const span& col_span) const
Chris@49 2145 {
Chris@49 2146 arma_extra_debug_sigprint();
Chris@49 2147
Chris@49 2148 return (*this).submat(row_span, col_span);
Chris@49 2149 }
Chris@49 2150
Chris@49 2151
Chris@49 2152
Chris@49 2153 template<typename eT>
Chris@49 2154 inline
Chris@49 2155 subview_each1< subview<eT>, 0 >
Chris@49 2156 subview<eT>::each_col()
Chris@49 2157 {
Chris@49 2158 arma_extra_debug_sigprint();
Chris@49 2159
Chris@49 2160 return subview_each1< subview<eT>, 0 >(*this);
Chris@49 2161 }
Chris@49 2162
Chris@49 2163
Chris@49 2164
Chris@49 2165 template<typename eT>
Chris@49 2166 inline
Chris@49 2167 subview_each1< subview<eT>, 1 >
Chris@49 2168 subview<eT>::each_row()
Chris@49 2169 {
Chris@49 2170 arma_extra_debug_sigprint();
Chris@49 2171
Chris@49 2172 return subview_each1< subview<eT>, 1 >(*this);
Chris@49 2173 }
Chris@49 2174
Chris@49 2175
Chris@49 2176
Chris@49 2177 template<typename eT>
Chris@49 2178 template<typename T1>
Chris@49 2179 inline
Chris@49 2180 subview_each2< subview<eT>, 0, T1 >
Chris@49 2181 subview<eT>::each_col(const Base<uword,T1>& indices)
Chris@49 2182 {
Chris@49 2183 arma_extra_debug_sigprint();
Chris@49 2184
Chris@49 2185 return subview_each2< subview<eT>, 0, T1 >(*this, indices);
Chris@49 2186 }
Chris@49 2187
Chris@49 2188
Chris@49 2189
Chris@49 2190 template<typename eT>
Chris@49 2191 template<typename T1>
Chris@49 2192 inline
Chris@49 2193 subview_each2< subview<eT>, 1, T1 >
Chris@49 2194 subview<eT>::each_row(const Base<uword,T1>& indices)
Chris@49 2195 {
Chris@49 2196 arma_extra_debug_sigprint();
Chris@49 2197
Chris@49 2198 return subview_each2< subview<eT>, 1, T1 >(*this, indices);
Chris@49 2199 }
Chris@49 2200
Chris@49 2201
Chris@49 2202
Chris@49 2203 //! creation of diagview (diagonal)
Chris@49 2204 template<typename eT>
Chris@49 2205 inline
Chris@49 2206 diagview<eT>
Chris@49 2207 subview<eT>::diag(const sword in_id)
Chris@49 2208 {
Chris@49 2209 arma_extra_debug_sigprint();
Chris@49 2210
Chris@49 2211 const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;
Chris@49 2212 const uword col_offset = (in_id > 0) ? uword( in_id) : 0;
Chris@49 2213
Chris@49 2214 arma_debug_check
Chris@49 2215 (
Chris@49 2216 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
Chris@49 2217 "subview::diag(): requested diagonal out of bounds"
Chris@49 2218 );
Chris@49 2219
Chris@49 2220 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
Chris@49 2221
Chris@49 2222 const uword base_row_offset = aux_row1 + row_offset;
Chris@49 2223 const uword base_col_offset = aux_col1 + col_offset;
Chris@49 2224
Chris@49 2225 return diagview<eT>(m, base_row_offset, base_col_offset, len);
Chris@49 2226 }
Chris@49 2227
Chris@49 2228
Chris@49 2229
Chris@49 2230 //! creation of diagview (diagonal)
Chris@49 2231 template<typename eT>
Chris@49 2232 inline
Chris@49 2233 const diagview<eT>
Chris@49 2234 subview<eT>::diag(const sword in_id) const
Chris@49 2235 {
Chris@49 2236 arma_extra_debug_sigprint();
Chris@49 2237
Chris@49 2238 const uword row_offset = (in_id < 0) ? -in_id : 0;
Chris@49 2239 const uword col_offset = (in_id > 0) ? in_id : 0;
Chris@49 2240
Chris@49 2241 arma_debug_check
Chris@49 2242 (
Chris@49 2243 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
Chris@49 2244 "subview::diag(): requested diagonal out of bounds"
Chris@49 2245 );
Chris@49 2246
Chris@49 2247 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
Chris@49 2248
Chris@49 2249 const uword base_row_offset = aux_row1 + row_offset;
Chris@49 2250 const uword base_col_offset = aux_col1 + col_offset;
Chris@49 2251
Chris@49 2252 return diagview<eT>(m, base_row_offset, base_col_offset, len);
Chris@49 2253 }
Chris@49 2254
Chris@49 2255
Chris@49 2256
Chris@49 2257 template<typename eT>
Chris@49 2258 inline
Chris@49 2259 void
Chris@49 2260 subview<eT>::swap_rows(const uword in_row1, const uword in_row2)
Chris@49 2261 {
Chris@49 2262 arma_extra_debug_sigprint();
Chris@49 2263
Chris@49 2264 arma_debug_check
Chris@49 2265 (
Chris@49 2266 (in_row1 >= n_rows) || (in_row2 >= n_rows),
Chris@49 2267 "subview::swap_rows(): out of bounds"
Chris@49 2268 );
Chris@49 2269
Chris@49 2270 eT* mem = (const_cast< Mat<eT>& >(m)).memptr();
Chris@49 2271
Chris@49 2272 if(n_elem > 0)
Chris@49 2273 {
Chris@49 2274 const uword m_n_rows = m.n_rows;
Chris@49 2275
Chris@49 2276 for(uword ucol=0; ucol < n_cols; ++ucol)
Chris@49 2277 {
Chris@49 2278 const uword offset = (aux_col1 + ucol) * m_n_rows;
Chris@49 2279 const uword pos1 = aux_row1 + in_row1 + offset;
Chris@49 2280 const uword pos2 = aux_row1 + in_row2 + offset;
Chris@49 2281
Chris@49 2282 std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) );
Chris@49 2283 }
Chris@49 2284 }
Chris@49 2285 }
Chris@49 2286
Chris@49 2287
Chris@49 2288
Chris@49 2289 template<typename eT>
Chris@49 2290 inline
Chris@49 2291 void
Chris@49 2292 subview<eT>::swap_cols(const uword in_col1, const uword in_col2)
Chris@49 2293 {
Chris@49 2294 arma_extra_debug_sigprint();
Chris@49 2295
Chris@49 2296 arma_debug_check
Chris@49 2297 (
Chris@49 2298 (in_col1 >= n_cols) || (in_col2 >= n_cols),
Chris@49 2299 "subview::swap_cols(): out of bounds"
Chris@49 2300 );
Chris@49 2301
Chris@49 2302 if(n_elem > 0)
Chris@49 2303 {
Chris@49 2304 eT* ptr1 = colptr(in_col1);
Chris@49 2305 eT* ptr2 = colptr(in_col2);
Chris@49 2306
Chris@49 2307 for(uword urow=0; urow < n_rows; ++urow)
Chris@49 2308 {
Chris@49 2309 std::swap( ptr1[urow], ptr2[urow] );
Chris@49 2310 }
Chris@49 2311 }
Chris@49 2312 }
Chris@49 2313
Chris@49 2314
Chris@49 2315
Chris@49 2316 // template<typename eT>
Chris@49 2317 // inline
Chris@49 2318 // subview<eT>::iter::iter(const subview<eT>& S)
Chris@49 2319 // : mem (S.m.mem)
Chris@49 2320 // , n_rows (S.m.n_rows)
Chris@49 2321 // , row_start (S.aux_row1)
Chris@49 2322 // , row_end_p1(row_start + S.n_rows)
Chris@49 2323 // , row (row_start)
Chris@49 2324 // , col (S.aux_col1)
Chris@49 2325 // , i (row + col*n_rows)
Chris@49 2326 // {
Chris@49 2327 // arma_extra_debug_sigprint();
Chris@49 2328 // }
Chris@49 2329 //
Chris@49 2330 //
Chris@49 2331 //
Chris@49 2332 // template<typename eT>
Chris@49 2333 // arma_inline
Chris@49 2334 // eT
Chris@49 2335 // subview<eT>::iter::operator*() const
Chris@49 2336 // {
Chris@49 2337 // return mem[i];
Chris@49 2338 // }
Chris@49 2339 //
Chris@49 2340 //
Chris@49 2341 //
Chris@49 2342 // template<typename eT>
Chris@49 2343 // inline
Chris@49 2344 // void
Chris@49 2345 // subview<eT>::iter::operator++()
Chris@49 2346 // {
Chris@49 2347 // ++row;
Chris@49 2348 //
Chris@49 2349 // if(row < row_end_p1)
Chris@49 2350 // {
Chris@49 2351 // ++i;
Chris@49 2352 // }
Chris@49 2353 // else
Chris@49 2354 // {
Chris@49 2355 // row = row_start;
Chris@49 2356 // ++col;
Chris@49 2357 //
Chris@49 2358 // i = row + col*n_rows;
Chris@49 2359 // }
Chris@49 2360 // }
Chris@49 2361 //
Chris@49 2362 //
Chris@49 2363 //
Chris@49 2364 // template<typename eT>
Chris@49 2365 // inline
Chris@49 2366 // void
Chris@49 2367 // subview<eT>::iter::operator++(int)
Chris@49 2368 // {
Chris@49 2369 // operator++();
Chris@49 2370 // }
Chris@49 2371
Chris@49 2372
Chris@49 2373
Chris@49 2374 //
Chris@49 2375 //
Chris@49 2376 //
Chris@49 2377
Chris@49 2378
Chris@49 2379
Chris@49 2380 template<typename eT>
Chris@49 2381 inline
Chris@49 2382 subview_col<eT>::subview_col(const Mat<eT>& in_m, const uword in_col)
Chris@49 2383 : subview<eT>(in_m, 0, in_col, in_m.n_rows, 1)
Chris@49 2384 , colmem(subview<eT>::colptr(0))
Chris@49 2385 {
Chris@49 2386 arma_extra_debug_sigprint();
Chris@49 2387 }
Chris@49 2388
Chris@49 2389
Chris@49 2390
Chris@49 2391 template<typename eT>
Chris@49 2392 inline
Chris@49 2393 subview_col<eT>::subview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows)
Chris@49 2394 : subview<eT>(in_m, in_row1, in_col, in_n_rows, 1)
Chris@49 2395 , colmem(subview<eT>::colptr(0))
Chris@49 2396 {
Chris@49 2397 arma_extra_debug_sigprint();
Chris@49 2398 }
Chris@49 2399
Chris@49 2400
Chris@49 2401
Chris@49 2402 template<typename eT>
Chris@49 2403 inline
Chris@49 2404 void
Chris@49 2405 subview_col<eT>::operator=(const subview<eT>& X)
Chris@49 2406 {
Chris@49 2407 arma_extra_debug_sigprint();
Chris@49 2408
Chris@49 2409 subview<eT>::operator=(X);
Chris@49 2410
Chris@49 2411 access::rw(colmem) = subview<eT>::colptr(0);
Chris@49 2412
Chris@49 2413 arma_debug_check( (subview<eT>::n_cols > 1), "subview_col(): incompatible dimensions" );
Chris@49 2414 }
Chris@49 2415
Chris@49 2416
Chris@49 2417
Chris@49 2418 template<typename eT>
Chris@49 2419 inline
Chris@49 2420 void
Chris@49 2421 subview_col<eT>::operator=(const subview_col<eT>& X)
Chris@49 2422 {
Chris@49 2423 arma_extra_debug_sigprint();
Chris@49 2424
Chris@49 2425 subview<eT>::operator=(X); // interprets 'subview_col' as 'subview'
Chris@49 2426
Chris@49 2427 access::rw(colmem) = subview<eT>::colptr(0);
Chris@49 2428
Chris@49 2429 arma_debug_check( (subview<eT>::n_cols > 1), "subview_col(): incompatible dimensions" );
Chris@49 2430 }
Chris@49 2431
Chris@49 2432
Chris@49 2433
Chris@49 2434 template<typename eT>
Chris@49 2435 template<typename T1>
Chris@49 2436 inline
Chris@49 2437 void
Chris@49 2438 subview_col<eT>::operator=(const Base<eT,T1>& X)
Chris@49 2439 {
Chris@49 2440 arma_extra_debug_sigprint();
Chris@49 2441
Chris@49 2442 subview<eT>::operator=(X);
Chris@49 2443
Chris@49 2444 access::rw(colmem) = subview<eT>::colptr(0);
Chris@49 2445
Chris@49 2446 arma_debug_check( (subview<eT>::n_cols > 1), "subview_col(): incompatible dimensions" );
Chris@49 2447 }
Chris@49 2448
Chris@49 2449
Chris@49 2450
Chris@49 2451 template<typename eT>
Chris@49 2452 arma_inline
Chris@49 2453 const Op<subview_col<eT>,op_htrans>
Chris@49 2454 subview_col<eT>::t() const
Chris@49 2455 {
Chris@49 2456 return Op<subview_col<eT>,op_htrans>(*this);
Chris@49 2457 }
Chris@49 2458
Chris@49 2459
Chris@49 2460
Chris@49 2461 template<typename eT>
Chris@49 2462 arma_inline
Chris@49 2463 const Op<subview_col<eT>,op_htrans>
Chris@49 2464 subview_col<eT>::ht() const
Chris@49 2465 {
Chris@49 2466 return Op<subview_col<eT>,op_htrans>(*this);
Chris@49 2467 }
Chris@49 2468
Chris@49 2469
Chris@49 2470
Chris@49 2471 template<typename eT>
Chris@49 2472 arma_inline
Chris@49 2473 const Op<subview_col<eT>,op_strans>
Chris@49 2474 subview_col<eT>::st() const
Chris@49 2475 {
Chris@49 2476 return Op<subview_col<eT>,op_strans>(*this);
Chris@49 2477 }
Chris@49 2478
Chris@49 2479
Chris@49 2480
Chris@49 2481 template<typename eT>
Chris@49 2482 arma_inline
Chris@49 2483 eT
Chris@49 2484 subview_col<eT>::at_alt(const uword ii) const
Chris@49 2485 {
Chris@49 2486 const eT* colmem_aligned = colmem;
Chris@49 2487 memory::mark_as_aligned(colmem_aligned);
Chris@49 2488
Chris@49 2489 return colmem_aligned[ii];
Chris@49 2490 }
Chris@49 2491
Chris@49 2492
Chris@49 2493
Chris@49 2494 template<typename eT>
Chris@49 2495 arma_inline
Chris@49 2496 eT&
Chris@49 2497 subview_col<eT>::operator[](const uword ii)
Chris@49 2498 {
Chris@49 2499 return access::rw( colmem[ii] );
Chris@49 2500 }
Chris@49 2501
Chris@49 2502
Chris@49 2503
Chris@49 2504 template<typename eT>
Chris@49 2505 arma_inline
Chris@49 2506 eT
Chris@49 2507 subview_col<eT>::operator[](const uword ii) const
Chris@49 2508 {
Chris@49 2509 return colmem[ii];
Chris@49 2510 }
Chris@49 2511
Chris@49 2512
Chris@49 2513
Chris@49 2514 template<typename eT>
Chris@49 2515 inline
Chris@49 2516 eT&
Chris@49 2517 subview_col<eT>::operator()(const uword ii)
Chris@49 2518 {
Chris@49 2519 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
Chris@49 2520
Chris@49 2521 return access::rw( colmem[ii] );
Chris@49 2522 }
Chris@49 2523
Chris@49 2524
Chris@49 2525
Chris@49 2526 template<typename eT>
Chris@49 2527 inline
Chris@49 2528 eT
Chris@49 2529 subview_col<eT>::operator()(const uword ii) const
Chris@49 2530 {
Chris@49 2531 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
Chris@49 2532
Chris@49 2533 return colmem[ii];
Chris@49 2534 }
Chris@49 2535
Chris@49 2536
Chris@49 2537
Chris@49 2538 template<typename eT>
Chris@49 2539 inline
Chris@49 2540 eT&
Chris@49 2541 subview_col<eT>::operator()(const uword in_row, const uword in_col)
Chris@49 2542 {
Chris@49 2543 arma_debug_check( ((in_row >= subview<eT>::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds");
Chris@49 2544
Chris@49 2545 return access::rw( colmem[in_row] );
Chris@49 2546 }
Chris@49 2547
Chris@49 2548
Chris@49 2549
Chris@49 2550 template<typename eT>
Chris@49 2551 inline
Chris@49 2552 eT
Chris@49 2553 subview_col<eT>::operator()(const uword in_row, const uword in_col) const
Chris@49 2554 {
Chris@49 2555 arma_debug_check( ((in_row >= subview<eT>::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds");
Chris@49 2556
Chris@49 2557 return colmem[in_row];
Chris@49 2558 }
Chris@49 2559
Chris@49 2560
Chris@49 2561
Chris@49 2562 template<typename eT>
Chris@49 2563 inline
Chris@49 2564 eT&
Chris@49 2565 subview_col<eT>::at(const uword in_row, const uword)
Chris@49 2566 {
Chris@49 2567 return access::rw( colmem[in_row] );
Chris@49 2568 }
Chris@49 2569
Chris@49 2570
Chris@49 2571
Chris@49 2572 template<typename eT>
Chris@49 2573 inline
Chris@49 2574 eT
Chris@49 2575 subview_col<eT>::at(const uword in_row, const uword) const
Chris@49 2576 {
Chris@49 2577 return colmem[in_row];
Chris@49 2578 }
Chris@49 2579
Chris@49 2580
Chris@49 2581
Chris@49 2582 template<typename eT>
Chris@49 2583 arma_inline
Chris@49 2584 eT*
Chris@49 2585 subview_col<eT>::colptr(const uword)
Chris@49 2586 {
Chris@49 2587 return const_cast<eT*>(colmem);
Chris@49 2588 }
Chris@49 2589
Chris@49 2590
Chris@49 2591 template<typename eT>
Chris@49 2592 arma_inline
Chris@49 2593 const eT*
Chris@49 2594 subview_col<eT>::colptr(const uword) const
Chris@49 2595 {
Chris@49 2596 return colmem;
Chris@49 2597 }
Chris@49 2598
Chris@49 2599
Chris@49 2600 template<typename eT>
Chris@49 2601 inline
Chris@49 2602 subview_col<eT>
Chris@49 2603 subview_col<eT>::rows(const uword in_row1, const uword in_row2)
Chris@49 2604 {
Chris@49 2605 arma_extra_debug_sigprint();
Chris@49 2606
Chris@49 2607 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used");
Chris@49 2608
Chris@49 2609 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2610
Chris@49 2611 const uword base_row1 = this->aux_row1 + in_row1;
Chris@49 2612
Chris@49 2613 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
Chris@49 2614 }
Chris@49 2615
Chris@49 2616
Chris@49 2617
Chris@49 2618 template<typename eT>
Chris@49 2619 inline
Chris@49 2620 const subview_col<eT>
Chris@49 2621 subview_col<eT>::rows(const uword in_row1, const uword in_row2) const
Chris@49 2622 {
Chris@49 2623 arma_extra_debug_sigprint();
Chris@49 2624
Chris@49 2625 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used");
Chris@49 2626
Chris@49 2627 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2628
Chris@49 2629 const uword base_row1 = this->aux_row1 + in_row1;
Chris@49 2630
Chris@49 2631 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
Chris@49 2632 }
Chris@49 2633
Chris@49 2634
Chris@49 2635
Chris@49 2636 template<typename eT>
Chris@49 2637 inline
Chris@49 2638 subview_col<eT>
Chris@49 2639 subview_col<eT>::subvec(const uword in_row1, const uword in_row2)
Chris@49 2640 {
Chris@49 2641 arma_extra_debug_sigprint();
Chris@49 2642
Chris@49 2643 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used");
Chris@49 2644
Chris@49 2645 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2646
Chris@49 2647 const uword base_row1 = this->aux_row1 + in_row1;
Chris@49 2648
Chris@49 2649 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
Chris@49 2650 }
Chris@49 2651
Chris@49 2652
Chris@49 2653
Chris@49 2654 template<typename eT>
Chris@49 2655 inline
Chris@49 2656 const subview_col<eT>
Chris@49 2657 subview_col<eT>::subvec(const uword in_row1, const uword in_row2) const
Chris@49 2658 {
Chris@49 2659 arma_extra_debug_sigprint();
Chris@49 2660
Chris@49 2661 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used");
Chris@49 2662
Chris@49 2663 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2664
Chris@49 2665 const uword base_row1 = this->aux_row1 + in_row1;
Chris@49 2666
Chris@49 2667 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
Chris@49 2668 }
Chris@49 2669
Chris@49 2670
Chris@49 2671
Chris@49 2672 //
Chris@49 2673 //
Chris@49 2674 //
Chris@49 2675
Chris@49 2676
Chris@49 2677
Chris@49 2678 template<typename eT>
Chris@49 2679 inline
Chris@49 2680 subview_row<eT>::subview_row(const Mat<eT>& in_m, const uword in_row)
Chris@49 2681 : subview<eT>(in_m, in_row, 0, 1, in_m.n_cols)
Chris@49 2682 {
Chris@49 2683 arma_extra_debug_sigprint();
Chris@49 2684 }
Chris@49 2685
Chris@49 2686
Chris@49 2687
Chris@49 2688 template<typename eT>
Chris@49 2689 inline
Chris@49 2690 subview_row<eT>::subview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols)
Chris@49 2691 : subview<eT>(in_m, in_row, in_col1, 1, in_n_cols)
Chris@49 2692 {
Chris@49 2693 arma_extra_debug_sigprint();
Chris@49 2694 }
Chris@49 2695
Chris@49 2696
Chris@49 2697
Chris@49 2698 template<typename eT>
Chris@49 2699 inline
Chris@49 2700 void
Chris@49 2701 subview_row<eT>::operator=(const subview<eT>& X)
Chris@49 2702 {
Chris@49 2703 arma_extra_debug_sigprint();
Chris@49 2704
Chris@49 2705 subview<eT>::operator=(X);
Chris@49 2706 arma_debug_check( (subview<eT>::n_rows > 1), "subview_row(): incompatible dimensions" );
Chris@49 2707 }
Chris@49 2708
Chris@49 2709
Chris@49 2710
Chris@49 2711 template<typename eT>
Chris@49 2712 inline
Chris@49 2713 void
Chris@49 2714 subview_row<eT>::operator=(const subview_row<eT>& X)
Chris@49 2715 {
Chris@49 2716 arma_extra_debug_sigprint();
Chris@49 2717
Chris@49 2718 subview<eT>::operator=(X); // interprets 'subview_row' as 'subview'
Chris@49 2719 arma_debug_check( (subview<eT>::n_rows > 1), "subview_row(): incompatible dimensions" );
Chris@49 2720 }
Chris@49 2721
Chris@49 2722
Chris@49 2723
Chris@49 2724 template<typename eT>
Chris@49 2725 template<typename T1>
Chris@49 2726 inline
Chris@49 2727 void
Chris@49 2728 subview_row<eT>::operator=(const Base<eT,T1>& X)
Chris@49 2729 {
Chris@49 2730 arma_extra_debug_sigprint();
Chris@49 2731
Chris@49 2732 subview<eT>::operator=(X);
Chris@49 2733 arma_debug_check( (subview<eT>::n_rows > 1), "subview_row(): incompatible dimensions" );
Chris@49 2734 }
Chris@49 2735
Chris@49 2736
Chris@49 2737
Chris@49 2738 template<typename eT>
Chris@49 2739 arma_inline
Chris@49 2740 const Op<subview_row<eT>,op_htrans>
Chris@49 2741 subview_row<eT>::t() const
Chris@49 2742 {
Chris@49 2743 return Op<subview_row<eT>,op_htrans>(*this);
Chris@49 2744 }
Chris@49 2745
Chris@49 2746
Chris@49 2747
Chris@49 2748 template<typename eT>
Chris@49 2749 arma_inline
Chris@49 2750 const Op<subview_row<eT>,op_htrans>
Chris@49 2751 subview_row<eT>::ht() const
Chris@49 2752 {
Chris@49 2753 return Op<subview_row<eT>,op_htrans>(*this);
Chris@49 2754 }
Chris@49 2755
Chris@49 2756
Chris@49 2757
Chris@49 2758 template<typename eT>
Chris@49 2759 arma_inline
Chris@49 2760 const Op<subview_row<eT>,op_strans>
Chris@49 2761 subview_row<eT>::st() const
Chris@49 2762 {
Chris@49 2763 return Op<subview_row<eT>,op_strans>(*this);
Chris@49 2764 }
Chris@49 2765
Chris@49 2766
Chris@49 2767
Chris@49 2768 template<typename eT>
Chris@49 2769 inline
Chris@49 2770 eT
Chris@49 2771 subview_row<eT>::at_alt(const uword ii) const
Chris@49 2772 {
Chris@49 2773 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2774
Chris@49 2775 return subview<eT>::m.mem[index];
Chris@49 2776 }
Chris@49 2777
Chris@49 2778
Chris@49 2779
Chris@49 2780 template<typename eT>
Chris@49 2781 inline
Chris@49 2782 eT&
Chris@49 2783 subview_row<eT>::operator[](const uword ii)
Chris@49 2784 {
Chris@49 2785 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2786
Chris@49 2787 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
Chris@49 2788 }
Chris@49 2789
Chris@49 2790
Chris@49 2791
Chris@49 2792 template<typename eT>
Chris@49 2793 inline
Chris@49 2794 eT
Chris@49 2795 subview_row<eT>::operator[](const uword ii) const
Chris@49 2796 {
Chris@49 2797 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2798
Chris@49 2799 return subview<eT>::m.mem[index];
Chris@49 2800 }
Chris@49 2801
Chris@49 2802
Chris@49 2803
Chris@49 2804 template<typename eT>
Chris@49 2805 inline
Chris@49 2806 eT&
Chris@49 2807 subview_row<eT>::operator()(const uword ii)
Chris@49 2808 {
Chris@49 2809 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
Chris@49 2810
Chris@49 2811 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2812
Chris@49 2813 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
Chris@49 2814 }
Chris@49 2815
Chris@49 2816
Chris@49 2817
Chris@49 2818 template<typename eT>
Chris@49 2819 inline
Chris@49 2820 eT
Chris@49 2821 subview_row<eT>::operator()(const uword ii) const
Chris@49 2822 {
Chris@49 2823 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
Chris@49 2824
Chris@49 2825 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2826
Chris@49 2827 return subview<eT>::m.mem[index];
Chris@49 2828 }
Chris@49 2829
Chris@49 2830
Chris@49 2831
Chris@49 2832 template<typename eT>
Chris@49 2833 inline
Chris@49 2834 eT&
Chris@49 2835 subview_row<eT>::operator()(const uword in_row, const uword in_col)
Chris@49 2836 {
Chris@49 2837 arma_debug_check( ((in_row > 0) || (in_col >= subview<eT>::n_cols)), "subview::operator(): index out of bounds");
Chris@49 2838
Chris@49 2839 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2840
Chris@49 2841 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
Chris@49 2842 }
Chris@49 2843
Chris@49 2844
Chris@49 2845
Chris@49 2846 template<typename eT>
Chris@49 2847 inline
Chris@49 2848 eT
Chris@49 2849 subview_row<eT>::operator()(const uword in_row, const uword in_col) const
Chris@49 2850 {
Chris@49 2851 arma_debug_check( ((in_row > 0) || (in_col >= subview<eT>::n_cols)), "subview::operator(): index out of bounds");
Chris@49 2852
Chris@49 2853 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2854
Chris@49 2855 return subview<eT>::m.mem[index];
Chris@49 2856 }
Chris@49 2857
Chris@49 2858
Chris@49 2859
Chris@49 2860 template<typename eT>
Chris@49 2861 inline
Chris@49 2862 eT&
Chris@49 2863 subview_row<eT>::at(const uword, const uword in_col)
Chris@49 2864 {
Chris@49 2865 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2866
Chris@49 2867 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
Chris@49 2868 }
Chris@49 2869
Chris@49 2870
Chris@49 2871
Chris@49 2872 template<typename eT>
Chris@49 2873 inline
Chris@49 2874 eT
Chris@49 2875 subview_row<eT>::at(const uword, const uword in_col) const
Chris@49 2876 {
Chris@49 2877 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
Chris@49 2878
Chris@49 2879 return subview<eT>::m.mem[index];
Chris@49 2880 }
Chris@49 2881
Chris@49 2882
Chris@49 2883
Chris@49 2884 template<typename eT>
Chris@49 2885 inline
Chris@49 2886 subview_row<eT>
Chris@49 2887 subview_row<eT>::cols(const uword in_col1, const uword in_col2)
Chris@49 2888 {
Chris@49 2889 arma_extra_debug_sigprint();
Chris@49 2890
Chris@49 2891 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used" );
Chris@49 2892
Chris@49 2893 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2894
Chris@49 2895 const uword base_col1 = this->aux_col1 + in_col1;
Chris@49 2896
Chris@49 2897 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
Chris@49 2898 }
Chris@49 2899
Chris@49 2900
Chris@49 2901
Chris@49 2902 template<typename eT>
Chris@49 2903 inline
Chris@49 2904 const subview_row<eT>
Chris@49 2905 subview_row<eT>::cols(const uword in_col1, const uword in_col2) const
Chris@49 2906 {
Chris@49 2907 arma_extra_debug_sigprint();
Chris@49 2908
Chris@49 2909 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used");
Chris@49 2910
Chris@49 2911 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2912
Chris@49 2913 const uword base_col1 = this->aux_col1 + in_col1;
Chris@49 2914
Chris@49 2915 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
Chris@49 2916 }
Chris@49 2917
Chris@49 2918
Chris@49 2919
Chris@49 2920 template<typename eT>
Chris@49 2921 inline
Chris@49 2922 subview_row<eT>
Chris@49 2923 subview_row<eT>::subvec(const uword in_col1, const uword in_col2)
Chris@49 2924 {
Chris@49 2925 arma_extra_debug_sigprint();
Chris@49 2926
Chris@49 2927 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used");
Chris@49 2928
Chris@49 2929 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2930
Chris@49 2931 const uword base_col1 = this->aux_col1 + in_col1;
Chris@49 2932
Chris@49 2933 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
Chris@49 2934 }
Chris@49 2935
Chris@49 2936
Chris@49 2937
Chris@49 2938 template<typename eT>
Chris@49 2939 inline
Chris@49 2940 const subview_row<eT>
Chris@49 2941 subview_row<eT>::subvec(const uword in_col1, const uword in_col2) const
Chris@49 2942 {
Chris@49 2943 arma_extra_debug_sigprint();
Chris@49 2944
Chris@49 2945 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used");
Chris@49 2946
Chris@49 2947 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2948
Chris@49 2949 const uword base_col1 = this->aux_col1 + in_col1;
Chris@49 2950
Chris@49 2951 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
Chris@49 2952 }
Chris@49 2953
Chris@49 2954
Chris@49 2955
Chris@49 2956 //
Chris@49 2957 //
Chris@49 2958 //
Chris@49 2959
Chris@49 2960
Chris@49 2961
Chris@49 2962 template<typename eT>
Chris@49 2963 inline
Chris@49 2964 subview_row_strans<eT>::subview_row_strans(const subview_row<eT>& in_sv_row)
Chris@49 2965 : sv_row(in_sv_row )
Chris@49 2966 , n_rows(in_sv_row.n_cols)
Chris@49 2967 , n_elem(in_sv_row.n_elem)
Chris@49 2968 {
Chris@49 2969 arma_extra_debug_sigprint();
Chris@49 2970 }
Chris@49 2971
Chris@49 2972
Chris@49 2973
Chris@49 2974 template<typename eT>
Chris@49 2975 inline
Chris@49 2976 void
Chris@49 2977 subview_row_strans<eT>::extract(Mat<eT>& out) const
Chris@49 2978 {
Chris@49 2979 arma_extra_debug_sigprint();
Chris@49 2980
Chris@49 2981 // NOTE: this function assumes that matrix 'out' has already been set to the correct size
Chris@49 2982
Chris@49 2983 const Mat<eT>& X = sv_row.m;
Chris@49 2984
Chris@49 2985 eT* out_mem = out.memptr();
Chris@49 2986
Chris@49 2987 const uword row = sv_row.aux_row1;
Chris@49 2988 const uword start_col = sv_row.aux_col1;
Chris@49 2989 const uword sv_row_n_cols = sv_row.n_cols;
Chris@49 2990
Chris@49 2991 uword ii,jj;
Chris@49 2992
Chris@49 2993 for(ii=0, jj=1; jj < sv_row_n_cols; ii+=2, jj+=2)
Chris@49 2994 {
Chris@49 2995 const eT tmp1 = X.at(row, start_col+ii);
Chris@49 2996 const eT tmp2 = X.at(row, start_col+jj);
Chris@49 2997
Chris@49 2998 out_mem[ii] = tmp1;
Chris@49 2999 out_mem[jj] = tmp2;
Chris@49 3000 }
Chris@49 3001
Chris@49 3002 if(ii < sv_row_n_cols)
Chris@49 3003 {
Chris@49 3004 out_mem[ii] = X.at(row, start_col+ii);
Chris@49 3005 }
Chris@49 3006 }
Chris@49 3007
Chris@49 3008
Chris@49 3009
Chris@49 3010 template<typename eT>
Chris@49 3011 inline
Chris@49 3012 eT
Chris@49 3013 subview_row_strans<eT>::at_alt(const uword ii) const
Chris@49 3014 {
Chris@49 3015 return sv_row[ii];
Chris@49 3016 }
Chris@49 3017
Chris@49 3018
Chris@49 3019
Chris@49 3020 template<typename eT>
Chris@49 3021 inline
Chris@49 3022 eT
Chris@49 3023 subview_row_strans<eT>::operator[](const uword ii) const
Chris@49 3024 {
Chris@49 3025 return sv_row[ii];
Chris@49 3026 }
Chris@49 3027
Chris@49 3028
Chris@49 3029
Chris@49 3030 template<typename eT>
Chris@49 3031 inline
Chris@49 3032 eT
Chris@49 3033 subview_row_strans<eT>::operator()(const uword ii) const
Chris@49 3034 {
Chris@49 3035 return sv_row(ii);
Chris@49 3036 }
Chris@49 3037
Chris@49 3038
Chris@49 3039
Chris@49 3040 template<typename eT>
Chris@49 3041 inline
Chris@49 3042 eT
Chris@49 3043 subview_row_strans<eT>::operator()(const uword in_row, const uword in_col) const
Chris@49 3044 {
Chris@49 3045 return sv_row(in_col, in_row); // deliberately swapped
Chris@49 3046 }
Chris@49 3047
Chris@49 3048
Chris@49 3049
Chris@49 3050 template<typename eT>
Chris@49 3051 inline
Chris@49 3052 eT
Chris@49 3053 subview_row_strans<eT>::at(const uword in_row, const uword) const
Chris@49 3054 {
Chris@49 3055 return sv_row.at(0, in_row); // deliberately swapped
Chris@49 3056 }
Chris@49 3057
Chris@49 3058
Chris@49 3059
Chris@49 3060 //
Chris@49 3061 //
Chris@49 3062 //
Chris@49 3063
Chris@49 3064
Chris@49 3065
Chris@49 3066 template<typename eT>
Chris@49 3067 inline
Chris@49 3068 subview_row_htrans<eT>::subview_row_htrans(const subview_row<eT>& in_sv_row)
Chris@49 3069 : sv_row(in_sv_row )
Chris@49 3070 , n_rows(in_sv_row.n_cols)
Chris@49 3071 , n_elem(in_sv_row.n_elem)
Chris@49 3072 {
Chris@49 3073 arma_extra_debug_sigprint();
Chris@49 3074 }
Chris@49 3075
Chris@49 3076
Chris@49 3077
Chris@49 3078 template<typename eT>
Chris@49 3079 inline
Chris@49 3080 void
Chris@49 3081 subview_row_htrans<eT>::extract(Mat<eT>& out) const
Chris@49 3082 {
Chris@49 3083 arma_extra_debug_sigprint();
Chris@49 3084
Chris@49 3085 // NOTE: this function assumes that matrix 'out' has already been set to the correct size
Chris@49 3086
Chris@49 3087 const Mat<eT>& X = sv_row.m;
Chris@49 3088
Chris@49 3089 eT* out_mem = out.memptr();
Chris@49 3090
Chris@49 3091 const uword row = sv_row.aux_row1;
Chris@49 3092 const uword start_col = sv_row.aux_col1;
Chris@49 3093 const uword sv_row_n_cols = sv_row.n_cols;
Chris@49 3094
Chris@49 3095 for(uword ii=0; ii < sv_row_n_cols; ++ii)
Chris@49 3096 {
Chris@49 3097 out_mem[ii] = access::alt_conj( X.at(row, start_col+ii) );
Chris@49 3098 }
Chris@49 3099 }
Chris@49 3100
Chris@49 3101
Chris@49 3102
Chris@49 3103 template<typename eT>
Chris@49 3104 inline
Chris@49 3105 eT
Chris@49 3106 subview_row_htrans<eT>::at_alt(const uword ii) const
Chris@49 3107 {
Chris@49 3108 return access::alt_conj( sv_row[ii] );
Chris@49 3109 }
Chris@49 3110
Chris@49 3111
Chris@49 3112
Chris@49 3113 template<typename eT>
Chris@49 3114 inline
Chris@49 3115 eT
Chris@49 3116 subview_row_htrans<eT>::operator[](const uword ii) const
Chris@49 3117 {
Chris@49 3118 return access::alt_conj( sv_row[ii] );
Chris@49 3119 }
Chris@49 3120
Chris@49 3121
Chris@49 3122
Chris@49 3123 template<typename eT>
Chris@49 3124 inline
Chris@49 3125 eT
Chris@49 3126 subview_row_htrans<eT>::operator()(const uword ii) const
Chris@49 3127 {
Chris@49 3128 return access::alt_conj( sv_row(ii) );
Chris@49 3129 }
Chris@49 3130
Chris@49 3131
Chris@49 3132
Chris@49 3133 template<typename eT>
Chris@49 3134 inline
Chris@49 3135 eT
Chris@49 3136 subview_row_htrans<eT>::operator()(const uword in_row, const uword in_col) const
Chris@49 3137 {
Chris@49 3138 return access::alt_conj( sv_row(in_col, in_row) ); // deliberately swapped
Chris@49 3139 }
Chris@49 3140
Chris@49 3141
Chris@49 3142
Chris@49 3143 template<typename eT>
Chris@49 3144 inline
Chris@49 3145 eT
Chris@49 3146 subview_row_htrans<eT>::at(const uword in_row, const uword) const
Chris@49 3147 {
Chris@49 3148 return access::alt_conj( sv_row.at(0, in_row) ); // deliberately swapped
Chris@49 3149 }
Chris@49 3150
Chris@49 3151
Chris@49 3152
Chris@49 3153 //! @}