annotate armadillo-3.900.4/include/armadillo_bits/Mat_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) 2012 Ryan Curtin
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 Mat
Chris@49 11 //! @{
Chris@49 12
Chris@49 13
Chris@49 14 template<typename eT>
Chris@49 15 inline
Chris@49 16 Mat<eT>::~Mat()
Chris@49 17 {
Chris@49 18 arma_extra_debug_sigprint_this(this);
Chris@49 19
Chris@49 20 if(mem_state == 0)
Chris@49 21 {
Chris@49 22 if(n_elem > arma_config::mat_prealloc)
Chris@49 23 {
Chris@49 24 memory::release( access::rw(mem) );
Chris@49 25 }
Chris@49 26 }
Chris@49 27
Chris@49 28 if(arma_config::debug == true)
Chris@49 29 {
Chris@49 30 // try to expose buggy user code that accesses deleted objects
Chris@49 31 access::rw(mem) = 0;
Chris@49 32 }
Chris@49 33
Chris@49 34 arma_type_check(( is_supported_elem_type<eT>::value == false ));
Chris@49 35 }
Chris@49 36
Chris@49 37
Chris@49 38
Chris@49 39 template<typename eT>
Chris@49 40 inline
Chris@49 41 Mat<eT>::Mat()
Chris@49 42 : n_rows(0)
Chris@49 43 , n_cols(0)
Chris@49 44 , n_elem(0)
Chris@49 45 , vec_state(0)
Chris@49 46 , mem_state(0)
Chris@49 47 , mem()
Chris@49 48 {
Chris@49 49 arma_extra_debug_sigprint_this(this);
Chris@49 50 }
Chris@49 51
Chris@49 52
Chris@49 53
Chris@49 54 //! construct the matrix to have user specified dimensions
Chris@49 55 template<typename eT>
Chris@49 56 inline
Chris@49 57 Mat<eT>::Mat(const uword in_n_rows, const uword in_n_cols)
Chris@49 58 : n_rows(in_n_rows)
Chris@49 59 , n_cols(in_n_cols)
Chris@49 60 , n_elem(in_n_rows*in_n_cols)
Chris@49 61 , vec_state(0)
Chris@49 62 , mem_state(0)
Chris@49 63 , mem()
Chris@49 64 {
Chris@49 65 arma_extra_debug_sigprint_this(this);
Chris@49 66
Chris@49 67 init_cold();
Chris@49 68 }
Chris@49 69
Chris@49 70
Chris@49 71
Chris@49 72 //! constructor used by Row and Col classes
Chris@49 73 template<typename eT>
Chris@49 74 inline
Chris@49 75 Mat<eT>::Mat(const arma_vec_indicator&, const uhword in_vec_state)
Chris@49 76 : n_rows( (in_vec_state == 2) ? 1 : 0 )
Chris@49 77 , n_cols( (in_vec_state == 1) ? 1 : 0 )
Chris@49 78 , n_elem(0)
Chris@49 79 , vec_state(in_vec_state)
Chris@49 80 , mem_state(0)
Chris@49 81 , mem()
Chris@49 82 {
Chris@49 83 arma_extra_debug_sigprint_this(this);
Chris@49 84 }
Chris@49 85
Chris@49 86
Chris@49 87
Chris@49 88 //! constructor used by Row and Col classes
Chris@49 89 template<typename eT>
Chris@49 90 inline
Chris@49 91 Mat<eT>::Mat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state)
Chris@49 92 : n_rows(in_n_rows)
Chris@49 93 , n_cols(in_n_cols)
Chris@49 94 , n_elem(in_n_rows*in_n_cols)
Chris@49 95 , vec_state(in_vec_state)
Chris@49 96 , mem_state(0)
Chris@49 97 , mem()
Chris@49 98 {
Chris@49 99 arma_extra_debug_sigprint_this(this);
Chris@49 100
Chris@49 101 init_cold();
Chris@49 102 }
Chris@49 103
Chris@49 104
Chris@49 105
Chris@49 106 template<typename eT>
Chris@49 107 inline
Chris@49 108 Mat<eT>::Mat(const arma_fixed_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state, const eT* in_mem)
Chris@49 109 : n_rows (in_n_rows)
Chris@49 110 , n_cols (in_n_cols)
Chris@49 111 , n_elem (in_n_rows*in_n_cols)
Chris@49 112 , vec_state (in_vec_state)
Chris@49 113 , mem_state (3)
Chris@49 114 , mem (in_mem)
Chris@49 115 {
Chris@49 116 arma_extra_debug_sigprint_this(this);
Chris@49 117 }
Chris@49 118
Chris@49 119
Chris@49 120
Chris@49 121 template<typename eT>
Chris@49 122 inline
Chris@49 123 void
Chris@49 124 Mat<eT>::init_cold()
Chris@49 125 {
Chris@49 126 arma_extra_debug_sigprint( arma_boost::format("n_rows = %d, n_cols = %d") % n_rows % n_cols );
Chris@49 127
Chris@49 128 // ensure that n_elem can hold the result of (n_rows * n_cols)
Chris@49 129
Chris@49 130 arma_debug_check
Chris@49 131 (
Chris@49 132 (
Chris@49 133 ( (n_rows > ARMA_MAX_UHWORD) || (n_cols > ARMA_MAX_UHWORD) )
Chris@49 134 ? ( (float(n_rows) * float(n_cols)) > float(ARMA_MAX_UWORD) )
Chris@49 135 : false
Chris@49 136 ),
Chris@49 137 "Mat::init(): requested size is too large"
Chris@49 138 );
Chris@49 139
Chris@49 140 if(n_elem <= arma_config::mat_prealloc)
Chris@49 141 {
Chris@49 142 access::rw(mem) = mem_local;
Chris@49 143 }
Chris@49 144 else
Chris@49 145 {
Chris@49 146 arma_extra_debug_print("Mat::init(): allocating memory");
Chris@49 147
Chris@49 148 access::rw(mem) = memory::acquire<eT>(n_elem);
Chris@49 149
Chris@49 150 arma_check_bad_alloc( (mem == 0), "Mat::init(): out of memory" );
Chris@49 151 }
Chris@49 152 }
Chris@49 153
Chris@49 154
Chris@49 155
Chris@49 156 //! internal matrix construction; if the requested size is small enough, memory from the stack is used. otherwise memory is allocated via 'new'
Chris@49 157 template<typename eT>
Chris@49 158 inline
Chris@49 159 void
Chris@49 160 Mat<eT>::init_warm(uword in_n_rows, uword in_n_cols)
Chris@49 161 {
Chris@49 162 arma_extra_debug_sigprint( arma_boost::format("in_n_rows = %d, in_n_cols = %d") % in_n_rows % in_n_cols );
Chris@49 163
Chris@49 164 if( (n_rows == in_n_rows) && (n_cols == in_n_cols) )
Chris@49 165 {
Chris@49 166 return;
Chris@49 167 }
Chris@49 168
Chris@49 169 bool err_state = false;
Chris@49 170 char* err_msg = 0;
Chris@49 171
Chris@49 172 const uhword t_vec_state = vec_state;
Chris@49 173 const uhword t_mem_state = mem_state;
Chris@49 174
Chris@49 175 arma_debug_set_error
Chris@49 176 (
Chris@49 177 err_state,
Chris@49 178 err_msg,
Chris@49 179 (t_mem_state == 3),
Chris@49 180 "Mat::init(): size is fixed and hence cannot be changed"
Chris@49 181 );
Chris@49 182
Chris@49 183 if(t_vec_state > 0)
Chris@49 184 {
Chris@49 185 if( (in_n_rows == 0) && (in_n_cols == 0) )
Chris@49 186 {
Chris@49 187 if(t_vec_state == 1)
Chris@49 188 {
Chris@49 189 in_n_cols = 1;
Chris@49 190 }
Chris@49 191 else
Chris@49 192 if(t_vec_state == 2)
Chris@49 193 {
Chris@49 194 in_n_rows = 1;
Chris@49 195 }
Chris@49 196 }
Chris@49 197 else
Chris@49 198 {
Chris@49 199 arma_debug_set_error
Chris@49 200 (
Chris@49 201 err_state,
Chris@49 202 err_msg,
Chris@49 203 ( ((t_vec_state == 1) && (in_n_cols != 1)) || ((t_vec_state == 2) && (in_n_rows != 1)) ),
Chris@49 204 "Mat::init(): object is a row or column vector; requested size is not compatible"
Chris@49 205 );
Chris@49 206 }
Chris@49 207 }
Chris@49 208
Chris@49 209 // ensure that n_elem can hold the result of (n_rows * n_cols)
Chris@49 210
Chris@49 211 arma_debug_set_error
Chris@49 212 (
Chris@49 213 err_state,
Chris@49 214 err_msg,
Chris@49 215 (
Chris@49 216 ( (in_n_rows > ARMA_MAX_UHWORD) || (in_n_cols > ARMA_MAX_UHWORD) )
Chris@49 217 ? ( (float(in_n_rows) * float(in_n_cols)) > float(ARMA_MAX_UWORD) )
Chris@49 218 : false
Chris@49 219 ),
Chris@49 220 "Mat::init(): requested size is too large"
Chris@49 221 );
Chris@49 222
Chris@49 223 arma_debug_check(err_state, err_msg);
Chris@49 224
Chris@49 225 const uword old_n_elem = n_elem;
Chris@49 226 const uword new_n_elem = in_n_rows * in_n_cols;
Chris@49 227
Chris@49 228 if(old_n_elem == new_n_elem)
Chris@49 229 {
Chris@49 230 arma_extra_debug_print("Mat::init(): reusing memory");
Chris@49 231
Chris@49 232 access::rw(n_rows) = in_n_rows;
Chris@49 233 access::rw(n_cols) = in_n_cols;
Chris@49 234 }
Chris@49 235 else
Chris@49 236 {
Chris@49 237 arma_debug_check
Chris@49 238 (
Chris@49 239 (t_mem_state == 2),
Chris@49 240 "Mat::init(): mismatch between size of auxiliary memory and requested size"
Chris@49 241 );
Chris@49 242
Chris@49 243 if(t_mem_state == 0)
Chris@49 244 {
Chris@49 245 if(old_n_elem > arma_config::mat_prealloc)
Chris@49 246 {
Chris@49 247 arma_extra_debug_print("Mat::init(): freeing memory");
Chris@49 248
Chris@49 249 memory::release( access::rw(mem) );
Chris@49 250 }
Chris@49 251 }
Chris@49 252
Chris@49 253
Chris@49 254 if(new_n_elem <= arma_config::mat_prealloc)
Chris@49 255 {
Chris@49 256 access::rw(mem) = mem_local;
Chris@49 257 }
Chris@49 258 else
Chris@49 259 {
Chris@49 260 arma_extra_debug_print("Mat::init(): allocating memory");
Chris@49 261
Chris@49 262 access::rw(mem) = memory::acquire<eT>(new_n_elem);
Chris@49 263
Chris@49 264 arma_check_bad_alloc( (mem == 0), "Mat::init(): out of memory" );
Chris@49 265 }
Chris@49 266
Chris@49 267 access::rw(n_rows) = in_n_rows;
Chris@49 268 access::rw(n_cols) = in_n_cols;
Chris@49 269 access::rw(n_elem) = new_n_elem;
Chris@49 270 access::rw(mem_state) = 0;
Chris@49 271 }
Chris@49 272 }
Chris@49 273
Chris@49 274
Chris@49 275
Chris@49 276 //! create the matrix from a textual description
Chris@49 277 template<typename eT>
Chris@49 278 inline
Chris@49 279 Mat<eT>::Mat(const char* text)
Chris@49 280 : n_rows(0)
Chris@49 281 , n_cols(0)
Chris@49 282 , n_elem(0)
Chris@49 283 , vec_state(0)
Chris@49 284 , mem_state(0)
Chris@49 285 , mem()
Chris@49 286 {
Chris@49 287 arma_extra_debug_sigprint_this(this);
Chris@49 288
Chris@49 289 init( std::string(text) );
Chris@49 290 }
Chris@49 291
Chris@49 292
Chris@49 293
Chris@49 294 //! create the matrix from a textual description
Chris@49 295 template<typename eT>
Chris@49 296 inline
Chris@49 297 const Mat<eT>&
Chris@49 298 Mat<eT>::operator=(const char* text)
Chris@49 299 {
Chris@49 300 arma_extra_debug_sigprint();
Chris@49 301
Chris@49 302 init( std::string(text) );
Chris@49 303 return *this;
Chris@49 304 }
Chris@49 305
Chris@49 306
Chris@49 307
Chris@49 308 //! create the matrix from a textual description
Chris@49 309 template<typename eT>
Chris@49 310 inline
Chris@49 311 Mat<eT>::Mat(const std::string& text)
Chris@49 312 : n_rows(0)
Chris@49 313 , n_cols(0)
Chris@49 314 , n_elem(0)
Chris@49 315 , vec_state(0)
Chris@49 316 , mem_state(0)
Chris@49 317 , mem()
Chris@49 318 {
Chris@49 319 arma_extra_debug_sigprint_this(this);
Chris@49 320
Chris@49 321 init(text);
Chris@49 322 }
Chris@49 323
Chris@49 324
Chris@49 325
Chris@49 326 //! create the matrix from a textual description
Chris@49 327 template<typename eT>
Chris@49 328 inline
Chris@49 329 const Mat<eT>&
Chris@49 330 Mat<eT>::operator=(const std::string& text)
Chris@49 331 {
Chris@49 332 arma_extra_debug_sigprint();
Chris@49 333
Chris@49 334 init(text);
Chris@49 335 return *this;
Chris@49 336 }
Chris@49 337
Chris@49 338
Chris@49 339
Chris@49 340 //! internal function to create the matrix from a textual description
Chris@49 341 template<typename eT>
Chris@49 342 inline
Chris@49 343 void
Chris@49 344 Mat<eT>::init(const std::string& text)
Chris@49 345 {
Chris@49 346 arma_extra_debug_sigprint();
Chris@49 347
Chris@49 348 //
Chris@49 349 // work out the size
Chris@49 350
Chris@49 351 uword t_n_rows = 0;
Chris@49 352 uword t_n_cols = 0;
Chris@49 353
Chris@49 354 bool t_n_cols_found = false;
Chris@49 355
Chris@49 356 std::string token;
Chris@49 357
Chris@49 358 std::string::size_type line_start = 0;
Chris@49 359 std::string::size_type line_end = 0;
Chris@49 360
Chris@49 361 while( line_start < text.length() )
Chris@49 362 {
Chris@49 363
Chris@49 364 line_end = text.find(';', line_start);
Chris@49 365
Chris@49 366 if(line_end == std::string::npos)
Chris@49 367 line_end = text.length()-1;
Chris@49 368
Chris@49 369 std::string::size_type line_len = line_end - line_start + 1;
Chris@49 370 std::stringstream line_stream( text.substr(line_start,line_len) );
Chris@49 371
Chris@49 372
Chris@49 373 uword line_n_cols = 0;
Chris@49 374 while(line_stream >> token)
Chris@49 375 {
Chris@49 376 ++line_n_cols;
Chris@49 377 }
Chris@49 378
Chris@49 379
Chris@49 380 if(line_n_cols > 0)
Chris@49 381 {
Chris@49 382 if(t_n_cols_found == false)
Chris@49 383 {
Chris@49 384 t_n_cols = line_n_cols;
Chris@49 385 t_n_cols_found = true;
Chris@49 386 }
Chris@49 387 else
Chris@49 388 arma_check( (line_n_cols != t_n_cols), "Mat::init(): inconsistent number of columns in given string");
Chris@49 389
Chris@49 390 ++t_n_rows;
Chris@49 391 }
Chris@49 392 line_start = line_end+1;
Chris@49 393
Chris@49 394 }
Chris@49 395
Chris@49 396 Mat<eT>& x = *this;
Chris@49 397 x.set_size(t_n_rows, t_n_cols);
Chris@49 398
Chris@49 399 line_start = 0;
Chris@49 400 line_end = 0;
Chris@49 401
Chris@49 402 uword urow = 0;
Chris@49 403
Chris@49 404 while( line_start < text.length() )
Chris@49 405 {
Chris@49 406
Chris@49 407 line_end = text.find(';', line_start);
Chris@49 408
Chris@49 409 if(line_end == std::string::npos)
Chris@49 410 line_end = text.length()-1;
Chris@49 411
Chris@49 412 std::string::size_type line_len = line_end - line_start + 1;
Chris@49 413 std::stringstream line_stream( text.substr(line_start,line_len) );
Chris@49 414
Chris@49 415 // uword ucol = 0;
Chris@49 416 // while(line_stream >> token)
Chris@49 417 // {
Chris@49 418 // x.at(urow,ucol) = strtod(token.c_str(), 0);
Chris@49 419 // ++ucol;
Chris@49 420 // }
Chris@49 421
Chris@49 422 uword ucol = 0;
Chris@49 423 eT val;
Chris@49 424 while(line_stream >> val)
Chris@49 425 {
Chris@49 426 x.at(urow,ucol) = val;
Chris@49 427 ++ucol;
Chris@49 428 }
Chris@49 429
Chris@49 430 ++urow;
Chris@49 431 line_start = line_end+1;
Chris@49 432 }
Chris@49 433
Chris@49 434 }
Chris@49 435
Chris@49 436
Chris@49 437
Chris@49 438 //! create the matrix from std::vector
Chris@49 439 template<typename eT>
Chris@49 440 inline
Chris@49 441 Mat<eT>::Mat(const std::vector<eT>& x)
Chris@49 442 : n_rows(uword(x.size()))
Chris@49 443 , n_cols(1)
Chris@49 444 , n_elem(uword(x.size()))
Chris@49 445 , vec_state(0)
Chris@49 446 , mem_state(0)
Chris@49 447 , mem()
Chris@49 448 {
Chris@49 449 arma_extra_debug_sigprint_this(this);
Chris@49 450
Chris@49 451 init_cold();
Chris@49 452
Chris@49 453 if(n_elem > 0)
Chris@49 454 {
Chris@49 455 arrayops::copy( memptr(), &(x[0]), n_elem );
Chris@49 456 }
Chris@49 457 }
Chris@49 458
Chris@49 459
Chris@49 460
Chris@49 461 //! create the matrix from std::vector
Chris@49 462 template<typename eT>
Chris@49 463 inline
Chris@49 464 const Mat<eT>&
Chris@49 465 Mat<eT>::operator=(const std::vector<eT>& x)
Chris@49 466 {
Chris@49 467 arma_extra_debug_sigprint();
Chris@49 468
Chris@49 469 init_warm(uword(x.size()), 1);
Chris@49 470
Chris@49 471 if(x.size() > 0)
Chris@49 472 {
Chris@49 473 arrayops::copy( memptr(), &(x[0]), uword(x.size()) );
Chris@49 474 }
Chris@49 475
Chris@49 476 return *this;
Chris@49 477 }
Chris@49 478
Chris@49 479
Chris@49 480
Chris@49 481 #if defined(ARMA_USE_CXX11)
Chris@49 482
Chris@49 483 template<typename eT>
Chris@49 484 inline
Chris@49 485 Mat<eT>::Mat(const std::initializer_list<eT>& list)
Chris@49 486 : n_rows(0)
Chris@49 487 , n_cols(0)
Chris@49 488 , n_elem(0)
Chris@49 489 , vec_state(0)
Chris@49 490 , mem_state(0)
Chris@49 491 , mem()
Chris@49 492 {
Chris@49 493 arma_extra_debug_sigprint_this(this);
Chris@49 494
Chris@49 495 init(list);
Chris@49 496 }
Chris@49 497
Chris@49 498
Chris@49 499
Chris@49 500 template<typename eT>
Chris@49 501 inline
Chris@49 502 const Mat<eT>&
Chris@49 503 Mat<eT>::operator=(const std::initializer_list<eT>& list)
Chris@49 504 {
Chris@49 505 arma_extra_debug_sigprint();
Chris@49 506
Chris@49 507 init(list);
Chris@49 508
Chris@49 509 return *this;
Chris@49 510 }
Chris@49 511
Chris@49 512 #endif
Chris@49 513
Chris@49 514
Chris@49 515
Chris@49 516 //! Set the matrix to be equal to the specified scalar.
Chris@49 517 //! NOTE: the size of the matrix will be 1x1
Chris@49 518 template<typename eT>
Chris@49 519 arma_inline
Chris@49 520 const Mat<eT>&
Chris@49 521 Mat<eT>::operator=(const eT val)
Chris@49 522 {
Chris@49 523 arma_extra_debug_sigprint();
Chris@49 524
Chris@49 525 init_warm(1,1);
Chris@49 526 access::rw(mem[0]) = val;
Chris@49 527 return *this;
Chris@49 528 }
Chris@49 529
Chris@49 530
Chris@49 531
Chris@49 532 //! In-place addition of a scalar to all elements of the matrix
Chris@49 533 template<typename eT>
Chris@49 534 arma_inline
Chris@49 535 const Mat<eT>&
Chris@49 536 Mat<eT>::operator+=(const eT val)
Chris@49 537 {
Chris@49 538 arma_extra_debug_sigprint();
Chris@49 539
Chris@49 540 arrayops::inplace_plus( memptr(), val, n_elem );
Chris@49 541
Chris@49 542 return *this;
Chris@49 543 }
Chris@49 544
Chris@49 545
Chris@49 546
Chris@49 547 //! In-place subtraction of a scalar from all elements of the matrix
Chris@49 548 template<typename eT>
Chris@49 549 arma_inline
Chris@49 550 const Mat<eT>&
Chris@49 551 Mat<eT>::operator-=(const eT val)
Chris@49 552 {
Chris@49 553 arma_extra_debug_sigprint();
Chris@49 554
Chris@49 555 arrayops::inplace_minus( memptr(), val, n_elem );
Chris@49 556
Chris@49 557 return *this;
Chris@49 558 }
Chris@49 559
Chris@49 560
Chris@49 561
Chris@49 562 //! In-place multiplication of all elements of the matrix with a scalar
Chris@49 563 template<typename eT>
Chris@49 564 arma_inline
Chris@49 565 const Mat<eT>&
Chris@49 566 Mat<eT>::operator*=(const eT val)
Chris@49 567 {
Chris@49 568 arma_extra_debug_sigprint();
Chris@49 569
Chris@49 570 arrayops::inplace_mul( memptr(), val, n_elem );
Chris@49 571
Chris@49 572 return *this;
Chris@49 573 }
Chris@49 574
Chris@49 575
Chris@49 576
Chris@49 577 //! In-place division of all elements of the matrix with a scalar
Chris@49 578 template<typename eT>
Chris@49 579 arma_inline
Chris@49 580 const Mat<eT>&
Chris@49 581 Mat<eT>::operator/=(const eT val)
Chris@49 582 {
Chris@49 583 arma_extra_debug_sigprint();
Chris@49 584
Chris@49 585 arrayops::inplace_div( memptr(), val, n_elem );
Chris@49 586
Chris@49 587 return *this;
Chris@49 588 }
Chris@49 589
Chris@49 590
Chris@49 591
Chris@49 592 //! construct a matrix from a given matrix
Chris@49 593 template<typename eT>
Chris@49 594 inline
Chris@49 595 Mat<eT>::Mat(const Mat<eT>& in_mat)
Chris@49 596 : n_rows(in_mat.n_rows)
Chris@49 597 , n_cols(in_mat.n_cols)
Chris@49 598 , n_elem(in_mat.n_elem)
Chris@49 599 , vec_state(0)
Chris@49 600 , mem_state(0)
Chris@49 601 , mem()
Chris@49 602 {
Chris@49 603 arma_extra_debug_sigprint(arma_boost::format("this = %x in_mat = %x") % this % &in_mat);
Chris@49 604
Chris@49 605 init_cold();
Chris@49 606
Chris@49 607 arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );
Chris@49 608 }
Chris@49 609
Chris@49 610
Chris@49 611
Chris@49 612 //! construct a matrix from a given matrix
Chris@49 613 template<typename eT>
Chris@49 614 inline
Chris@49 615 const Mat<eT>&
Chris@49 616 Mat<eT>::operator=(const Mat<eT>& in_mat)
Chris@49 617 {
Chris@49 618 arma_extra_debug_sigprint(arma_boost::format("this = %x in_mat = %x") % this % &in_mat);
Chris@49 619
Chris@49 620 if(this != &in_mat)
Chris@49 621 {
Chris@49 622 init_warm(in_mat.n_rows, in_mat.n_cols);
Chris@49 623
Chris@49 624 arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );
Chris@49 625 }
Chris@49 626
Chris@49 627 return *this;
Chris@49 628 }
Chris@49 629
Chris@49 630
Chris@49 631
Chris@49 632 #if defined(ARMA_USE_CXX11)
Chris@49 633
Chris@49 634 template<typename eT>
Chris@49 635 inline
Chris@49 636 void
Chris@49 637 Mat<eT>::init(const std::initializer_list<eT>& list)
Chris@49 638 {
Chris@49 639 arma_extra_debug_sigprint();
Chris@49 640
Chris@49 641 const uword N = list.size();
Chris@49 642
Chris@49 643 set_size(1, N);
Chris@49 644
Chris@49 645 arrayops::copy( memptr(), list.begin(), N );
Chris@49 646 }
Chris@49 647
Chris@49 648 #endif
Chris@49 649
Chris@49 650
Chris@49 651
Chris@49 652 //! for constructing a complex matrix out of two non-complex matrices
Chris@49 653 template<typename eT>
Chris@49 654 template<typename T1, typename T2>
Chris@49 655 inline
Chris@49 656 void
Chris@49 657 Mat<eT>::init
Chris@49 658 (
Chris@49 659 const Base<typename Mat<eT>::pod_type, T1>& X,
Chris@49 660 const Base<typename Mat<eT>::pod_type, T2>& Y
Chris@49 661 )
Chris@49 662 {
Chris@49 663 arma_extra_debug_sigprint();
Chris@49 664
Chris@49 665 typedef typename T1::elem_type T;
Chris@49 666
Chris@49 667 arma_type_check(( is_complex<eT>::value == false )); //!< compile-time abort if eT isn't std::complex
Chris@49 668 arma_type_check(( is_complex< T>::value == true )); //!< compile-time abort if T is std::complex
Chris@49 669
Chris@49 670 arma_type_check(( is_same_type< std::complex<T>, eT >::value == false )); //!< compile-time abort if types are not compatible
Chris@49 671
Chris@49 672 const Proxy<T1> PX(X.get_ref());
Chris@49 673 const Proxy<T2> PY(Y.get_ref());
Chris@49 674
Chris@49 675 arma_debug_assert_same_size(PX, PY, "Mat()");
Chris@49 676
Chris@49 677 const uword local_n_rows = PX.get_n_rows();
Chris@49 678 const uword local_n_cols = PX.get_n_cols();
Chris@49 679
Chris@49 680 init_warm(local_n_rows, local_n_cols);
Chris@49 681
Chris@49 682 eT* out_mem = (*this).memptr();
Chris@49 683
Chris@49 684 const bool prefer_at_accessor = ( Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor );
Chris@49 685
Chris@49 686 if(prefer_at_accessor == false)
Chris@49 687 {
Chris@49 688 typedef typename Proxy<T1>::ea_type ea_type1;
Chris@49 689 typedef typename Proxy<T2>::ea_type ea_type2;
Chris@49 690
Chris@49 691 const uword N = n_elem;
Chris@49 692
Chris@49 693 ea_type1 A = PX.get_ea();
Chris@49 694 ea_type2 B = PY.get_ea();
Chris@49 695
Chris@49 696 for(uword ii=0; ii < N; ++ii)
Chris@49 697 {
Chris@49 698 out_mem[ii] = std::complex<T>(A[ii], B[ii]);
Chris@49 699 }
Chris@49 700 }
Chris@49 701 else
Chris@49 702 {
Chris@49 703 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 704 for(uword urow=0; urow < local_n_rows; ++urow)
Chris@49 705 {
Chris@49 706 *out_mem = std::complex<T>(PX.at(urow,ucol), PY.at(urow,ucol));
Chris@49 707 out_mem++;
Chris@49 708 }
Chris@49 709 }
Chris@49 710 }
Chris@49 711
Chris@49 712
Chris@49 713
Chris@49 714 //! EXPERIMENTAL: swap the contents of this matrix, denoted as matrix A, with given matrix B
Chris@49 715 template<typename eT>
Chris@49 716 inline
Chris@49 717 void
Chris@49 718 Mat<eT>::swap(Mat<eT>& B)
Chris@49 719 {
Chris@49 720 Mat<eT>& A = (*this);
Chris@49 721
Chris@49 722 arma_extra_debug_sigprint(arma_boost::format("A = %x B = %x") % &A % &B);
Chris@49 723
Chris@49 724 arma_debug_check( (A.vec_state != B.vec_state), "Mat::swap(): incompatible object types" );
Chris@49 725
Chris@49 726 const uhword A_mem_state = A.mem_state;
Chris@49 727 const uhword B_mem_state = B.mem_state;
Chris@49 728
Chris@49 729 if( (A_mem_state == 0) && (B_mem_state == 0) )
Chris@49 730 {
Chris@49 731 const uword A_n_elem = A.n_elem;
Chris@49 732 const uword B_n_elem = B.n_elem;
Chris@49 733
Chris@49 734 const bool A_use_local_mem = (A_n_elem <= arma_config::mat_prealloc);
Chris@49 735 const bool B_use_local_mem = (B_n_elem <= arma_config::mat_prealloc);
Chris@49 736
Chris@49 737 if( (A_use_local_mem == false) && (B_use_local_mem == false) )
Chris@49 738 {
Chris@49 739 std::swap( access::rw(A.mem), access::rw(B.mem) );
Chris@49 740 }
Chris@49 741 else
Chris@49 742 if( (A_use_local_mem == true) && (B_use_local_mem == true) )
Chris@49 743 {
Chris@49 744 const uword N = (std::max)(A_n_elem, B_n_elem);
Chris@49 745
Chris@49 746 eT* A_mem = A.memptr();
Chris@49 747 eT* B_mem = B.memptr();
Chris@49 748
Chris@49 749 for(uword ii=0; ii < N; ++ii) { std::swap( A_mem[ii], B_mem[ii] ); }
Chris@49 750 }
Chris@49 751 else
Chris@49 752 if( (A_use_local_mem == true) && (B_use_local_mem == false) )
Chris@49 753 {
Chris@49 754 eT* A_mem_local = &(A.mem_local[0]);
Chris@49 755 eT* B_mem_local = &(B.mem_local[0]);
Chris@49 756
Chris@49 757 arrayops::copy(B_mem_local, A_mem_local, A_n_elem);
Chris@49 758
Chris@49 759 access::rw(A.mem) = B.mem;
Chris@49 760 access::rw(B.mem) = B_mem_local;
Chris@49 761 }
Chris@49 762 else
Chris@49 763 if( (A_use_local_mem == false) && (B_use_local_mem == true) )
Chris@49 764 {
Chris@49 765 eT* A_mem_local = &(A.mem_local[0]);
Chris@49 766 eT* B_mem_local = &(B.mem_local[0]);
Chris@49 767
Chris@49 768 arrayops::copy(A_mem_local, B_mem_local, B_n_elem);
Chris@49 769
Chris@49 770 access::rw(B.mem) = A.mem;
Chris@49 771 access::rw(A.mem) = A_mem_local;
Chris@49 772 }
Chris@49 773
Chris@49 774 std::swap( access::rw(A.n_rows), access::rw(B.n_rows) );
Chris@49 775 std::swap( access::rw(A.n_cols), access::rw(B.n_cols) );
Chris@49 776 std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );
Chris@49 777 }
Chris@49 778 else
Chris@49 779 if( (A_mem_state == 3) && (B_mem_state == 3) )
Chris@49 780 {
Chris@49 781 arma_debug_check( ((A.n_rows != B.n_rows) || (A.n_cols != B.n_cols)), "Mat::swap(): incompatible object types" );
Chris@49 782
Chris@49 783 const uword N = A.n_elem;
Chris@49 784
Chris@49 785 eT* A_mem = A.memptr();
Chris@49 786 eT* B_mem = B.memptr();
Chris@49 787
Chris@49 788 for(uword ii=0; ii < N; ++ii) { std::swap(A_mem[ii], B_mem[ii]); }
Chris@49 789 }
Chris@49 790 else
Chris@49 791 {
Chris@49 792 arma_bad("Mat::swap(): incompatible object types");
Chris@49 793 }
Chris@49 794 }
Chris@49 795
Chris@49 796
Chris@49 797
Chris@49 798 //! try to steal the memory from a given matrix;
Chris@49 799 //! if memory can't be stolen, copy the given matrix
Chris@49 800 template<typename eT>
Chris@49 801 inline
Chris@49 802 void
Chris@49 803 Mat<eT>::steal_mem(Mat<eT>& x)
Chris@49 804 {
Chris@49 805 arma_extra_debug_sigprint();
Chris@49 806
Chris@49 807 if(this != &x)
Chris@49 808 {
Chris@49 809 const uword x_n_rows = x.n_rows;
Chris@49 810 const uword x_n_cols = x.n_cols;
Chris@49 811 const uword x_n_elem = x.n_elem;
Chris@49 812 const uword x_vec_state = x.vec_state;
Chris@49 813 const uword x_mem_state = x.mem_state;
Chris@49 814
Chris@49 815 const uword t_vec_state = vec_state;
Chris@49 816
Chris@49 817 bool layout_ok = false;
Chris@49 818
Chris@49 819 if(t_vec_state == x_vec_state)
Chris@49 820 {
Chris@49 821 layout_ok = true;
Chris@49 822 }
Chris@49 823 else
Chris@49 824 {
Chris@49 825 if( (t_vec_state == 1) && ( x_n_cols == 1) )
Chris@49 826 {
Chris@49 827 layout_ok = true;
Chris@49 828 }
Chris@49 829
Chris@49 830 if( (t_vec_state == 2) && ( x_n_rows == 1) )
Chris@49 831 {
Chris@49 832 layout_ok = true;
Chris@49 833 }
Chris@49 834 }
Chris@49 835
Chris@49 836
Chris@49 837 if( (x_mem_state == 0) && (x_n_elem > arma_config::mat_prealloc) && (layout_ok == true) )
Chris@49 838 {
Chris@49 839 reset();
Chris@49 840 // note: calling reset() also prevents fixed size matrices from changing size or using non-local memory
Chris@49 841
Chris@49 842 access::rw(n_rows) = x_n_rows;
Chris@49 843 access::rw(n_cols) = x_n_cols;
Chris@49 844 access::rw(n_elem) = x_n_elem;
Chris@49 845 access::rw(mem) = x.mem;
Chris@49 846
Chris@49 847 access::rw(x.n_rows) = 0;
Chris@49 848 access::rw(x.n_cols) = 0;
Chris@49 849 access::rw(x.n_elem) = 0;
Chris@49 850 access::rw(x.mem) = 0;
Chris@49 851 }
Chris@49 852 else
Chris@49 853 {
Chris@49 854 (*this).operator=(x);
Chris@49 855 }
Chris@49 856 }
Chris@49 857 }
Chris@49 858
Chris@49 859
Chris@49 860
Chris@49 861 //! construct a matrix from a given auxiliary array of eTs.
Chris@49 862 //! if copy_aux_mem is true, new memory is allocated and the array is copied.
Chris@49 863 //! if copy_aux_mem is false, the auxiliary array is used directly (without allocating memory and copying).
Chris@49 864 //! the default is to copy the array.
Chris@49 865
Chris@49 866 template<typename eT>
Chris@49 867 inline
Chris@49 868 Mat<eT>::Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem, const bool strict)
Chris@49 869 : n_rows ( aux_n_rows )
Chris@49 870 , n_cols ( aux_n_cols )
Chris@49 871 , n_elem ( aux_n_rows*aux_n_cols )
Chris@49 872 , vec_state( 0 )
Chris@49 873 , mem_state( copy_aux_mem ? 0 : ( strict ? 2 : 1 ) )
Chris@49 874 , mem ( copy_aux_mem ? 0 : aux_mem )
Chris@49 875 {
Chris@49 876 arma_extra_debug_sigprint_this(this);
Chris@49 877
Chris@49 878 if(copy_aux_mem == true)
Chris@49 879 {
Chris@49 880 init_cold();
Chris@49 881
Chris@49 882 arrayops::copy( memptr(), aux_mem, n_elem );
Chris@49 883 }
Chris@49 884 }
Chris@49 885
Chris@49 886
Chris@49 887
Chris@49 888 //! construct a matrix from a given auxiliary read-only array of eTs.
Chris@49 889 //! the array is copied.
Chris@49 890 template<typename eT>
Chris@49 891 inline
Chris@49 892 Mat<eT>::Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)
Chris@49 893 : n_rows(aux_n_rows)
Chris@49 894 , n_cols(aux_n_cols)
Chris@49 895 , n_elem(aux_n_rows*aux_n_cols)
Chris@49 896 , vec_state(0)
Chris@49 897 , mem_state(0)
Chris@49 898 , mem()
Chris@49 899 {
Chris@49 900 arma_extra_debug_sigprint_this(this);
Chris@49 901
Chris@49 902 init_cold();
Chris@49 903
Chris@49 904 arrayops::copy( memptr(), aux_mem, n_elem );
Chris@49 905 }
Chris@49 906
Chris@49 907
Chris@49 908
Chris@49 909 //! DANGEROUS! Construct a temporary matrix, using auxiliary memory.
Chris@49 910 //! This constructor is NOT intended for usage by user code.
Chris@49 911 //! Its sole purpose is to be used by the Cube class.
Chris@49 912
Chris@49 913 template<typename eT>
Chris@49 914 inline
Chris@49 915 Mat<eT>::Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)
Chris@49 916 : n_rows (aux_n_rows )
Chris@49 917 , n_cols (aux_n_cols )
Chris@49 918 , n_elem (aux_n_rows*aux_n_cols)
Chris@49 919 , vec_state(0 )
Chris@49 920 , mem_state(3 )
Chris@49 921 , mem (aux_mem )
Chris@49 922 {
Chris@49 923 arma_extra_debug_sigprint_this(this);
Chris@49 924 arma_ignore(junk);
Chris@49 925 }
Chris@49 926
Chris@49 927
Chris@49 928
Chris@49 929 //! in-place matrix addition
Chris@49 930 template<typename eT>
Chris@49 931 inline
Chris@49 932 const Mat<eT>&
Chris@49 933 Mat<eT>::operator+=(const Mat<eT>& m)
Chris@49 934 {
Chris@49 935 arma_extra_debug_sigprint();
Chris@49 936
Chris@49 937 arma_debug_assert_same_size(*this, m, "addition");
Chris@49 938
Chris@49 939 arrayops::inplace_plus( memptr(), m.memptr(), n_elem );
Chris@49 940
Chris@49 941 return *this;
Chris@49 942 }
Chris@49 943
Chris@49 944
Chris@49 945
Chris@49 946 //! in-place matrix subtraction
Chris@49 947 template<typename eT>
Chris@49 948 inline
Chris@49 949 const Mat<eT>&
Chris@49 950 Mat<eT>::operator-=(const Mat<eT>& m)
Chris@49 951 {
Chris@49 952 arma_extra_debug_sigprint();
Chris@49 953
Chris@49 954 arma_debug_assert_same_size(*this, m, "subtraction");
Chris@49 955
Chris@49 956 arrayops::inplace_minus( memptr(), m.memptr(), n_elem );
Chris@49 957
Chris@49 958 return *this;
Chris@49 959 }
Chris@49 960
Chris@49 961
Chris@49 962
Chris@49 963 //! in-place matrix multiplication
Chris@49 964 template<typename eT>
Chris@49 965 inline
Chris@49 966 const Mat<eT>&
Chris@49 967 Mat<eT>::operator*=(const Mat<eT>& m)
Chris@49 968 {
Chris@49 969 arma_extra_debug_sigprint();
Chris@49 970
Chris@49 971 glue_times::apply_inplace(*this, m);
Chris@49 972
Chris@49 973 return *this;
Chris@49 974 }
Chris@49 975
Chris@49 976
Chris@49 977
Chris@49 978 //! in-place element-wise matrix multiplication
Chris@49 979 template<typename eT>
Chris@49 980 inline
Chris@49 981 const Mat<eT>&
Chris@49 982 Mat<eT>::operator%=(const Mat<eT>& m)
Chris@49 983 {
Chris@49 984 arma_extra_debug_sigprint();
Chris@49 985
Chris@49 986 arma_debug_assert_same_size(*this, m, "element-wise multiplication");
Chris@49 987
Chris@49 988 arrayops::inplace_mul( memptr(), m.memptr(), n_elem );
Chris@49 989
Chris@49 990 return *this;
Chris@49 991 }
Chris@49 992
Chris@49 993
Chris@49 994
Chris@49 995 //! in-place element-wise matrix division
Chris@49 996 template<typename eT>
Chris@49 997 inline
Chris@49 998 const Mat<eT>&
Chris@49 999 Mat<eT>::operator/=(const Mat<eT>& m)
Chris@49 1000 {
Chris@49 1001 arma_extra_debug_sigprint();
Chris@49 1002
Chris@49 1003 arma_debug_assert_same_size(*this, m, "element-wise division");
Chris@49 1004
Chris@49 1005 arrayops::inplace_div( memptr(), m.memptr(), n_elem );
Chris@49 1006
Chris@49 1007 return *this;
Chris@49 1008 }
Chris@49 1009
Chris@49 1010
Chris@49 1011
Chris@49 1012 template<typename eT>
Chris@49 1013 template<typename T1>
Chris@49 1014 inline
Chris@49 1015 Mat<eT>::Mat(const BaseCube<eT,T1>& X)
Chris@49 1016 : n_rows(0)
Chris@49 1017 , n_cols(0)
Chris@49 1018 , n_elem(0)
Chris@49 1019 , vec_state(0)
Chris@49 1020 , mem_state(0)
Chris@49 1021 , mem()
Chris@49 1022 {
Chris@49 1023 arma_extra_debug_sigprint_this(this);
Chris@49 1024
Chris@49 1025 (*this).operator=(X);
Chris@49 1026 }
Chris@49 1027
Chris@49 1028
Chris@49 1029
Chris@49 1030 template<typename eT>
Chris@49 1031 template<typename T1>
Chris@49 1032 inline
Chris@49 1033 const Mat<eT>&
Chris@49 1034 Mat<eT>::operator=(const BaseCube<eT,T1>& X)
Chris@49 1035 {
Chris@49 1036 arma_extra_debug_sigprint();
Chris@49 1037
Chris@49 1038 Mat<eT>& out = *this;
Chris@49 1039
Chris@49 1040 const unwrap_cube<T1> tmp(X.get_ref());
Chris@49 1041 const Cube<eT>& in = tmp.M;
Chris@49 1042
Chris@49 1043 arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false);
Chris@49 1044
Chris@49 1045 const uword in_n_rows = in.n_rows;
Chris@49 1046 const uword in_n_cols = in.n_cols;
Chris@49 1047 const uword in_n_slices = in.n_slices;
Chris@49 1048
Chris@49 1049 const uword out_vec_state = out.vec_state;
Chris@49 1050
Chris@49 1051 if(in_n_slices == 1)
Chris@49 1052 {
Chris@49 1053 out.set_size(in_n_rows, in_n_cols);
Chris@49 1054
Chris@49 1055 for(uword ucol=0; ucol < in_n_cols; ++ucol)
Chris@49 1056 {
Chris@49 1057 arrayops::copy( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
Chris@49 1058 }
Chris@49 1059 }
Chris@49 1060 else
Chris@49 1061 {
Chris@49 1062 if(out_vec_state == 0)
Chris@49 1063 {
Chris@49 1064 if(in_n_cols == 1)
Chris@49 1065 {
Chris@49 1066 out.set_size(in_n_rows, in_n_slices);
Chris@49 1067
Chris@49 1068 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1069 {
Chris@49 1070 arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1071 }
Chris@49 1072 }
Chris@49 1073 else
Chris@49 1074 if(in_n_rows == 1)
Chris@49 1075 {
Chris@49 1076 out.set_size(in_n_cols, in_n_slices);
Chris@49 1077
Chris@49 1078 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1079 {
Chris@49 1080 eT* out_colptr = out.colptr(slice);
Chris@49 1081
Chris@49 1082 uword i,j;
Chris@49 1083 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1084 {
Chris@49 1085 const eT tmp_i = in.at(0, i, slice);
Chris@49 1086 const eT tmp_j = in.at(0, j, slice);
Chris@49 1087
Chris@49 1088 out_colptr[i] = tmp_i;
Chris@49 1089 out_colptr[j] = tmp_j;
Chris@49 1090 }
Chris@49 1091
Chris@49 1092 if(i < in_n_cols)
Chris@49 1093 {
Chris@49 1094 out_colptr[i] = in.at(0, i, slice);
Chris@49 1095 }
Chris@49 1096 }
Chris@49 1097 }
Chris@49 1098 }
Chris@49 1099 else
Chris@49 1100 {
Chris@49 1101 out.set_size(in_n_slices);
Chris@49 1102
Chris@49 1103 eT* out_mem = out.memptr();
Chris@49 1104
Chris@49 1105 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1106 {
Chris@49 1107 out_mem[i] = in.at(0, 0, i);
Chris@49 1108 }
Chris@49 1109 }
Chris@49 1110 }
Chris@49 1111
Chris@49 1112 return *this;
Chris@49 1113 }
Chris@49 1114
Chris@49 1115
Chris@49 1116
Chris@49 1117 template<typename eT>
Chris@49 1118 template<typename T1>
Chris@49 1119 inline
Chris@49 1120 const Mat<eT>&
Chris@49 1121 Mat<eT>::operator+=(const BaseCube<eT,T1>& X)
Chris@49 1122 {
Chris@49 1123 arma_extra_debug_sigprint();
Chris@49 1124
Chris@49 1125 Mat<eT>& out = *this;
Chris@49 1126
Chris@49 1127 const unwrap_cube<T1> tmp(X.get_ref());
Chris@49 1128 const Cube<eT>& in = tmp.M;
Chris@49 1129
Chris@49 1130 arma_debug_assert_cube_as_mat(out, in, "addition", true);
Chris@49 1131
Chris@49 1132 const uword in_n_rows = in.n_rows;
Chris@49 1133 const uword in_n_cols = in.n_cols;
Chris@49 1134 const uword in_n_slices = in.n_slices;
Chris@49 1135
Chris@49 1136 const uword out_n_rows = out.n_rows;
Chris@49 1137 const uword out_n_cols = out.n_cols;
Chris@49 1138 const uword out_vec_state = out.vec_state;
Chris@49 1139
Chris@49 1140 if(in_n_slices == 1)
Chris@49 1141 {
Chris@49 1142 for(uword ucol=0; ucol < in_n_cols; ++ucol)
Chris@49 1143 {
Chris@49 1144 arrayops::inplace_plus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
Chris@49 1145 }
Chris@49 1146 }
Chris@49 1147 else
Chris@49 1148 {
Chris@49 1149 if(out_vec_state == 0)
Chris@49 1150 {
Chris@49 1151 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1152 {
Chris@49 1153 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1154 {
Chris@49 1155 arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1156 }
Chris@49 1157 }
Chris@49 1158 else
Chris@49 1159 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1160 {
Chris@49 1161 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1162 {
Chris@49 1163 eT* out_colptr = out.colptr(slice);
Chris@49 1164
Chris@49 1165 uword i,j;
Chris@49 1166 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1167 {
Chris@49 1168 const eT tmp_i = in.at(0, i, slice);
Chris@49 1169 const eT tmp_j = in.at(0, j, slice);
Chris@49 1170
Chris@49 1171 out_colptr[i] += tmp_i;
Chris@49 1172 out_colptr[j] += tmp_j;
Chris@49 1173 }
Chris@49 1174
Chris@49 1175 if(i < in_n_cols)
Chris@49 1176 {
Chris@49 1177 out_colptr[i] += in.at(0, i, slice);
Chris@49 1178 }
Chris@49 1179 }
Chris@49 1180 }
Chris@49 1181 }
Chris@49 1182 else
Chris@49 1183 {
Chris@49 1184 eT* out_mem = out.memptr();
Chris@49 1185
Chris@49 1186 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1187 {
Chris@49 1188 out_mem[i] += in.at(0, 0, i);
Chris@49 1189 }
Chris@49 1190 }
Chris@49 1191 }
Chris@49 1192
Chris@49 1193 return *this;
Chris@49 1194 }
Chris@49 1195
Chris@49 1196
Chris@49 1197
Chris@49 1198 template<typename eT>
Chris@49 1199 template<typename T1>
Chris@49 1200 inline
Chris@49 1201 const Mat<eT>&
Chris@49 1202 Mat<eT>::operator-=(const BaseCube<eT,T1>& X)
Chris@49 1203 {
Chris@49 1204 arma_extra_debug_sigprint();
Chris@49 1205
Chris@49 1206 Mat<eT>& out = *this;
Chris@49 1207
Chris@49 1208 const unwrap_cube<T1> tmp(X.get_ref());
Chris@49 1209 const Cube<eT>& in = tmp.M;
Chris@49 1210
Chris@49 1211 arma_debug_assert_cube_as_mat(out, in, "subtraction", true);
Chris@49 1212
Chris@49 1213 const uword in_n_rows = in.n_rows;
Chris@49 1214 const uword in_n_cols = in.n_cols;
Chris@49 1215 const uword in_n_slices = in.n_slices;
Chris@49 1216
Chris@49 1217 const uword out_n_rows = out.n_rows;
Chris@49 1218 const uword out_n_cols = out.n_cols;
Chris@49 1219 const uword out_vec_state = out.vec_state;
Chris@49 1220
Chris@49 1221 if(in_n_slices == 1)
Chris@49 1222 {
Chris@49 1223 for(uword ucol=0; ucol < in_n_cols; ++ucol)
Chris@49 1224 {
Chris@49 1225 arrayops::inplace_minus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
Chris@49 1226 }
Chris@49 1227 }
Chris@49 1228 else
Chris@49 1229 {
Chris@49 1230 if(out_vec_state == 0)
Chris@49 1231 {
Chris@49 1232 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1233 {
Chris@49 1234 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1235 {
Chris@49 1236 arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1237 }
Chris@49 1238 }
Chris@49 1239 else
Chris@49 1240 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1241 {
Chris@49 1242 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1243 {
Chris@49 1244 eT* out_colptr = out.colptr(slice);
Chris@49 1245
Chris@49 1246 uword i,j;
Chris@49 1247 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1248 {
Chris@49 1249 const eT tmp_i = in.at(0, i, slice);
Chris@49 1250 const eT tmp_j = in.at(0, j, slice);
Chris@49 1251
Chris@49 1252 out_colptr[i] -= tmp_i;
Chris@49 1253 out_colptr[j] -= tmp_j;
Chris@49 1254 }
Chris@49 1255
Chris@49 1256 if(i < in_n_cols)
Chris@49 1257 {
Chris@49 1258 out_colptr[i] -= in.at(0, i, slice);
Chris@49 1259 }
Chris@49 1260 }
Chris@49 1261 }
Chris@49 1262 }
Chris@49 1263 else
Chris@49 1264 {
Chris@49 1265 eT* out_mem = out.memptr();
Chris@49 1266
Chris@49 1267 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1268 {
Chris@49 1269 out_mem[i] -= in.at(0, 0, i);
Chris@49 1270 }
Chris@49 1271 }
Chris@49 1272 }
Chris@49 1273
Chris@49 1274 return *this;
Chris@49 1275 }
Chris@49 1276
Chris@49 1277
Chris@49 1278
Chris@49 1279 template<typename eT>
Chris@49 1280 template<typename T1>
Chris@49 1281 inline
Chris@49 1282 const Mat<eT>&
Chris@49 1283 Mat<eT>::operator*=(const BaseCube<eT,T1>& X)
Chris@49 1284 {
Chris@49 1285 arma_extra_debug_sigprint();
Chris@49 1286
Chris@49 1287 const Mat<eT> B(X);
Chris@49 1288
Chris@49 1289 (*this).operator*=(B);
Chris@49 1290
Chris@49 1291 return *this;
Chris@49 1292 }
Chris@49 1293
Chris@49 1294
Chris@49 1295
Chris@49 1296 template<typename eT>
Chris@49 1297 template<typename T1>
Chris@49 1298 inline
Chris@49 1299 const Mat<eT>&
Chris@49 1300 Mat<eT>::operator%=(const BaseCube<eT,T1>& X)
Chris@49 1301 {
Chris@49 1302 arma_extra_debug_sigprint();
Chris@49 1303
Chris@49 1304 Mat<eT>& out = *this;
Chris@49 1305
Chris@49 1306 const unwrap_cube<T1> tmp(X.get_ref());
Chris@49 1307 const Cube<eT>& in = tmp.M;
Chris@49 1308
Chris@49 1309 arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true);
Chris@49 1310
Chris@49 1311 const uword in_n_rows = in.n_rows;
Chris@49 1312 const uword in_n_cols = in.n_cols;
Chris@49 1313 const uword in_n_slices = in.n_slices;
Chris@49 1314
Chris@49 1315 const uword out_n_rows = out.n_rows;
Chris@49 1316 const uword out_n_cols = out.n_cols;
Chris@49 1317 const uword out_vec_state = out.vec_state;
Chris@49 1318
Chris@49 1319 if(in_n_slices == 1)
Chris@49 1320 {
Chris@49 1321 for(uword ucol=0; ucol < in_n_cols; ++ucol)
Chris@49 1322 {
Chris@49 1323 arrayops::inplace_mul( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
Chris@49 1324 }
Chris@49 1325 }
Chris@49 1326 else
Chris@49 1327 {
Chris@49 1328 if(out_vec_state == 0)
Chris@49 1329 {
Chris@49 1330 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1331 {
Chris@49 1332 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1333 {
Chris@49 1334 arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1335 }
Chris@49 1336 }
Chris@49 1337 else
Chris@49 1338 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1339 {
Chris@49 1340 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1341 {
Chris@49 1342 eT* out_colptr = out.colptr(slice);
Chris@49 1343
Chris@49 1344 uword i,j;
Chris@49 1345 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1346 {
Chris@49 1347 const eT tmp_i = in.at(0, i, slice);
Chris@49 1348 const eT tmp_j = in.at(0, j, slice);
Chris@49 1349
Chris@49 1350 out_colptr[i] *= tmp_i;
Chris@49 1351 out_colptr[j] *= tmp_j;
Chris@49 1352 }
Chris@49 1353
Chris@49 1354 if(i < in_n_cols)
Chris@49 1355 {
Chris@49 1356 out_colptr[i] *= in.at(0, i, slice);
Chris@49 1357 }
Chris@49 1358 }
Chris@49 1359 }
Chris@49 1360 }
Chris@49 1361 else
Chris@49 1362 {
Chris@49 1363 eT* out_mem = out.memptr();
Chris@49 1364
Chris@49 1365 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1366 {
Chris@49 1367 out_mem[i] *= in.at(0, 0, i);
Chris@49 1368 }
Chris@49 1369 }
Chris@49 1370 }
Chris@49 1371
Chris@49 1372 return *this;
Chris@49 1373 }
Chris@49 1374
Chris@49 1375
Chris@49 1376
Chris@49 1377 template<typename eT>
Chris@49 1378 template<typename T1>
Chris@49 1379 inline
Chris@49 1380 const Mat<eT>&
Chris@49 1381 Mat<eT>::operator/=(const BaseCube<eT,T1>& X)
Chris@49 1382 {
Chris@49 1383 arma_extra_debug_sigprint();
Chris@49 1384
Chris@49 1385 Mat<eT>& out = *this;
Chris@49 1386
Chris@49 1387 const unwrap_cube<T1> tmp(X.get_ref());
Chris@49 1388 const Cube<eT>& in = tmp.M;
Chris@49 1389
Chris@49 1390 arma_debug_assert_cube_as_mat(out, in, "element-wise division", true);
Chris@49 1391
Chris@49 1392 const uword in_n_rows = in.n_rows;
Chris@49 1393 const uword in_n_cols = in.n_cols;
Chris@49 1394 const uword in_n_slices = in.n_slices;
Chris@49 1395
Chris@49 1396 const uword out_n_rows = out.n_rows;
Chris@49 1397 const uword out_n_cols = out.n_cols;
Chris@49 1398 const uword out_vec_state = out.vec_state;
Chris@49 1399
Chris@49 1400 if(in_n_slices == 1)
Chris@49 1401 {
Chris@49 1402 for(uword ucol=0; ucol < in_n_cols; ++ucol)
Chris@49 1403 {
Chris@49 1404 arrayops::inplace_div( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
Chris@49 1405 }
Chris@49 1406 }
Chris@49 1407 else
Chris@49 1408 {
Chris@49 1409 if(out_vec_state == 0)
Chris@49 1410 {
Chris@49 1411 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1412 {
Chris@49 1413 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1414 {
Chris@49 1415 arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1416 }
Chris@49 1417 }
Chris@49 1418 else
Chris@49 1419 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1420 {
Chris@49 1421 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1422 {
Chris@49 1423 eT* out_colptr = out.colptr(slice);
Chris@49 1424
Chris@49 1425 uword i,j;
Chris@49 1426 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1427 {
Chris@49 1428 const eT tmp_i = in.at(0, i, slice);
Chris@49 1429 const eT tmp_j = in.at(0, j, slice);
Chris@49 1430
Chris@49 1431 out_colptr[i] /= tmp_i;
Chris@49 1432 out_colptr[j] /= tmp_j;
Chris@49 1433 }
Chris@49 1434
Chris@49 1435 if(i < in_n_cols)
Chris@49 1436 {
Chris@49 1437 out_colptr[i] /= in.at(0, i, slice);
Chris@49 1438 }
Chris@49 1439 }
Chris@49 1440 }
Chris@49 1441 }
Chris@49 1442 else
Chris@49 1443 {
Chris@49 1444 eT* out_mem = out.memptr();
Chris@49 1445
Chris@49 1446 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1447 {
Chris@49 1448 out_mem[i] /= in.at(0, 0, i);
Chris@49 1449 }
Chris@49 1450 }
Chris@49 1451 }
Chris@49 1452
Chris@49 1453 return *this;
Chris@49 1454 }
Chris@49 1455
Chris@49 1456
Chris@49 1457
Chris@49 1458 //! for constructing a complex matrix out of two non-complex matrices
Chris@49 1459 template<typename eT>
Chris@49 1460 template<typename T1, typename T2>
Chris@49 1461 inline
Chris@49 1462 Mat<eT>::Mat
Chris@49 1463 (
Chris@49 1464 const Base<typename Mat<eT>::pod_type,T1>& A,
Chris@49 1465 const Base<typename Mat<eT>::pod_type,T2>& B
Chris@49 1466 )
Chris@49 1467 : n_rows(0)
Chris@49 1468 , n_cols(0)
Chris@49 1469 , n_elem(0)
Chris@49 1470 , vec_state(0)
Chris@49 1471 , mem_state(0)
Chris@49 1472 , mem()
Chris@49 1473 {
Chris@49 1474 arma_extra_debug_sigprint_this(this);
Chris@49 1475
Chris@49 1476 init(A,B);
Chris@49 1477 }
Chris@49 1478
Chris@49 1479
Chris@49 1480
Chris@49 1481 //! construct a matrix from subview (e.g. construct a matrix from a delayed submatrix operation)
Chris@49 1482 template<typename eT>
Chris@49 1483 inline
Chris@49 1484 Mat<eT>::Mat(const subview<eT>& X)
Chris@49 1485 : n_rows(X.n_rows)
Chris@49 1486 , n_cols(X.n_cols)
Chris@49 1487 , n_elem(X.n_elem)
Chris@49 1488 , vec_state(0)
Chris@49 1489 , mem_state(0)
Chris@49 1490 , mem()
Chris@49 1491 {
Chris@49 1492 arma_extra_debug_sigprint_this(this);
Chris@49 1493
Chris@49 1494 init_cold();
Chris@49 1495
Chris@49 1496 subview<eT>::extract(*this, X);
Chris@49 1497 }
Chris@49 1498
Chris@49 1499
Chris@49 1500
Chris@49 1501 //! construct a matrix from subview (e.g. construct a matrix from a delayed submatrix operation)
Chris@49 1502 template<typename eT>
Chris@49 1503 inline
Chris@49 1504 const Mat<eT>&
Chris@49 1505 Mat<eT>::operator=(const subview<eT>& X)
Chris@49 1506 {
Chris@49 1507 arma_extra_debug_sigprint();
Chris@49 1508
Chris@49 1509 const bool alias = (this == &(X.m));
Chris@49 1510
Chris@49 1511 if(alias == false)
Chris@49 1512 {
Chris@49 1513 init_warm(X.n_rows, X.n_cols);
Chris@49 1514
Chris@49 1515 subview<eT>::extract(*this, X);
Chris@49 1516 }
Chris@49 1517 else
Chris@49 1518 {
Chris@49 1519 Mat<eT> tmp(X);
Chris@49 1520
Chris@49 1521 steal_mem(tmp);
Chris@49 1522 }
Chris@49 1523
Chris@49 1524 return *this;
Chris@49 1525 }
Chris@49 1526
Chris@49 1527
Chris@49 1528 //! in-place matrix addition (using a submatrix on the right-hand-side)
Chris@49 1529 template<typename eT>
Chris@49 1530 inline
Chris@49 1531 const Mat<eT>&
Chris@49 1532 Mat<eT>::operator+=(const subview<eT>& X)
Chris@49 1533 {
Chris@49 1534 arma_extra_debug_sigprint();
Chris@49 1535
Chris@49 1536 subview<eT>::plus_inplace(*this, X);
Chris@49 1537
Chris@49 1538 return *this;
Chris@49 1539 }
Chris@49 1540
Chris@49 1541
Chris@49 1542 //! in-place matrix subtraction (using a submatrix on the right-hand-side)
Chris@49 1543 template<typename eT>
Chris@49 1544 inline
Chris@49 1545 const Mat<eT>&
Chris@49 1546 Mat<eT>::operator-=(const subview<eT>& X)
Chris@49 1547 {
Chris@49 1548 arma_extra_debug_sigprint();
Chris@49 1549
Chris@49 1550 subview<eT>::minus_inplace(*this, X);
Chris@49 1551
Chris@49 1552 return *this;
Chris@49 1553 }
Chris@49 1554
Chris@49 1555
Chris@49 1556
Chris@49 1557 //! in-place matrix mutiplication (using a submatrix on the right-hand-side)
Chris@49 1558 template<typename eT>
Chris@49 1559 inline
Chris@49 1560 const Mat<eT>&
Chris@49 1561 Mat<eT>::operator*=(const subview<eT>& X)
Chris@49 1562 {
Chris@49 1563 arma_extra_debug_sigprint();
Chris@49 1564
Chris@49 1565 glue_times::apply_inplace(*this, X);
Chris@49 1566
Chris@49 1567 return *this;
Chris@49 1568 }
Chris@49 1569
Chris@49 1570
Chris@49 1571
Chris@49 1572 //! in-place element-wise matrix mutiplication (using a submatrix on the right-hand-side)
Chris@49 1573 template<typename eT>
Chris@49 1574 inline
Chris@49 1575 const Mat<eT>&
Chris@49 1576 Mat<eT>::operator%=(const subview<eT>& X)
Chris@49 1577 {
Chris@49 1578 arma_extra_debug_sigprint();
Chris@49 1579
Chris@49 1580 subview<eT>::schur_inplace(*this, X);
Chris@49 1581
Chris@49 1582 return *this;
Chris@49 1583 }
Chris@49 1584
Chris@49 1585
Chris@49 1586
Chris@49 1587 //! in-place element-wise matrix division (using a submatrix on the right-hand-side)
Chris@49 1588 template<typename eT>
Chris@49 1589 inline
Chris@49 1590 const Mat<eT>&
Chris@49 1591 Mat<eT>::operator/=(const subview<eT>& X)
Chris@49 1592 {
Chris@49 1593 arma_extra_debug_sigprint();
Chris@49 1594
Chris@49 1595 subview<eT>::div_inplace(*this, X);
Chris@49 1596
Chris@49 1597 return *this;
Chris@49 1598 }
Chris@49 1599
Chris@49 1600
Chris@49 1601
Chris@49 1602 template<typename eT>
Chris@49 1603 inline
Chris@49 1604 Mat<eT>::Mat(const subview_row_strans<eT>& X)
Chris@49 1605 : n_rows(X.n_rows)
Chris@49 1606 , n_cols(X.n_cols)
Chris@49 1607 , n_elem(X.n_elem)
Chris@49 1608 , vec_state(0)
Chris@49 1609 , mem_state(0)
Chris@49 1610 , mem()
Chris@49 1611 {
Chris@49 1612 arma_extra_debug_sigprint_this(this);
Chris@49 1613
Chris@49 1614 init_cold();
Chris@49 1615
Chris@49 1616 X.extract(*this);
Chris@49 1617 }
Chris@49 1618
Chris@49 1619
Chris@49 1620
Chris@49 1621 template<typename eT>
Chris@49 1622 inline
Chris@49 1623 Mat<eT>::Mat(const subview_row_htrans<eT>& X)
Chris@49 1624 : n_rows(X.n_rows)
Chris@49 1625 , n_cols(X.n_cols)
Chris@49 1626 , n_elem(X.n_elem)
Chris@49 1627 , vec_state(0)
Chris@49 1628 , mem_state(0)
Chris@49 1629 , mem()
Chris@49 1630 {
Chris@49 1631 arma_extra_debug_sigprint_this(this);
Chris@49 1632
Chris@49 1633 init_cold();
Chris@49 1634
Chris@49 1635 X.extract(*this);
Chris@49 1636 }
Chris@49 1637
Chris@49 1638
Chris@49 1639
Chris@49 1640 template<typename eT>
Chris@49 1641 inline
Chris@49 1642 Mat<eT>::Mat(const xvec_htrans<eT>& X)
Chris@49 1643 : n_rows(X.n_rows)
Chris@49 1644 , n_cols(X.n_cols)
Chris@49 1645 , n_elem(X.n_elem)
Chris@49 1646 , vec_state(0)
Chris@49 1647 , mem_state(0)
Chris@49 1648 , mem()
Chris@49 1649 {
Chris@49 1650 arma_extra_debug_sigprint_this(this);
Chris@49 1651
Chris@49 1652 init_cold();
Chris@49 1653
Chris@49 1654 X.extract(*this);
Chris@49 1655 }
Chris@49 1656
Chris@49 1657
Chris@49 1658
Chris@49 1659 //! construct a matrix from a subview_cube instance
Chris@49 1660 template<typename eT>
Chris@49 1661 inline
Chris@49 1662 Mat<eT>::Mat(const subview_cube<eT>& x)
Chris@49 1663 : n_rows(0)
Chris@49 1664 , n_cols(0)
Chris@49 1665 , n_elem(0)
Chris@49 1666 , vec_state(0)
Chris@49 1667 , mem_state(0)
Chris@49 1668 , mem()
Chris@49 1669 {
Chris@49 1670 arma_extra_debug_sigprint_this(this);
Chris@49 1671
Chris@49 1672 this->operator=(x);
Chris@49 1673 }
Chris@49 1674
Chris@49 1675
Chris@49 1676
Chris@49 1677 //! construct a matrix from a subview_cube instance
Chris@49 1678 template<typename eT>
Chris@49 1679 inline
Chris@49 1680 const Mat<eT>&
Chris@49 1681 Mat<eT>::operator=(const subview_cube<eT>& X)
Chris@49 1682 {
Chris@49 1683 arma_extra_debug_sigprint();
Chris@49 1684
Chris@49 1685 subview_cube<eT>::extract(*this, X);
Chris@49 1686
Chris@49 1687 return *this;
Chris@49 1688 }
Chris@49 1689
Chris@49 1690
Chris@49 1691
Chris@49 1692 //! in-place matrix addition (using a single-slice subcube on the right-hand-side)
Chris@49 1693 template<typename eT>
Chris@49 1694 inline
Chris@49 1695 const Mat<eT>&
Chris@49 1696 Mat<eT>::operator+=(const subview_cube<eT>& X)
Chris@49 1697 {
Chris@49 1698 arma_extra_debug_sigprint();
Chris@49 1699
Chris@49 1700 subview_cube<eT>::plus_inplace(*this, X);
Chris@49 1701
Chris@49 1702 return *this;
Chris@49 1703 }
Chris@49 1704
Chris@49 1705
Chris@49 1706
Chris@49 1707 //! in-place matrix subtraction (using a single-slice subcube on the right-hand-side)
Chris@49 1708 template<typename eT>
Chris@49 1709 inline
Chris@49 1710 const Mat<eT>&
Chris@49 1711 Mat<eT>::operator-=(const subview_cube<eT>& X)
Chris@49 1712 {
Chris@49 1713 arma_extra_debug_sigprint();
Chris@49 1714
Chris@49 1715 subview_cube<eT>::minus_inplace(*this, X);
Chris@49 1716
Chris@49 1717 return *this;
Chris@49 1718 }
Chris@49 1719
Chris@49 1720
Chris@49 1721
Chris@49 1722 //! in-place matrix mutiplication (using a single-slice subcube on the right-hand-side)
Chris@49 1723 template<typename eT>
Chris@49 1724 inline
Chris@49 1725 const Mat<eT>&
Chris@49 1726 Mat<eT>::operator*=(const subview_cube<eT>& X)
Chris@49 1727 {
Chris@49 1728 arma_extra_debug_sigprint();
Chris@49 1729
Chris@49 1730 const Mat<eT> tmp(X);
Chris@49 1731 glue_times::apply_inplace(*this, tmp);
Chris@49 1732
Chris@49 1733 return *this;
Chris@49 1734 }
Chris@49 1735
Chris@49 1736
Chris@49 1737
Chris@49 1738 //! in-place element-wise matrix mutiplication (using a single-slice subcube on the right-hand-side)
Chris@49 1739 template<typename eT>
Chris@49 1740 inline
Chris@49 1741 const Mat<eT>&
Chris@49 1742 Mat<eT>::operator%=(const subview_cube<eT>& X)
Chris@49 1743 {
Chris@49 1744 arma_extra_debug_sigprint();
Chris@49 1745
Chris@49 1746 subview_cube<eT>::schur_inplace(*this, X);
Chris@49 1747
Chris@49 1748 return *this;
Chris@49 1749 }
Chris@49 1750
Chris@49 1751
Chris@49 1752
Chris@49 1753 //! in-place element-wise matrix division (using a single-slice subcube on the right-hand-side)
Chris@49 1754 template<typename eT>
Chris@49 1755 inline
Chris@49 1756 const Mat<eT>&
Chris@49 1757 Mat<eT>::operator/=(const subview_cube<eT>& X)
Chris@49 1758 {
Chris@49 1759 arma_extra_debug_sigprint();
Chris@49 1760
Chris@49 1761 subview_cube<eT>::div_inplace(*this, X);
Chris@49 1762
Chris@49 1763 return *this;
Chris@49 1764 }
Chris@49 1765
Chris@49 1766
Chris@49 1767
Chris@49 1768 //! construct a matrix from diagview (e.g. construct a matrix from a delayed diag operation)
Chris@49 1769 template<typename eT>
Chris@49 1770 inline
Chris@49 1771 Mat<eT>::Mat(const diagview<eT>& X)
Chris@49 1772 : n_rows(X.n_rows)
Chris@49 1773 , n_cols(X.n_cols)
Chris@49 1774 , n_elem(X.n_elem)
Chris@49 1775 , vec_state(0)
Chris@49 1776 , mem_state(0)
Chris@49 1777 , mem()
Chris@49 1778 {
Chris@49 1779 arma_extra_debug_sigprint_this(this);
Chris@49 1780
Chris@49 1781 init_cold();
Chris@49 1782
Chris@49 1783 diagview<eT>::extract(*this, X);
Chris@49 1784 }
Chris@49 1785
Chris@49 1786
Chris@49 1787
Chris@49 1788 //! construct a matrix from diagview (e.g. construct a matrix from a delayed diag operation)
Chris@49 1789 template<typename eT>
Chris@49 1790 inline
Chris@49 1791 const Mat<eT>&
Chris@49 1792 Mat<eT>::operator=(const diagview<eT>& X)
Chris@49 1793 {
Chris@49 1794 arma_extra_debug_sigprint();
Chris@49 1795
Chris@49 1796 const bool alias = (this == &(X.m));
Chris@49 1797
Chris@49 1798 if(alias == false)
Chris@49 1799 {
Chris@49 1800 init_warm(X.n_rows, X.n_cols);
Chris@49 1801
Chris@49 1802 diagview<eT>::extract(*this, X);
Chris@49 1803 }
Chris@49 1804 else
Chris@49 1805 {
Chris@49 1806 Mat<eT> tmp(X);
Chris@49 1807
Chris@49 1808 steal_mem(tmp);
Chris@49 1809 }
Chris@49 1810
Chris@49 1811 return *this;
Chris@49 1812 }
Chris@49 1813
Chris@49 1814
Chris@49 1815
Chris@49 1816 //! in-place matrix addition (using a diagview on the right-hand-side)
Chris@49 1817 template<typename eT>
Chris@49 1818 inline
Chris@49 1819 const Mat<eT>&
Chris@49 1820 Mat<eT>::operator+=(const diagview<eT>& X)
Chris@49 1821 {
Chris@49 1822 arma_extra_debug_sigprint();
Chris@49 1823
Chris@49 1824 diagview<eT>::plus_inplace(*this, X);
Chris@49 1825
Chris@49 1826 return *this;
Chris@49 1827 }
Chris@49 1828
Chris@49 1829
Chris@49 1830 //! in-place matrix subtraction (using a diagview on the right-hand-side)
Chris@49 1831 template<typename eT>
Chris@49 1832 inline
Chris@49 1833 const Mat<eT>&
Chris@49 1834 Mat<eT>::operator-=(const diagview<eT>& X)
Chris@49 1835 {
Chris@49 1836 arma_extra_debug_sigprint();
Chris@49 1837
Chris@49 1838 diagview<eT>::minus_inplace(*this, X);
Chris@49 1839
Chris@49 1840 return *this;
Chris@49 1841 }
Chris@49 1842
Chris@49 1843
Chris@49 1844
Chris@49 1845 //! in-place matrix mutiplication (using a diagview on the right-hand-side)
Chris@49 1846 template<typename eT>
Chris@49 1847 inline
Chris@49 1848 const Mat<eT>&
Chris@49 1849 Mat<eT>::operator*=(const diagview<eT>& X)
Chris@49 1850 {
Chris@49 1851 arma_extra_debug_sigprint();
Chris@49 1852
Chris@49 1853 glue_times::apply_inplace(*this, X);
Chris@49 1854
Chris@49 1855 return *this;
Chris@49 1856 }
Chris@49 1857
Chris@49 1858
Chris@49 1859
Chris@49 1860 //! in-place element-wise matrix mutiplication (using a diagview on the right-hand-side)
Chris@49 1861 template<typename eT>
Chris@49 1862 inline
Chris@49 1863 const Mat<eT>&
Chris@49 1864 Mat<eT>::operator%=(const diagview<eT>& X)
Chris@49 1865 {
Chris@49 1866 arma_extra_debug_sigprint();
Chris@49 1867
Chris@49 1868 diagview<eT>::schur_inplace(*this, X);
Chris@49 1869
Chris@49 1870 return *this;
Chris@49 1871 }
Chris@49 1872
Chris@49 1873
Chris@49 1874
Chris@49 1875 //! in-place element-wise matrix division (using a diagview on the right-hand-side)
Chris@49 1876 template<typename eT>
Chris@49 1877 inline
Chris@49 1878 const Mat<eT>&
Chris@49 1879 Mat<eT>::operator/=(const diagview<eT>& X)
Chris@49 1880 {
Chris@49 1881 arma_extra_debug_sigprint();
Chris@49 1882
Chris@49 1883 diagview<eT>::div_inplace(*this, X);
Chris@49 1884
Chris@49 1885 return *this;
Chris@49 1886 }
Chris@49 1887
Chris@49 1888
Chris@49 1889
Chris@49 1890 template<typename eT>
Chris@49 1891 template<typename T1>
Chris@49 1892 inline
Chris@49 1893 Mat<eT>::Mat(const subview_elem1<eT,T1>& X)
Chris@49 1894 : n_rows(0)
Chris@49 1895 , n_cols(0)
Chris@49 1896 , n_elem(0)
Chris@49 1897 , vec_state(0)
Chris@49 1898 , mem_state(0)
Chris@49 1899 , mem()
Chris@49 1900 {
Chris@49 1901 arma_extra_debug_sigprint_this(this);
Chris@49 1902
Chris@49 1903 this->operator=(X);
Chris@49 1904 }
Chris@49 1905
Chris@49 1906
Chris@49 1907
Chris@49 1908 template<typename eT>
Chris@49 1909 template<typename T1>
Chris@49 1910 inline
Chris@49 1911 const Mat<eT>&
Chris@49 1912 Mat<eT>::operator=(const subview_elem1<eT,T1>& X)
Chris@49 1913 {
Chris@49 1914 arma_extra_debug_sigprint();
Chris@49 1915
Chris@49 1916 subview_elem1<eT,T1>::extract(*this, X);
Chris@49 1917
Chris@49 1918 return *this;
Chris@49 1919 }
Chris@49 1920
Chris@49 1921
Chris@49 1922
Chris@49 1923 template<typename eT>
Chris@49 1924 template<typename T1>
Chris@49 1925 inline
Chris@49 1926 const Mat<eT>&
Chris@49 1927 Mat<eT>::operator+=(const subview_elem1<eT,T1>& X)
Chris@49 1928 {
Chris@49 1929 arma_extra_debug_sigprint();
Chris@49 1930
Chris@49 1931 subview_elem1<eT,T1>::plus_inplace(*this, X);
Chris@49 1932
Chris@49 1933 return *this;
Chris@49 1934 }
Chris@49 1935
Chris@49 1936
Chris@49 1937
Chris@49 1938 template<typename eT>
Chris@49 1939 template<typename T1>
Chris@49 1940 inline
Chris@49 1941 const Mat<eT>&
Chris@49 1942 Mat<eT>::operator-=(const subview_elem1<eT,T1>& X)
Chris@49 1943 {
Chris@49 1944 arma_extra_debug_sigprint();
Chris@49 1945
Chris@49 1946 subview_elem1<eT,T1>::minus_inplace(*this, X);
Chris@49 1947
Chris@49 1948 return *this;
Chris@49 1949 }
Chris@49 1950
Chris@49 1951
Chris@49 1952
Chris@49 1953 template<typename eT>
Chris@49 1954 template<typename T1>
Chris@49 1955 inline
Chris@49 1956 const Mat<eT>&
Chris@49 1957 Mat<eT>::operator*=(const subview_elem1<eT,T1>& X)
Chris@49 1958 {
Chris@49 1959 arma_extra_debug_sigprint();
Chris@49 1960
Chris@49 1961 glue_times::apply_inplace(*this, X);
Chris@49 1962
Chris@49 1963 return *this;
Chris@49 1964 }
Chris@49 1965
Chris@49 1966
Chris@49 1967
Chris@49 1968 template<typename eT>
Chris@49 1969 template<typename T1>
Chris@49 1970 inline
Chris@49 1971 const Mat<eT>&
Chris@49 1972 Mat<eT>::operator%=(const subview_elem1<eT,T1>& X)
Chris@49 1973 {
Chris@49 1974 arma_extra_debug_sigprint();
Chris@49 1975
Chris@49 1976 subview_elem1<eT,T1>::schur_inplace(*this, X);
Chris@49 1977
Chris@49 1978 return *this;
Chris@49 1979 }
Chris@49 1980
Chris@49 1981
Chris@49 1982
Chris@49 1983 template<typename eT>
Chris@49 1984 template<typename T1>
Chris@49 1985 inline
Chris@49 1986 const Mat<eT>&
Chris@49 1987 Mat<eT>::operator/=(const subview_elem1<eT,T1>& X)
Chris@49 1988 {
Chris@49 1989 arma_extra_debug_sigprint();
Chris@49 1990
Chris@49 1991 subview_elem1<eT,T1>::div_inplace(*this, X);
Chris@49 1992
Chris@49 1993 return *this;
Chris@49 1994 }
Chris@49 1995
Chris@49 1996
Chris@49 1997
Chris@49 1998 template<typename eT>
Chris@49 1999 template<typename T1, typename T2>
Chris@49 2000 inline
Chris@49 2001 Mat<eT>::Mat(const subview_elem2<eT,T1,T2>& X)
Chris@49 2002 : n_rows(0)
Chris@49 2003 , n_cols(0)
Chris@49 2004 , n_elem(0)
Chris@49 2005 , vec_state(0)
Chris@49 2006 , mem_state(0)
Chris@49 2007 , mem()
Chris@49 2008 {
Chris@49 2009 arma_extra_debug_sigprint_this(this);
Chris@49 2010
Chris@49 2011 this->operator=(X);
Chris@49 2012 }
Chris@49 2013
Chris@49 2014
Chris@49 2015
Chris@49 2016 template<typename eT>
Chris@49 2017 template<typename T1, typename T2>
Chris@49 2018 inline
Chris@49 2019 const Mat<eT>&
Chris@49 2020 Mat<eT>::operator=(const subview_elem2<eT,T1,T2>& X)
Chris@49 2021 {
Chris@49 2022 arma_extra_debug_sigprint();
Chris@49 2023
Chris@49 2024 subview_elem2<eT,T1,T2>::extract(*this, X);
Chris@49 2025
Chris@49 2026 return *this;
Chris@49 2027 }
Chris@49 2028
Chris@49 2029
Chris@49 2030
Chris@49 2031 template<typename eT>
Chris@49 2032 template<typename T1, typename T2>
Chris@49 2033 inline
Chris@49 2034 const Mat<eT>&
Chris@49 2035 Mat<eT>::operator+=(const subview_elem2<eT,T1,T2>& X)
Chris@49 2036 {
Chris@49 2037 arma_extra_debug_sigprint();
Chris@49 2038
Chris@49 2039 subview_elem2<eT,T1,T2>::plus_inplace(*this, X);
Chris@49 2040
Chris@49 2041 return *this;
Chris@49 2042 }
Chris@49 2043
Chris@49 2044
Chris@49 2045
Chris@49 2046 template<typename eT>
Chris@49 2047 template<typename T1, typename T2>
Chris@49 2048 inline
Chris@49 2049 const Mat<eT>&
Chris@49 2050 Mat<eT>::operator-=(const subview_elem2<eT,T1,T2>& X)
Chris@49 2051 {
Chris@49 2052 arma_extra_debug_sigprint();
Chris@49 2053
Chris@49 2054 subview_elem2<eT,T1,T2>::minus_inplace(*this, X);
Chris@49 2055
Chris@49 2056 return *this;
Chris@49 2057 }
Chris@49 2058
Chris@49 2059
Chris@49 2060
Chris@49 2061 template<typename eT>
Chris@49 2062 template<typename T1, typename T2>
Chris@49 2063 inline
Chris@49 2064 const Mat<eT>&
Chris@49 2065 Mat<eT>::operator*=(const subview_elem2<eT,T1,T2>& X)
Chris@49 2066 {
Chris@49 2067 arma_extra_debug_sigprint();
Chris@49 2068
Chris@49 2069 glue_times::apply_inplace(*this, X);
Chris@49 2070
Chris@49 2071 return *this;
Chris@49 2072 }
Chris@49 2073
Chris@49 2074
Chris@49 2075
Chris@49 2076 template<typename eT>
Chris@49 2077 template<typename T1, typename T2>
Chris@49 2078 inline
Chris@49 2079 const Mat<eT>&
Chris@49 2080 Mat<eT>::operator%=(const subview_elem2<eT,T1,T2>& X)
Chris@49 2081 {
Chris@49 2082 arma_extra_debug_sigprint();
Chris@49 2083
Chris@49 2084 subview_elem2<eT,T1,T2>::schur_inplace(*this, X);
Chris@49 2085
Chris@49 2086 return *this;
Chris@49 2087 }
Chris@49 2088
Chris@49 2089
Chris@49 2090
Chris@49 2091 template<typename eT>
Chris@49 2092 template<typename T1, typename T2>
Chris@49 2093 inline
Chris@49 2094 const Mat<eT>&
Chris@49 2095 Mat<eT>::operator/=(const subview_elem2<eT,T1,T2>& X)
Chris@49 2096 {
Chris@49 2097 arma_extra_debug_sigprint();
Chris@49 2098
Chris@49 2099 subview_elem2<eT,T1,T2>::div_inplace(*this, X);
Chris@49 2100
Chris@49 2101 return *this;
Chris@49 2102 }
Chris@49 2103
Chris@49 2104
Chris@49 2105
Chris@49 2106 template<typename eT>
Chris@49 2107 template<typename T1>
Chris@49 2108 inline
Chris@49 2109 Mat<eT>::Mat(const SpBase<eT, T1>& m)
Chris@49 2110 : n_rows(0)
Chris@49 2111 , n_cols(0)
Chris@49 2112 , n_elem(0)
Chris@49 2113 , vec_state(0)
Chris@49 2114 , mem_state(0)
Chris@49 2115 , mem()
Chris@49 2116 {
Chris@49 2117 arma_extra_debug_sigprint_this(this);
Chris@49 2118
Chris@49 2119 const SpProxy<T1> p(m.get_ref());
Chris@49 2120
Chris@49 2121 access::rw(n_rows) = p.get_n_rows();
Chris@49 2122 access::rw(n_cols) = p.get_n_cols();
Chris@49 2123 access::rw(n_elem) = p.get_n_elem();
Chris@49 2124
Chris@49 2125 init_cold();
Chris@49 2126 fill(eT(0));
Chris@49 2127
Chris@49 2128 typename SpProxy<T1>::const_iterator_type it = p.begin();
Chris@49 2129 typename SpProxy<T1>::const_iterator_type it_end = p.end();
Chris@49 2130
Chris@49 2131 while(it != it_end)
Chris@49 2132 {
Chris@49 2133 at(it.row(), it.col()) = (*it);
Chris@49 2134 ++it;
Chris@49 2135 }
Chris@49 2136 }
Chris@49 2137
Chris@49 2138
Chris@49 2139
Chris@49 2140 template<typename eT>
Chris@49 2141 template<typename T1>
Chris@49 2142 inline
Chris@49 2143 const Mat<eT>&
Chris@49 2144 Mat<eT>::operator=(const SpBase<eT, T1>& m)
Chris@49 2145 {
Chris@49 2146 arma_extra_debug_sigprint();
Chris@49 2147
Chris@49 2148 const SpProxy<T1> p(m.get_ref());
Chris@49 2149
Chris@49 2150 init_warm(p.get_n_rows(), p.get_n_cols());
Chris@49 2151
Chris@49 2152 fill(eT(0));
Chris@49 2153
Chris@49 2154 typename SpProxy<T1>::const_iterator_type it = p.begin();
Chris@49 2155 typename SpProxy<T1>::const_iterator_type it_end = p.end();
Chris@49 2156
Chris@49 2157 while(it != it_end)
Chris@49 2158 {
Chris@49 2159 at(it.row(), it.col()) = (*it);
Chris@49 2160 ++it;
Chris@49 2161 }
Chris@49 2162
Chris@49 2163 return *this;
Chris@49 2164 }
Chris@49 2165
Chris@49 2166
Chris@49 2167
Chris@49 2168 template<typename eT>
Chris@49 2169 template<typename T1>
Chris@49 2170 inline
Chris@49 2171 const Mat<eT>&
Chris@49 2172 Mat<eT>::operator+=(const SpBase<eT, T1>& m)
Chris@49 2173 {
Chris@49 2174 arma_extra_debug_sigprint();
Chris@49 2175
Chris@49 2176 const SpProxy<T1> p(m.get_ref());
Chris@49 2177
Chris@49 2178 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "addition");
Chris@49 2179
Chris@49 2180 typename SpProxy<T1>::const_iterator_type it = p.begin();
Chris@49 2181 typename SpProxy<T1>::const_iterator_type it_end = p.end();
Chris@49 2182
Chris@49 2183 while(it != it_end)
Chris@49 2184 {
Chris@49 2185 at(it.row(), it.col()) += (*it);
Chris@49 2186 ++it;
Chris@49 2187 }
Chris@49 2188
Chris@49 2189 return *this;
Chris@49 2190 }
Chris@49 2191
Chris@49 2192
Chris@49 2193
Chris@49 2194 template<typename eT>
Chris@49 2195 template<typename T1>
Chris@49 2196 inline
Chris@49 2197 const Mat<eT>&
Chris@49 2198 Mat<eT>::operator-=(const SpBase<eT, T1>& m)
Chris@49 2199 {
Chris@49 2200 arma_extra_debug_sigprint();
Chris@49 2201
Chris@49 2202 const SpProxy<T1> p(m.get_ref());
Chris@49 2203
Chris@49 2204 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "subtraction");
Chris@49 2205
Chris@49 2206 typename SpProxy<T1>::const_iterator_type it = p.begin();
Chris@49 2207 typename SpProxy<T1>::const_iterator_type it_end = p.end();
Chris@49 2208
Chris@49 2209 while(it != it_end)
Chris@49 2210 {
Chris@49 2211 at(it.row(), it.col()) -= (*it);
Chris@49 2212 ++it;
Chris@49 2213 }
Chris@49 2214
Chris@49 2215 return *this;
Chris@49 2216 }
Chris@49 2217
Chris@49 2218
Chris@49 2219
Chris@49 2220 template<typename eT>
Chris@49 2221 template<typename T1>
Chris@49 2222 inline
Chris@49 2223 const Mat<eT>&
Chris@49 2224 Mat<eT>::operator*=(const SpBase<eT, T1>& m)
Chris@49 2225 {
Chris@49 2226 arma_extra_debug_sigprint();
Chris@49 2227
Chris@49 2228 Mat<eT> z;
Chris@49 2229 z = (*this) * m.get_ref();
Chris@49 2230 steal_mem(z);
Chris@49 2231
Chris@49 2232 return *this;
Chris@49 2233 }
Chris@49 2234
Chris@49 2235
Chris@49 2236
Chris@49 2237 template<typename eT>
Chris@49 2238 template<typename T1>
Chris@49 2239 inline
Chris@49 2240 const Mat<eT>&
Chris@49 2241 Mat<eT>::operator%=(const SpBase<eT, T1>& m)
Chris@49 2242 {
Chris@49 2243 arma_extra_debug_sigprint();
Chris@49 2244
Chris@49 2245 const SpProxy<T1> p(m.get_ref());
Chris@49 2246
Chris@49 2247 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise multiplication");
Chris@49 2248
Chris@49 2249 typename SpProxy<T1>::const_iterator_type it = p.begin();
Chris@49 2250 typename SpProxy<T1>::const_iterator_type it_end = p.end();
Chris@49 2251
Chris@49 2252 // We have to zero everything that isn't being used.
Chris@49 2253 arrayops::inplace_set(memptr(), eT(0), (it.col() * n_rows) + it.row());
Chris@49 2254
Chris@49 2255 while(it != it_end)
Chris@49 2256 {
Chris@49 2257 const uword cur_loc = (it.col() * n_rows) + it.row();
Chris@49 2258
Chris@49 2259 access::rw(mem[cur_loc]) *= (*it);
Chris@49 2260
Chris@49 2261 ++it;
Chris@49 2262
Chris@49 2263 const uword next_loc = (it == it_end)
Chris@49 2264 ? (p.get_n_cols() * n_rows)
Chris@49 2265 : (it.col() * n_rows) + it.row();
Chris@49 2266
Chris@49 2267 arrayops::inplace_set(memptr() + cur_loc + 1, eT(0), (next_loc - cur_loc - 1));
Chris@49 2268 }
Chris@49 2269
Chris@49 2270 return *this;
Chris@49 2271 }
Chris@49 2272
Chris@49 2273
Chris@49 2274
Chris@49 2275 template<typename eT>
Chris@49 2276 template<typename T1>
Chris@49 2277 inline
Chris@49 2278 const Mat<eT>&
Chris@49 2279 Mat<eT>::operator/=(const SpBase<eT, T1>& m)
Chris@49 2280 {
Chris@49 2281 arma_extra_debug_sigprint();
Chris@49 2282
Chris@49 2283 const SpProxy<T1> p(m.get_ref());
Chris@49 2284
Chris@49 2285 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise division");
Chris@49 2286
Chris@49 2287 // If you use this method, you are probably stupid or misguided, but for completeness it is implemented.
Chris@49 2288 // Unfortunately the best way to do this is loop over every element.
Chris@49 2289 for(uword c = 0; c < n_cols; ++c)
Chris@49 2290 for(uword r = 0; r < n_rows; ++r)
Chris@49 2291 {
Chris@49 2292 at(r, c) /= p.at(r, c);
Chris@49 2293 }
Chris@49 2294
Chris@49 2295 return *this;
Chris@49 2296 }
Chris@49 2297
Chris@49 2298
Chris@49 2299
Chris@49 2300 template<typename eT>
Chris@49 2301 inline
Chris@49 2302 mat_injector< Mat<eT> >
Chris@49 2303 Mat<eT>::operator<<(const eT val)
Chris@49 2304 {
Chris@49 2305 return mat_injector< Mat<eT> >(*this, val);
Chris@49 2306 }
Chris@49 2307
Chris@49 2308
Chris@49 2309
Chris@49 2310 template<typename eT>
Chris@49 2311 inline
Chris@49 2312 mat_injector< Mat<eT> >
Chris@49 2313 Mat<eT>::operator<<(const injector_end_of_row<>& x)
Chris@49 2314 {
Chris@49 2315 return mat_injector< Mat<eT> >(*this, x);
Chris@49 2316 }
Chris@49 2317
Chris@49 2318
Chris@49 2319
Chris@49 2320 //! creation of subview (row vector)
Chris@49 2321 template<typename eT>
Chris@49 2322 arma_inline
Chris@49 2323 subview_row<eT>
Chris@49 2324 Mat<eT>::row(const uword row_num)
Chris@49 2325 {
Chris@49 2326 arma_extra_debug_sigprint();
Chris@49 2327
Chris@49 2328 arma_debug_check( row_num >= n_rows, "Mat::row(): index out of bounds" );
Chris@49 2329
Chris@49 2330 return subview_row<eT>(*this, row_num);
Chris@49 2331 }
Chris@49 2332
Chris@49 2333
Chris@49 2334
Chris@49 2335 //! creation of subview (row vector)
Chris@49 2336 template<typename eT>
Chris@49 2337 arma_inline
Chris@49 2338 const subview_row<eT>
Chris@49 2339 Mat<eT>::row(const uword row_num) const
Chris@49 2340 {
Chris@49 2341 arma_extra_debug_sigprint();
Chris@49 2342
Chris@49 2343 arma_debug_check( row_num >= n_rows, "Mat::row(): index out of bounds" );
Chris@49 2344
Chris@49 2345 return subview_row<eT>(*this, row_num);
Chris@49 2346 }
Chris@49 2347
Chris@49 2348
Chris@49 2349
Chris@49 2350 template<typename eT>
Chris@49 2351 inline
Chris@49 2352 subview_row<eT>
Chris@49 2353 Mat<eT>::operator()(const uword row_num, const span& col_span)
Chris@49 2354 {
Chris@49 2355 arma_extra_debug_sigprint();
Chris@49 2356
Chris@49 2357 const bool col_all = col_span.whole;
Chris@49 2358
Chris@49 2359 const uword local_n_cols = n_cols;
Chris@49 2360
Chris@49 2361 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 2362 const uword in_col2 = col_span.b;
Chris@49 2363 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 2364
Chris@49 2365 arma_debug_check
Chris@49 2366 (
Chris@49 2367 (row_num >= n_rows)
Chris@49 2368 ||
Chris@49 2369 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 2370 ,
Chris@49 2371 "Mat::operator(): indices out of bounds or incorrectly used"
Chris@49 2372 );
Chris@49 2373
Chris@49 2374 return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);
Chris@49 2375 }
Chris@49 2376
Chris@49 2377
Chris@49 2378
Chris@49 2379 template<typename eT>
Chris@49 2380 inline
Chris@49 2381 const subview_row<eT>
Chris@49 2382 Mat<eT>::operator()(const uword row_num, const span& col_span) const
Chris@49 2383 {
Chris@49 2384 arma_extra_debug_sigprint();
Chris@49 2385
Chris@49 2386 const bool col_all = col_span.whole;
Chris@49 2387
Chris@49 2388 const uword local_n_cols = n_cols;
Chris@49 2389
Chris@49 2390 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 2391 const uword in_col2 = col_span.b;
Chris@49 2392 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 2393
Chris@49 2394 arma_debug_check
Chris@49 2395 (
Chris@49 2396 (row_num >= n_rows)
Chris@49 2397 ||
Chris@49 2398 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 2399 ,
Chris@49 2400 "Mat::operator(): indices out of bounds or incorrectly used"
Chris@49 2401 );
Chris@49 2402
Chris@49 2403 return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);
Chris@49 2404 }
Chris@49 2405
Chris@49 2406
Chris@49 2407
Chris@49 2408 //! creation of subview (column vector)
Chris@49 2409 template<typename eT>
Chris@49 2410 arma_inline
Chris@49 2411 subview_col<eT>
Chris@49 2412 Mat<eT>::col(const uword col_num)
Chris@49 2413 {
Chris@49 2414 arma_extra_debug_sigprint();
Chris@49 2415
Chris@49 2416 arma_debug_check( col_num >= n_cols, "Mat::col(): index out of bounds");
Chris@49 2417
Chris@49 2418 return subview_col<eT>(*this, col_num);
Chris@49 2419 }
Chris@49 2420
Chris@49 2421
Chris@49 2422
Chris@49 2423 //! creation of subview (column vector)
Chris@49 2424 template<typename eT>
Chris@49 2425 arma_inline
Chris@49 2426 const subview_col<eT>
Chris@49 2427 Mat<eT>::col(const uword col_num) const
Chris@49 2428 {
Chris@49 2429 arma_extra_debug_sigprint();
Chris@49 2430
Chris@49 2431 arma_debug_check( col_num >= n_cols, "Mat::col(): index out of bounds");
Chris@49 2432
Chris@49 2433 return subview_col<eT>(*this, col_num);
Chris@49 2434 }
Chris@49 2435
Chris@49 2436
Chris@49 2437
Chris@49 2438 template<typename eT>
Chris@49 2439 inline
Chris@49 2440 subview_col<eT>
Chris@49 2441 Mat<eT>::operator()(const span& row_span, const uword col_num)
Chris@49 2442 {
Chris@49 2443 arma_extra_debug_sigprint();
Chris@49 2444
Chris@49 2445 const bool row_all = row_span.whole;
Chris@49 2446
Chris@49 2447 const uword local_n_rows = n_rows;
Chris@49 2448
Chris@49 2449 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 2450 const uword in_row2 = row_span.b;
Chris@49 2451 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 2452
Chris@49 2453 arma_debug_check
Chris@49 2454 (
Chris@49 2455 (col_num >= n_cols)
Chris@49 2456 ||
Chris@49 2457 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 2458 ,
Chris@49 2459 "Mat::operator(): indices out of bounds or incorrectly used"
Chris@49 2460 );
Chris@49 2461
Chris@49 2462 return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);
Chris@49 2463 }
Chris@49 2464
Chris@49 2465
Chris@49 2466
Chris@49 2467 template<typename eT>
Chris@49 2468 inline
Chris@49 2469 const subview_col<eT>
Chris@49 2470 Mat<eT>::operator()(const span& row_span, const uword col_num) const
Chris@49 2471 {
Chris@49 2472 arma_extra_debug_sigprint();
Chris@49 2473
Chris@49 2474 const bool row_all = row_span.whole;
Chris@49 2475
Chris@49 2476 const uword local_n_rows = n_rows;
Chris@49 2477
Chris@49 2478 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 2479 const uword in_row2 = row_span.b;
Chris@49 2480 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 2481
Chris@49 2482 arma_debug_check
Chris@49 2483 (
Chris@49 2484 (col_num >= n_cols)
Chris@49 2485 ||
Chris@49 2486 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 2487 ,
Chris@49 2488 "Mat::operator(): indices out of bounds or incorrectly used"
Chris@49 2489 );
Chris@49 2490
Chris@49 2491 return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);
Chris@49 2492 }
Chris@49 2493
Chris@49 2494
Chris@49 2495
Chris@49 2496 //! create a Col object which uses memory from an existing matrix object.
Chris@49 2497 //! this approach is currently not alias safe
Chris@49 2498 //! and does not take into account that the parent matrix object could be deleted.
Chris@49 2499 //! if deleted memory is accessed by the created Col object,
Chris@49 2500 //! it will cause memory corruption and/or a crash
Chris@49 2501 template<typename eT>
Chris@49 2502 inline
Chris@49 2503 Col<eT>
Chris@49 2504 Mat<eT>::unsafe_col(const uword col_num)
Chris@49 2505 {
Chris@49 2506 arma_extra_debug_sigprint();
Chris@49 2507
Chris@49 2508 arma_debug_check( col_num >= n_cols, "Mat::unsafe_col(): index out of bounds");
Chris@49 2509
Chris@49 2510 return Col<eT>(colptr(col_num), n_rows, false, true);
Chris@49 2511 }
Chris@49 2512
Chris@49 2513
Chris@49 2514
Chris@49 2515 //! create a Col object which uses memory from an existing matrix object.
Chris@49 2516 //! this approach is currently not alias safe
Chris@49 2517 //! and does not take into account that the parent matrix object could be deleted.
Chris@49 2518 //! if deleted memory is accessed by the created Col object,
Chris@49 2519 //! it will cause memory corruption and/or a crash
Chris@49 2520 template<typename eT>
Chris@49 2521 inline
Chris@49 2522 const Col<eT>
Chris@49 2523 Mat<eT>::unsafe_col(const uword col_num) const
Chris@49 2524 {
Chris@49 2525 arma_extra_debug_sigprint();
Chris@49 2526
Chris@49 2527 arma_debug_check( col_num >= n_cols, "Mat::unsafe_col(): index out of bounds");
Chris@49 2528
Chris@49 2529 typedef const Col<eT> out_type;
Chris@49 2530
Chris@49 2531 return out_type(const_cast<eT*>(colptr(col_num)), n_rows, false, true);
Chris@49 2532 }
Chris@49 2533
Chris@49 2534
Chris@49 2535
Chris@49 2536 //! creation of subview (submatrix comprised of specified row vectors)
Chris@49 2537 template<typename eT>
Chris@49 2538 arma_inline
Chris@49 2539 subview<eT>
Chris@49 2540 Mat<eT>::rows(const uword in_row1, const uword in_row2)
Chris@49 2541 {
Chris@49 2542 arma_extra_debug_sigprint();
Chris@49 2543
Chris@49 2544 arma_debug_check
Chris@49 2545 (
Chris@49 2546 (in_row1 > in_row2) || (in_row2 >= n_rows),
Chris@49 2547 "Mat::rows(): indices out of bounds or incorrectly used"
Chris@49 2548 );
Chris@49 2549
Chris@49 2550 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2551
Chris@49 2552 return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );
Chris@49 2553 }
Chris@49 2554
Chris@49 2555
Chris@49 2556
Chris@49 2557 //! creation of subview (submatrix comprised of specified row vectors)
Chris@49 2558 template<typename eT>
Chris@49 2559 arma_inline
Chris@49 2560 const subview<eT>
Chris@49 2561 Mat<eT>::rows(const uword in_row1, const uword in_row2) const
Chris@49 2562 {
Chris@49 2563 arma_extra_debug_sigprint();
Chris@49 2564
Chris@49 2565 arma_debug_check
Chris@49 2566 (
Chris@49 2567 (in_row1 > in_row2) || (in_row2 >= n_rows),
Chris@49 2568 "Mat::rows(): indices out of bounds or incorrectly used"
Chris@49 2569 );
Chris@49 2570
Chris@49 2571 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2572
Chris@49 2573 return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );
Chris@49 2574 }
Chris@49 2575
Chris@49 2576
Chris@49 2577
Chris@49 2578 //! creation of subview (submatrix comprised of specified column vectors)
Chris@49 2579 template<typename eT>
Chris@49 2580 arma_inline
Chris@49 2581 subview<eT>
Chris@49 2582 Mat<eT>::cols(const uword in_col1, const uword in_col2)
Chris@49 2583 {
Chris@49 2584 arma_extra_debug_sigprint();
Chris@49 2585
Chris@49 2586 arma_debug_check
Chris@49 2587 (
Chris@49 2588 (in_col1 > in_col2) || (in_col2 >= n_cols),
Chris@49 2589 "Mat::cols(): indices out of bounds or incorrectly used"
Chris@49 2590 );
Chris@49 2591
Chris@49 2592 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2593
Chris@49 2594 return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);
Chris@49 2595 }
Chris@49 2596
Chris@49 2597
Chris@49 2598
Chris@49 2599 //! creation of subview (submatrix comprised of specified column vectors)
Chris@49 2600 template<typename eT>
Chris@49 2601 arma_inline
Chris@49 2602 const subview<eT>
Chris@49 2603 Mat<eT>::cols(const uword in_col1, const uword in_col2) const
Chris@49 2604 {
Chris@49 2605 arma_extra_debug_sigprint();
Chris@49 2606
Chris@49 2607 arma_debug_check
Chris@49 2608 (
Chris@49 2609 (in_col1 > in_col2) || (in_col2 >= n_cols),
Chris@49 2610 "Mat::cols(): indices out of bounds or incorrectly used"
Chris@49 2611 );
Chris@49 2612
Chris@49 2613 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2614
Chris@49 2615 return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);
Chris@49 2616 }
Chris@49 2617
Chris@49 2618
Chris@49 2619
Chris@49 2620 //! creation of subview (submatrix)
Chris@49 2621 template<typename eT>
Chris@49 2622 arma_inline
Chris@49 2623 subview<eT>
Chris@49 2624 Mat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)
Chris@49 2625 {
Chris@49 2626 arma_extra_debug_sigprint();
Chris@49 2627
Chris@49 2628 arma_debug_check
Chris@49 2629 (
Chris@49 2630 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
Chris@49 2631 "Mat::submat(): indices out of bounds or incorrectly used"
Chris@49 2632 );
Chris@49 2633
Chris@49 2634 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2635 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2636
Chris@49 2637 return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);
Chris@49 2638 }
Chris@49 2639
Chris@49 2640
Chris@49 2641
Chris@49 2642 //! creation of subview (generic submatrix)
Chris@49 2643 template<typename eT>
Chris@49 2644 arma_inline
Chris@49 2645 const subview<eT>
Chris@49 2646 Mat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const
Chris@49 2647 {
Chris@49 2648 arma_extra_debug_sigprint();
Chris@49 2649
Chris@49 2650 arma_debug_check
Chris@49 2651 (
Chris@49 2652 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
Chris@49 2653 "Mat::submat(): indices out of bounds or incorrectly used"
Chris@49 2654 );
Chris@49 2655
Chris@49 2656 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 2657 const uword subview_n_cols = in_col2 - in_col1 + 1;
Chris@49 2658
Chris@49 2659 return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);
Chris@49 2660 }
Chris@49 2661
Chris@49 2662
Chris@49 2663
Chris@49 2664 //! creation of subview (submatrix)
Chris@49 2665 template<typename eT>
Chris@49 2666 inline
Chris@49 2667 subview<eT>
Chris@49 2668 Mat<eT>::submat(const span& row_span, const span& col_span)
Chris@49 2669 {
Chris@49 2670 arma_extra_debug_sigprint();
Chris@49 2671
Chris@49 2672 const bool row_all = row_span.whole;
Chris@49 2673 const bool col_all = col_span.whole;
Chris@49 2674
Chris@49 2675 const uword local_n_rows = n_rows;
Chris@49 2676 const uword local_n_cols = n_cols;
Chris@49 2677
Chris@49 2678 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 2679 const uword in_row2 = row_span.b;
Chris@49 2680 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 2681
Chris@49 2682 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 2683 const uword in_col2 = col_span.b;
Chris@49 2684 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 2685
Chris@49 2686 arma_debug_check
Chris@49 2687 (
Chris@49 2688 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 2689 ||
Chris@49 2690 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 2691 ,
Chris@49 2692 "Mat::submat(): indices out of bounds or incorrectly used"
Chris@49 2693 );
Chris@49 2694
Chris@49 2695 return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);
Chris@49 2696 }
Chris@49 2697
Chris@49 2698
Chris@49 2699
Chris@49 2700 //! creation of subview (generic submatrix)
Chris@49 2701 template<typename eT>
Chris@49 2702 inline
Chris@49 2703 const subview<eT>
Chris@49 2704 Mat<eT>::submat(const span& row_span, const span& col_span) const
Chris@49 2705 {
Chris@49 2706 arma_extra_debug_sigprint();
Chris@49 2707
Chris@49 2708 const bool row_all = row_span.whole;
Chris@49 2709 const bool col_all = col_span.whole;
Chris@49 2710
Chris@49 2711 const uword local_n_rows = n_rows;
Chris@49 2712 const uword local_n_cols = n_cols;
Chris@49 2713
Chris@49 2714 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 2715 const uword in_row2 = row_span.b;
Chris@49 2716 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 2717
Chris@49 2718 const uword in_col1 = col_all ? 0 : col_span.a;
Chris@49 2719 const uword in_col2 = col_span.b;
Chris@49 2720 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
Chris@49 2721
Chris@49 2722 arma_debug_check
Chris@49 2723 (
Chris@49 2724 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
Chris@49 2725 ||
Chris@49 2726 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
Chris@49 2727 ,
Chris@49 2728 "Mat::submat(): indices out of bounds or incorrectly used"
Chris@49 2729 );
Chris@49 2730
Chris@49 2731 return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);
Chris@49 2732 }
Chris@49 2733
Chris@49 2734
Chris@49 2735
Chris@49 2736 template<typename eT>
Chris@49 2737 inline
Chris@49 2738 subview<eT>
Chris@49 2739 Mat<eT>::operator()(const span& row_span, const span& col_span)
Chris@49 2740 {
Chris@49 2741 arma_extra_debug_sigprint();
Chris@49 2742
Chris@49 2743 return (*this).submat(row_span, col_span);
Chris@49 2744 }
Chris@49 2745
Chris@49 2746
Chris@49 2747
Chris@49 2748 template<typename eT>
Chris@49 2749 inline
Chris@49 2750 const subview<eT>
Chris@49 2751 Mat<eT>::operator()(const span& row_span, const span& col_span) const
Chris@49 2752 {
Chris@49 2753 arma_extra_debug_sigprint();
Chris@49 2754
Chris@49 2755 return (*this).submat(row_span, col_span);
Chris@49 2756 }
Chris@49 2757
Chris@49 2758
Chris@49 2759
Chris@49 2760 template<typename eT>
Chris@49 2761 template<typename T1>
Chris@49 2762 arma_inline
Chris@49 2763 subview_elem1<eT,T1>
Chris@49 2764 Mat<eT>::elem(const Base<uword,T1>& a)
Chris@49 2765 {
Chris@49 2766 arma_extra_debug_sigprint();
Chris@49 2767
Chris@49 2768 return subview_elem1<eT,T1>(*this, a);
Chris@49 2769 }
Chris@49 2770
Chris@49 2771
Chris@49 2772
Chris@49 2773 template<typename eT>
Chris@49 2774 template<typename T1>
Chris@49 2775 arma_inline
Chris@49 2776 const subview_elem1<eT,T1>
Chris@49 2777 Mat<eT>::elem(const Base<uword,T1>& a) const
Chris@49 2778 {
Chris@49 2779 arma_extra_debug_sigprint();
Chris@49 2780
Chris@49 2781 return subview_elem1<eT,T1>(*this, a);
Chris@49 2782 }
Chris@49 2783
Chris@49 2784
Chris@49 2785
Chris@49 2786 template<typename eT>
Chris@49 2787 template<typename T1>
Chris@49 2788 arma_inline
Chris@49 2789 subview_elem1<eT,T1>
Chris@49 2790 Mat<eT>::operator()(const Base<uword,T1>& a)
Chris@49 2791 {
Chris@49 2792 arma_extra_debug_sigprint();
Chris@49 2793
Chris@49 2794 return subview_elem1<eT,T1>(*this, a);
Chris@49 2795 }
Chris@49 2796
Chris@49 2797
Chris@49 2798
Chris@49 2799 template<typename eT>
Chris@49 2800 template<typename T1>
Chris@49 2801 arma_inline
Chris@49 2802 const subview_elem1<eT,T1>
Chris@49 2803 Mat<eT>::operator()(const Base<uword,T1>& a) const
Chris@49 2804 {
Chris@49 2805 arma_extra_debug_sigprint();
Chris@49 2806
Chris@49 2807 return subview_elem1<eT,T1>(*this, a);
Chris@49 2808 }
Chris@49 2809
Chris@49 2810
Chris@49 2811
Chris@49 2812 template<typename eT>
Chris@49 2813 template<typename T1, typename T2>
Chris@49 2814 arma_inline
Chris@49 2815 subview_elem2<eT,T1,T2>
Chris@49 2816 Mat<eT>::elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci)
Chris@49 2817 {
Chris@49 2818 arma_extra_debug_sigprint();
Chris@49 2819
Chris@49 2820 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
Chris@49 2821 }
Chris@49 2822
Chris@49 2823
Chris@49 2824
Chris@49 2825 template<typename eT>
Chris@49 2826 template<typename T1, typename T2>
Chris@49 2827 arma_inline
Chris@49 2828 const subview_elem2<eT,T1,T2>
Chris@49 2829 Mat<eT>::elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const
Chris@49 2830 {
Chris@49 2831 arma_extra_debug_sigprint();
Chris@49 2832
Chris@49 2833 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
Chris@49 2834 }
Chris@49 2835
Chris@49 2836
Chris@49 2837
Chris@49 2838 template<typename eT>
Chris@49 2839 template<typename T1, typename T2>
Chris@49 2840 arma_inline
Chris@49 2841 subview_elem2<eT,T1,T2>
Chris@49 2842 Mat<eT>::submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci)
Chris@49 2843 {
Chris@49 2844 arma_extra_debug_sigprint();
Chris@49 2845
Chris@49 2846 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
Chris@49 2847 }
Chris@49 2848
Chris@49 2849
Chris@49 2850
Chris@49 2851 template<typename eT>
Chris@49 2852 template<typename T1, typename T2>
Chris@49 2853 arma_inline
Chris@49 2854 const subview_elem2<eT,T1,T2>
Chris@49 2855 Mat<eT>::submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const
Chris@49 2856 {
Chris@49 2857 arma_extra_debug_sigprint();
Chris@49 2858
Chris@49 2859 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
Chris@49 2860 }
Chris@49 2861
Chris@49 2862
Chris@49 2863
Chris@49 2864 template<typename eT>
Chris@49 2865 template<typename T1, typename T2>
Chris@49 2866 arma_inline
Chris@49 2867 subview_elem2<eT,T1,T2>
Chris@49 2868 Mat<eT>::operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci)
Chris@49 2869 {
Chris@49 2870 arma_extra_debug_sigprint();
Chris@49 2871
Chris@49 2872 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
Chris@49 2873 }
Chris@49 2874
Chris@49 2875
Chris@49 2876
Chris@49 2877 template<typename eT>
Chris@49 2878 template<typename T1, typename T2>
Chris@49 2879 arma_inline
Chris@49 2880 const subview_elem2<eT,T1,T2>
Chris@49 2881 Mat<eT>::operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const
Chris@49 2882 {
Chris@49 2883 arma_extra_debug_sigprint();
Chris@49 2884
Chris@49 2885 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
Chris@49 2886 }
Chris@49 2887
Chris@49 2888
Chris@49 2889
Chris@49 2890 template<typename eT>
Chris@49 2891 template<typename T1>
Chris@49 2892 arma_inline
Chris@49 2893 subview_elem2<eT,T1,T1>
Chris@49 2894 Mat<eT>::rows(const Base<uword,T1>& ri)
Chris@49 2895 {
Chris@49 2896 arma_extra_debug_sigprint();
Chris@49 2897
Chris@49 2898 return subview_elem2<eT,T1,T1>(*this, ri, ri, false, true);
Chris@49 2899 }
Chris@49 2900
Chris@49 2901
Chris@49 2902
Chris@49 2903 template<typename eT>
Chris@49 2904 template<typename T1>
Chris@49 2905 arma_inline
Chris@49 2906 const subview_elem2<eT,T1,T1>
Chris@49 2907 Mat<eT>::rows(const Base<uword,T1>& ri) const
Chris@49 2908 {
Chris@49 2909 arma_extra_debug_sigprint();
Chris@49 2910
Chris@49 2911 return subview_elem2<eT,T1,T1>(*this, ri, ri, false, true);
Chris@49 2912 }
Chris@49 2913
Chris@49 2914
Chris@49 2915
Chris@49 2916 template<typename eT>
Chris@49 2917 template<typename T2>
Chris@49 2918 arma_inline
Chris@49 2919 subview_elem2<eT,T2,T2>
Chris@49 2920 Mat<eT>::cols(const Base<uword,T2>& ci)
Chris@49 2921 {
Chris@49 2922 arma_extra_debug_sigprint();
Chris@49 2923
Chris@49 2924 return subview_elem2<eT,T2,T2>(*this, ci, ci, true, false);
Chris@49 2925 }
Chris@49 2926
Chris@49 2927
Chris@49 2928
Chris@49 2929 template<typename eT>
Chris@49 2930 template<typename T2>
Chris@49 2931 arma_inline
Chris@49 2932 const subview_elem2<eT,T2,T2>
Chris@49 2933 Mat<eT>::cols(const Base<uword,T2>& ci) const
Chris@49 2934 {
Chris@49 2935 arma_extra_debug_sigprint();
Chris@49 2936
Chris@49 2937 return subview_elem2<eT,T2,T2>(*this, ci, ci, true, false);
Chris@49 2938 }
Chris@49 2939
Chris@49 2940
Chris@49 2941
Chris@49 2942 template<typename eT>
Chris@49 2943 arma_inline
Chris@49 2944 subview_each1< Mat<eT>, 0 >
Chris@49 2945 Mat<eT>::each_col()
Chris@49 2946 {
Chris@49 2947 arma_extra_debug_sigprint();
Chris@49 2948
Chris@49 2949 return subview_each1< Mat<eT>, 0>(*this);
Chris@49 2950 }
Chris@49 2951
Chris@49 2952
Chris@49 2953
Chris@49 2954 template<typename eT>
Chris@49 2955 arma_inline
Chris@49 2956 subview_each1< Mat<eT>, 1 >
Chris@49 2957 Mat<eT>::each_row()
Chris@49 2958 {
Chris@49 2959 arma_extra_debug_sigprint();
Chris@49 2960
Chris@49 2961 return subview_each1< Mat<eT>, 1>(*this);
Chris@49 2962 }
Chris@49 2963
Chris@49 2964
Chris@49 2965
Chris@49 2966 template<typename eT>
Chris@49 2967 template<typename T1>
Chris@49 2968 inline
Chris@49 2969 subview_each2< Mat<eT>, 0, T1 >
Chris@49 2970 Mat<eT>::each_col(const Base<uword, T1>& indices)
Chris@49 2971 {
Chris@49 2972 arma_extra_debug_sigprint();
Chris@49 2973
Chris@49 2974 return subview_each2< Mat<eT>, 0, T1 >(*this, indices);
Chris@49 2975 }
Chris@49 2976
Chris@49 2977
Chris@49 2978
Chris@49 2979 template<typename eT>
Chris@49 2980 template<typename T1>
Chris@49 2981 inline
Chris@49 2982 subview_each2< Mat<eT>, 1, T1 >
Chris@49 2983 Mat<eT>::each_row(const Base<uword, T1>& indices)
Chris@49 2984 {
Chris@49 2985 arma_extra_debug_sigprint();
Chris@49 2986
Chris@49 2987 return subview_each2< Mat<eT>, 1, T1 >(*this, indices);
Chris@49 2988 }
Chris@49 2989
Chris@49 2990
Chris@49 2991
Chris@49 2992 //! creation of diagview (diagonal)
Chris@49 2993 template<typename eT>
Chris@49 2994 arma_inline
Chris@49 2995 diagview<eT>
Chris@49 2996 Mat<eT>::diag(const sword in_id)
Chris@49 2997 {
Chris@49 2998 arma_extra_debug_sigprint();
Chris@49 2999
Chris@49 3000 const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;
Chris@49 3001 const uword col_offset = (in_id > 0) ? uword( in_id) : 0;
Chris@49 3002
Chris@49 3003 arma_debug_check
Chris@49 3004 (
Chris@49 3005 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
Chris@49 3006 "Mat::diag(): requested diagonal out of bounds"
Chris@49 3007 );
Chris@49 3008
Chris@49 3009 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
Chris@49 3010
Chris@49 3011 return diagview<eT>(*this, row_offset, col_offset, len);
Chris@49 3012 }
Chris@49 3013
Chris@49 3014
Chris@49 3015
Chris@49 3016 //! creation of diagview (diagonal)
Chris@49 3017 template<typename eT>
Chris@49 3018 arma_inline
Chris@49 3019 const diagview<eT>
Chris@49 3020 Mat<eT>::diag(const sword in_id) const
Chris@49 3021 {
Chris@49 3022 arma_extra_debug_sigprint();
Chris@49 3023
Chris@49 3024 const uword row_offset = (in_id < 0) ? -in_id : 0;
Chris@49 3025 const uword col_offset = (in_id > 0) ? in_id : 0;
Chris@49 3026
Chris@49 3027 arma_debug_check
Chris@49 3028 (
Chris@49 3029 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
Chris@49 3030 "Mat::diag(): requested diagonal out of bounds"
Chris@49 3031 );
Chris@49 3032
Chris@49 3033 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
Chris@49 3034
Chris@49 3035 return diagview<eT>(*this, row_offset, col_offset, len);
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 void
Chris@49 3043 Mat<eT>::swap_rows(const uword in_row1, const uword in_row2)
Chris@49 3044 {
Chris@49 3045 arma_extra_debug_sigprint();
Chris@49 3046
Chris@49 3047 const uword local_n_rows = n_rows;
Chris@49 3048 const uword local_n_cols = n_cols;
Chris@49 3049
Chris@49 3050 arma_debug_check
Chris@49 3051 (
Chris@49 3052 (in_row1 >= local_n_rows) || (in_row2 >= local_n_rows),
Chris@49 3053 "Mat::swap_rows(): index out of bounds"
Chris@49 3054 );
Chris@49 3055
Chris@49 3056 if(n_elem > 0)
Chris@49 3057 {
Chris@49 3058 for(uword ucol=0; ucol < local_n_cols; ++ucol)
Chris@49 3059 {
Chris@49 3060 const uword offset = ucol * local_n_rows;
Chris@49 3061 const uword pos1 = in_row1 + offset;
Chris@49 3062 const uword pos2 = in_row2 + offset;
Chris@49 3063
Chris@49 3064 std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) );
Chris@49 3065 }
Chris@49 3066 }
Chris@49 3067 }
Chris@49 3068
Chris@49 3069
Chris@49 3070
Chris@49 3071 template<typename eT>
Chris@49 3072 inline
Chris@49 3073 void
Chris@49 3074 Mat<eT>::swap_cols(const uword in_colA, const uword in_colB)
Chris@49 3075 {
Chris@49 3076 arma_extra_debug_sigprint();
Chris@49 3077
Chris@49 3078 const uword local_n_rows = n_rows;
Chris@49 3079 const uword local_n_cols = n_cols;
Chris@49 3080
Chris@49 3081 arma_debug_check
Chris@49 3082 (
Chris@49 3083 (in_colA >= local_n_cols) || (in_colB >= local_n_cols),
Chris@49 3084 "Mat::swap_cols(): index out of bounds"
Chris@49 3085 );
Chris@49 3086
Chris@49 3087 if(n_elem > 0)
Chris@49 3088 {
Chris@49 3089 eT* ptrA = colptr(in_colA);
Chris@49 3090 eT* ptrB = colptr(in_colB);
Chris@49 3091
Chris@49 3092 eT tmp_i;
Chris@49 3093 eT tmp_j;
Chris@49 3094
Chris@49 3095 uword iq,jq;
Chris@49 3096 for(iq=0, jq=1; jq < local_n_rows; iq+=2, jq+=2)
Chris@49 3097 {
Chris@49 3098 tmp_i = ptrA[iq];
Chris@49 3099 tmp_j = ptrA[jq];
Chris@49 3100
Chris@49 3101 ptrA[iq] = ptrB[iq];
Chris@49 3102 ptrA[jq] = ptrB[jq];
Chris@49 3103
Chris@49 3104 ptrB[iq] = tmp_i;
Chris@49 3105 ptrB[jq] = tmp_j;
Chris@49 3106 }
Chris@49 3107
Chris@49 3108 if(iq < local_n_rows)
Chris@49 3109 {
Chris@49 3110 std::swap( ptrA[iq], ptrB[iq] );
Chris@49 3111 }
Chris@49 3112 }
Chris@49 3113 }
Chris@49 3114
Chris@49 3115
Chris@49 3116
Chris@49 3117 //! remove specified row
Chris@49 3118 template<typename eT>
Chris@49 3119 inline
Chris@49 3120 void
Chris@49 3121 Mat<eT>::shed_row(const uword row_num)
Chris@49 3122 {
Chris@49 3123 arma_extra_debug_sigprint();
Chris@49 3124
Chris@49 3125 arma_debug_check( row_num >= n_rows, "Mat::shed_row(): index out of bounds");
Chris@49 3126
Chris@49 3127 shed_rows(row_num, row_num);
Chris@49 3128 }
Chris@49 3129
Chris@49 3130
Chris@49 3131
Chris@49 3132 //! remove specified column
Chris@49 3133 template<typename eT>
Chris@49 3134 inline
Chris@49 3135 void
Chris@49 3136 Mat<eT>::shed_col(const uword col_num)
Chris@49 3137 {
Chris@49 3138 arma_extra_debug_sigprint();
Chris@49 3139
Chris@49 3140 arma_debug_check( col_num >= n_cols, "Mat::shed_col(): index out of bounds");
Chris@49 3141
Chris@49 3142 shed_cols(col_num, col_num);
Chris@49 3143 }
Chris@49 3144
Chris@49 3145
Chris@49 3146
Chris@49 3147 //! remove specified rows
Chris@49 3148 template<typename eT>
Chris@49 3149 inline
Chris@49 3150 void
Chris@49 3151 Mat<eT>::shed_rows(const uword in_row1, const uword in_row2)
Chris@49 3152 {
Chris@49 3153 arma_extra_debug_sigprint();
Chris@49 3154
Chris@49 3155 arma_debug_check
Chris@49 3156 (
Chris@49 3157 (in_row1 > in_row2) || (in_row2 >= n_rows),
Chris@49 3158 "Mat::shed_rows(): indices out of bounds or incorrectly used"
Chris@49 3159 );
Chris@49 3160
Chris@49 3161 const uword n_keep_front = in_row1;
Chris@49 3162 const uword n_keep_back = n_rows - (in_row2 + 1);
Chris@49 3163
Chris@49 3164 Mat<eT> X(n_keep_front + n_keep_back, n_cols);
Chris@49 3165
Chris@49 3166 if(n_keep_front > 0)
Chris@49 3167 {
Chris@49 3168 X.rows( 0, (n_keep_front-1) ) = rows( 0, (in_row1-1) );
Chris@49 3169 }
Chris@49 3170
Chris@49 3171 if(n_keep_back > 0)
Chris@49 3172 {
Chris@49 3173 X.rows( n_keep_front, (n_keep_front+n_keep_back-1) ) = rows( (in_row2+1), (n_rows-1) );
Chris@49 3174 }
Chris@49 3175
Chris@49 3176 steal_mem(X);
Chris@49 3177 }
Chris@49 3178
Chris@49 3179
Chris@49 3180
Chris@49 3181 //! remove specified columns
Chris@49 3182 template<typename eT>
Chris@49 3183 inline
Chris@49 3184 void
Chris@49 3185 Mat<eT>::shed_cols(const uword in_col1, const uword in_col2)
Chris@49 3186 {
Chris@49 3187 arma_extra_debug_sigprint();
Chris@49 3188
Chris@49 3189 arma_debug_check
Chris@49 3190 (
Chris@49 3191 (in_col1 > in_col2) || (in_col2 >= n_cols),
Chris@49 3192 "Mat::shed_cols(): indices out of bounds or incorrectly used"
Chris@49 3193 );
Chris@49 3194
Chris@49 3195 const uword n_keep_front = in_col1;
Chris@49 3196 const uword n_keep_back = n_cols - (in_col2 + 1);
Chris@49 3197
Chris@49 3198 Mat<eT> X(n_rows, n_keep_front + n_keep_back);
Chris@49 3199
Chris@49 3200 if(n_keep_front > 0)
Chris@49 3201 {
Chris@49 3202 X.cols( 0, (n_keep_front-1) ) = cols( 0, (in_col1-1) );
Chris@49 3203 }
Chris@49 3204
Chris@49 3205 if(n_keep_back > 0)
Chris@49 3206 {
Chris@49 3207 X.cols( n_keep_front, (n_keep_front+n_keep_back-1) ) = cols( (in_col2+1), (n_cols-1) );
Chris@49 3208 }
Chris@49 3209
Chris@49 3210 steal_mem(X);
Chris@49 3211 }
Chris@49 3212
Chris@49 3213
Chris@49 3214
Chris@49 3215 //! insert N rows at the specified row position,
Chris@49 3216 //! optionally setting the elements of the inserted rows to zero
Chris@49 3217 template<typename eT>
Chris@49 3218 inline
Chris@49 3219 void
Chris@49 3220 Mat<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)
Chris@49 3221 {
Chris@49 3222 arma_extra_debug_sigprint();
Chris@49 3223
Chris@49 3224 const uword t_n_rows = n_rows;
Chris@49 3225 const uword t_n_cols = n_cols;
Chris@49 3226
Chris@49 3227 const uword A_n_rows = row_num;
Chris@49 3228 const uword B_n_rows = t_n_rows - row_num;
Chris@49 3229
Chris@49 3230 // insertion at row_num == n_rows is in effect an append operation
Chris@49 3231 arma_debug_check( (row_num > t_n_rows), "Mat::insert_rows(): index out of bounds");
Chris@49 3232
Chris@49 3233 if(N > 0)
Chris@49 3234 {
Chris@49 3235 Mat<eT> out(t_n_rows + N, t_n_cols);
Chris@49 3236
Chris@49 3237 if(A_n_rows > 0)
Chris@49 3238 {
Chris@49 3239 out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);
Chris@49 3240 }
Chris@49 3241
Chris@49 3242 if(B_n_rows > 0)
Chris@49 3243 {
Chris@49 3244 out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1);
Chris@49 3245 }
Chris@49 3246
Chris@49 3247 if(set_to_zero == true)
Chris@49 3248 {
Chris@49 3249 out.rows(row_num, row_num + N - 1).zeros();
Chris@49 3250 }
Chris@49 3251
Chris@49 3252 steal_mem(out);
Chris@49 3253 }
Chris@49 3254 }
Chris@49 3255
Chris@49 3256
Chris@49 3257
Chris@49 3258 //! insert N columns at the specified column position,
Chris@49 3259 //! optionally setting the elements of the inserted columns to zero
Chris@49 3260 template<typename eT>
Chris@49 3261 inline
Chris@49 3262 void
Chris@49 3263 Mat<eT>::insert_cols(const uword col_num, const uword N, const bool set_to_zero)
Chris@49 3264 {
Chris@49 3265 arma_extra_debug_sigprint();
Chris@49 3266
Chris@49 3267 const uword t_n_rows = n_rows;
Chris@49 3268 const uword t_n_cols = n_cols;
Chris@49 3269
Chris@49 3270 const uword A_n_cols = col_num;
Chris@49 3271 const uword B_n_cols = t_n_cols - col_num;
Chris@49 3272
Chris@49 3273 // insertion at col_num == n_cols is in effect an append operation
Chris@49 3274 arma_debug_check( (col_num > t_n_cols), "Mat::insert_cols(): index out of bounds");
Chris@49 3275
Chris@49 3276 if(N > 0)
Chris@49 3277 {
Chris@49 3278 Mat<eT> out(t_n_rows, t_n_cols + N);
Chris@49 3279
Chris@49 3280 if(A_n_cols > 0)
Chris@49 3281 {
Chris@49 3282 out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);
Chris@49 3283 }
Chris@49 3284
Chris@49 3285 if(B_n_cols > 0)
Chris@49 3286 {
Chris@49 3287 out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1);
Chris@49 3288 }
Chris@49 3289
Chris@49 3290 if(set_to_zero == true)
Chris@49 3291 {
Chris@49 3292 out.cols(col_num, col_num + N - 1).zeros();
Chris@49 3293 }
Chris@49 3294
Chris@49 3295 steal_mem(out);
Chris@49 3296 }
Chris@49 3297 }
Chris@49 3298
Chris@49 3299
Chris@49 3300
Chris@49 3301 //! insert the given object at the specified row position;
Chris@49 3302 //! the given object must have the same number of columns as the matrix
Chris@49 3303 template<typename eT>
Chris@49 3304 template<typename T1>
Chris@49 3305 inline
Chris@49 3306 void
Chris@49 3307 Mat<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)
Chris@49 3308 {
Chris@49 3309 arma_extra_debug_sigprint();
Chris@49 3310
Chris@49 3311 const unwrap<T1> tmp(X.get_ref());
Chris@49 3312 const Mat<eT>& C = tmp.M;
Chris@49 3313
Chris@49 3314 const uword C_n_rows = C.n_rows;
Chris@49 3315 const uword C_n_cols = C.n_cols;
Chris@49 3316
Chris@49 3317 const uword t_n_rows = n_rows;
Chris@49 3318 const uword t_n_cols = n_cols;
Chris@49 3319
Chris@49 3320 const uword A_n_rows = row_num;
Chris@49 3321 const uword B_n_rows = t_n_rows - row_num;
Chris@49 3322
Chris@49 3323 bool err_state = false;
Chris@49 3324 char* err_msg = 0;
Chris@49 3325
Chris@49 3326 // insertion at row_num == n_rows is in effect an append operation
Chris@49 3327
Chris@49 3328 arma_debug_set_error
Chris@49 3329 (
Chris@49 3330 err_state,
Chris@49 3331 err_msg,
Chris@49 3332 (row_num > t_n_rows),
Chris@49 3333 "Mat::insert_rows(): index out of bounds"
Chris@49 3334 );
Chris@49 3335
Chris@49 3336 arma_debug_set_error
Chris@49 3337 (
Chris@49 3338 err_state,
Chris@49 3339 err_msg,
Chris@49 3340 ( (C_n_cols != t_n_cols) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),
Chris@49 3341 "Mat::insert_rows(): given object has an incompatible number of columns"
Chris@49 3342 );
Chris@49 3343
Chris@49 3344 arma_debug_check(err_state, err_msg);
Chris@49 3345
Chris@49 3346 if(C_n_rows > 0)
Chris@49 3347 {
Chris@49 3348 Mat<eT> out( t_n_rows + C_n_rows, (std::max)(t_n_cols, C_n_cols) );
Chris@49 3349
Chris@49 3350 if(t_n_cols > 0)
Chris@49 3351 {
Chris@49 3352 if(A_n_rows > 0)
Chris@49 3353 {
Chris@49 3354 out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);
Chris@49 3355 }
Chris@49 3356
Chris@49 3357 if( (t_n_cols > 0) && (B_n_rows > 0) )
Chris@49 3358 {
Chris@49 3359 out.rows(row_num + C_n_rows, t_n_rows + C_n_rows - 1) = rows(row_num, t_n_rows - 1);
Chris@49 3360 }
Chris@49 3361 }
Chris@49 3362
Chris@49 3363 if(C_n_cols > 0)
Chris@49 3364 {
Chris@49 3365 out.rows(row_num, row_num + C_n_rows - 1) = C;
Chris@49 3366 }
Chris@49 3367
Chris@49 3368 steal_mem(out);
Chris@49 3369 }
Chris@49 3370 }
Chris@49 3371
Chris@49 3372
Chris@49 3373
Chris@49 3374 //! insert the given object at the specified column position;
Chris@49 3375 //! the given object must have the same number of rows as the matrix
Chris@49 3376 template<typename eT>
Chris@49 3377 template<typename T1>
Chris@49 3378 inline
Chris@49 3379 void
Chris@49 3380 Mat<eT>::insert_cols(const uword col_num, const Base<eT,T1>& X)
Chris@49 3381 {
Chris@49 3382 arma_extra_debug_sigprint();
Chris@49 3383
Chris@49 3384 const unwrap<T1> tmp(X.get_ref());
Chris@49 3385 const Mat<eT>& C = tmp.M;
Chris@49 3386
Chris@49 3387 const uword C_n_rows = C.n_rows;
Chris@49 3388 const uword C_n_cols = C.n_cols;
Chris@49 3389
Chris@49 3390 const uword t_n_rows = n_rows;
Chris@49 3391 const uword t_n_cols = n_cols;
Chris@49 3392
Chris@49 3393 const uword A_n_cols = col_num;
Chris@49 3394 const uword B_n_cols = t_n_cols - col_num;
Chris@49 3395
Chris@49 3396 bool err_state = false;
Chris@49 3397 char* err_msg = 0;
Chris@49 3398
Chris@49 3399 // insertion at col_num == n_cols is in effect an append operation
Chris@49 3400
Chris@49 3401 arma_debug_set_error
Chris@49 3402 (
Chris@49 3403 err_state,
Chris@49 3404 err_msg,
Chris@49 3405 (col_num > t_n_cols),
Chris@49 3406 "Mat::insert_cols(): index out of bounds"
Chris@49 3407 );
Chris@49 3408
Chris@49 3409 arma_debug_set_error
Chris@49 3410 (
Chris@49 3411 err_state,
Chris@49 3412 err_msg,
Chris@49 3413 ( (C_n_rows != t_n_rows) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),
Chris@49 3414 "Mat::insert_cols(): given object has an incompatible number of rows"
Chris@49 3415 );
Chris@49 3416
Chris@49 3417 arma_debug_check(err_state, err_msg);
Chris@49 3418
Chris@49 3419 if(C_n_cols > 0)
Chris@49 3420 {
Chris@49 3421 Mat<eT> out( (std::max)(t_n_rows, C_n_rows), t_n_cols + C_n_cols );
Chris@49 3422
Chris@49 3423 if(t_n_rows > 0)
Chris@49 3424 {
Chris@49 3425 if(A_n_cols > 0)
Chris@49 3426 {
Chris@49 3427 out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);
Chris@49 3428 }
Chris@49 3429
Chris@49 3430 if(B_n_cols > 0)
Chris@49 3431 {
Chris@49 3432 out.cols(col_num + C_n_cols, t_n_cols + C_n_cols - 1) = cols(col_num, t_n_cols - 1);
Chris@49 3433 }
Chris@49 3434 }
Chris@49 3435
Chris@49 3436 if(C_n_rows > 0)
Chris@49 3437 {
Chris@49 3438 out.cols(col_num, col_num + C_n_cols - 1) = C;
Chris@49 3439 }
Chris@49 3440
Chris@49 3441 steal_mem(out);
Chris@49 3442 }
Chris@49 3443 }
Chris@49 3444
Chris@49 3445
Chris@49 3446
Chris@49 3447 template<typename eT>
Chris@49 3448 template<typename T1, typename gen_type>
Chris@49 3449 inline
Chris@49 3450 Mat<eT>::Mat(const Gen<T1, gen_type>& X)
Chris@49 3451 : n_rows(X.n_rows)
Chris@49 3452 , n_cols(X.n_cols)
Chris@49 3453 , n_elem(n_rows*n_cols)
Chris@49 3454 , vec_state(0)
Chris@49 3455 , mem_state(0)
Chris@49 3456 , mem()
Chris@49 3457 {
Chris@49 3458 arma_extra_debug_sigprint_this(this);
Chris@49 3459
Chris@49 3460 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3461
Chris@49 3462 init_cold();
Chris@49 3463
Chris@49 3464 X.apply(*this);
Chris@49 3465 }
Chris@49 3466
Chris@49 3467
Chris@49 3468
Chris@49 3469 template<typename eT>
Chris@49 3470 template<typename T1, typename gen_type>
Chris@49 3471 inline
Chris@49 3472 const Mat<eT>&
Chris@49 3473 Mat<eT>::operator=(const Gen<T1, gen_type>& X)
Chris@49 3474 {
Chris@49 3475 arma_extra_debug_sigprint();
Chris@49 3476
Chris@49 3477 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3478
Chris@49 3479 init_warm(X.n_rows, X.n_cols);
Chris@49 3480
Chris@49 3481 X.apply(*this);
Chris@49 3482
Chris@49 3483 return *this;
Chris@49 3484 }
Chris@49 3485
Chris@49 3486
Chris@49 3487
Chris@49 3488 template<typename eT>
Chris@49 3489 template<typename T1, typename gen_type>
Chris@49 3490 inline
Chris@49 3491 const Mat<eT>&
Chris@49 3492 Mat<eT>::operator+=(const Gen<T1, gen_type>& X)
Chris@49 3493 {
Chris@49 3494 arma_extra_debug_sigprint();
Chris@49 3495
Chris@49 3496 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3497
Chris@49 3498 X.apply_inplace_plus(*this);
Chris@49 3499
Chris@49 3500 return *this;
Chris@49 3501 }
Chris@49 3502
Chris@49 3503
Chris@49 3504
Chris@49 3505 template<typename eT>
Chris@49 3506 template<typename T1, typename gen_type>
Chris@49 3507 inline
Chris@49 3508 const Mat<eT>&
Chris@49 3509 Mat<eT>::operator-=(const Gen<T1, gen_type>& X)
Chris@49 3510 {
Chris@49 3511 arma_extra_debug_sigprint();
Chris@49 3512
Chris@49 3513 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3514
Chris@49 3515 X.apply_inplace_minus(*this);
Chris@49 3516
Chris@49 3517 return *this;
Chris@49 3518 }
Chris@49 3519
Chris@49 3520
Chris@49 3521
Chris@49 3522 template<typename eT>
Chris@49 3523 template<typename T1, typename gen_type>
Chris@49 3524 inline
Chris@49 3525 const Mat<eT>&
Chris@49 3526 Mat<eT>::operator*=(const Gen<T1, gen_type>& X)
Chris@49 3527 {
Chris@49 3528 arma_extra_debug_sigprint();
Chris@49 3529
Chris@49 3530 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3531
Chris@49 3532 const Mat<eT> tmp(X);
Chris@49 3533
Chris@49 3534 return (*this).operator*=(tmp);
Chris@49 3535 }
Chris@49 3536
Chris@49 3537
Chris@49 3538
Chris@49 3539 template<typename eT>
Chris@49 3540 template<typename T1, typename gen_type>
Chris@49 3541 inline
Chris@49 3542 const Mat<eT>&
Chris@49 3543 Mat<eT>::operator%=(const Gen<T1, gen_type>& X)
Chris@49 3544 {
Chris@49 3545 arma_extra_debug_sigprint();
Chris@49 3546
Chris@49 3547 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3548
Chris@49 3549 X.apply_inplace_schur(*this);
Chris@49 3550
Chris@49 3551 return *this;
Chris@49 3552 }
Chris@49 3553
Chris@49 3554
Chris@49 3555
Chris@49 3556 template<typename eT>
Chris@49 3557 template<typename T1, typename gen_type>
Chris@49 3558 inline
Chris@49 3559 const Mat<eT>&
Chris@49 3560 Mat<eT>::operator/=(const Gen<T1, gen_type>& X)
Chris@49 3561 {
Chris@49 3562 arma_extra_debug_sigprint();
Chris@49 3563
Chris@49 3564 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3565
Chris@49 3566 X.apply_inplace_div(*this);
Chris@49 3567
Chris@49 3568 return *this;
Chris@49 3569 }
Chris@49 3570
Chris@49 3571
Chris@49 3572
Chris@49 3573 //! create a matrix from Op, i.e. run the previously delayed unary operations
Chris@49 3574 template<typename eT>
Chris@49 3575 template<typename T1, typename op_type>
Chris@49 3576 inline
Chris@49 3577 Mat<eT>::Mat(const Op<T1, op_type>& X)
Chris@49 3578 : n_rows(0)
Chris@49 3579 , n_cols(0)
Chris@49 3580 , n_elem(0)
Chris@49 3581 , vec_state(0)
Chris@49 3582 , mem_state(0)
Chris@49 3583 , mem()
Chris@49 3584 {
Chris@49 3585 arma_extra_debug_sigprint_this(this);
Chris@49 3586
Chris@49 3587 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3588
Chris@49 3589 op_type::apply(*this, X);
Chris@49 3590 }
Chris@49 3591
Chris@49 3592
Chris@49 3593
Chris@49 3594 //! create a matrix from Op, i.e. run the previously delayed unary operations
Chris@49 3595 template<typename eT>
Chris@49 3596 template<typename T1, typename op_type>
Chris@49 3597 inline
Chris@49 3598 const Mat<eT>&
Chris@49 3599 Mat<eT>::operator=(const Op<T1, op_type>& X)
Chris@49 3600 {
Chris@49 3601 arma_extra_debug_sigprint();
Chris@49 3602
Chris@49 3603 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3604
Chris@49 3605 op_type::apply(*this, X);
Chris@49 3606
Chris@49 3607 return *this;
Chris@49 3608 }
Chris@49 3609
Chris@49 3610
Chris@49 3611
Chris@49 3612 //! in-place matrix addition, with the right-hand-side operand having delayed operations
Chris@49 3613 template<typename eT>
Chris@49 3614 template<typename T1, typename op_type>
Chris@49 3615 inline
Chris@49 3616 const Mat<eT>&
Chris@49 3617 Mat<eT>::operator+=(const Op<T1, op_type>& X)
Chris@49 3618 {
Chris@49 3619 arma_extra_debug_sigprint();
Chris@49 3620
Chris@49 3621 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3622
Chris@49 3623 const Mat<eT> m(X);
Chris@49 3624
Chris@49 3625 return (*this).operator+=(m);
Chris@49 3626 }
Chris@49 3627
Chris@49 3628
Chris@49 3629
Chris@49 3630 //! in-place matrix subtraction, with the right-hand-side operand having delayed operations
Chris@49 3631 template<typename eT>
Chris@49 3632 template<typename T1, typename op_type>
Chris@49 3633 inline
Chris@49 3634 const Mat<eT>&
Chris@49 3635 Mat<eT>::operator-=(const Op<T1, op_type>& X)
Chris@49 3636 {
Chris@49 3637 arma_extra_debug_sigprint();
Chris@49 3638
Chris@49 3639 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3640
Chris@49 3641 const Mat<eT> m(X);
Chris@49 3642
Chris@49 3643 return (*this).operator-=(m);
Chris@49 3644 }
Chris@49 3645
Chris@49 3646
Chris@49 3647
Chris@49 3648 //! in-place matrix multiplication, with the right-hand-side operand having delayed operations
Chris@49 3649 template<typename eT>
Chris@49 3650 template<typename T1, typename op_type>
Chris@49 3651 inline
Chris@49 3652 const Mat<eT>&
Chris@49 3653 Mat<eT>::operator*=(const Op<T1, op_type>& X)
Chris@49 3654 {
Chris@49 3655 arma_extra_debug_sigprint();
Chris@49 3656
Chris@49 3657 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3658
Chris@49 3659 glue_times::apply_inplace(*this, X);
Chris@49 3660
Chris@49 3661 return *this;
Chris@49 3662 }
Chris@49 3663
Chris@49 3664
Chris@49 3665
Chris@49 3666 //! in-place matrix element-wise multiplication, with the right-hand-side operand having delayed operations
Chris@49 3667 template<typename eT>
Chris@49 3668 template<typename T1, typename op_type>
Chris@49 3669 inline
Chris@49 3670 const Mat<eT>&
Chris@49 3671 Mat<eT>::operator%=(const Op<T1, op_type>& X)
Chris@49 3672 {
Chris@49 3673 arma_extra_debug_sigprint();
Chris@49 3674
Chris@49 3675 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3676
Chris@49 3677 const Mat<eT> m(X);
Chris@49 3678
Chris@49 3679 return (*this).operator%=(m);
Chris@49 3680 }
Chris@49 3681
Chris@49 3682
Chris@49 3683
Chris@49 3684 //! in-place matrix element-wise division, with the right-hand-side operand having delayed operations
Chris@49 3685 template<typename eT>
Chris@49 3686 template<typename T1, typename op_type>
Chris@49 3687 inline
Chris@49 3688 const Mat<eT>&
Chris@49 3689 Mat<eT>::operator/=(const Op<T1, op_type>& X)
Chris@49 3690 {
Chris@49 3691 arma_extra_debug_sigprint();
Chris@49 3692
Chris@49 3693 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3694
Chris@49 3695 const Mat<eT> m(X);
Chris@49 3696
Chris@49 3697 return (*this).operator/=(m);
Chris@49 3698 }
Chris@49 3699
Chris@49 3700
Chris@49 3701
Chris@49 3702 //! create a matrix from eOp, i.e. run the previously delayed unary operations
Chris@49 3703 template<typename eT>
Chris@49 3704 template<typename T1, typename eop_type>
Chris@49 3705 inline
Chris@49 3706 Mat<eT>::Mat(const eOp<T1, eop_type>& X)
Chris@49 3707 : n_rows(X.get_n_rows())
Chris@49 3708 , n_cols(X.get_n_cols())
Chris@49 3709 , n_elem(X.get_n_elem())
Chris@49 3710 , vec_state(0)
Chris@49 3711 , mem_state(0)
Chris@49 3712 , mem()
Chris@49 3713 {
Chris@49 3714 arma_extra_debug_sigprint_this(this);
Chris@49 3715
Chris@49 3716 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3717
Chris@49 3718 init_cold();
Chris@49 3719
Chris@49 3720 eop_type::apply(*this, X);
Chris@49 3721 }
Chris@49 3722
Chris@49 3723
Chris@49 3724
Chris@49 3725 //! create a matrix from eOp, i.e. run the previously delayed unary operations
Chris@49 3726 template<typename eT>
Chris@49 3727 template<typename T1, typename eop_type>
Chris@49 3728 inline
Chris@49 3729 const Mat<eT>&
Chris@49 3730 Mat<eT>::operator=(const eOp<T1, eop_type>& X)
Chris@49 3731 {
Chris@49 3732 arma_extra_debug_sigprint();
Chris@49 3733
Chris@49 3734 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3735
Chris@49 3736 const bool bad_alias = (eOp<T1, eop_type>::proxy_type::has_subview && X.P.is_alias(*this));
Chris@49 3737
Chris@49 3738 if(bad_alias == false)
Chris@49 3739 {
Chris@49 3740 init_warm(X.get_n_rows(), X.get_n_cols());
Chris@49 3741
Chris@49 3742 eop_type::apply(*this, X);
Chris@49 3743 }
Chris@49 3744 else
Chris@49 3745 {
Chris@49 3746 arma_extra_debug_print("bad_alias = true");
Chris@49 3747
Chris@49 3748 Mat<eT> tmp(X);
Chris@49 3749
Chris@49 3750 steal_mem(tmp);
Chris@49 3751 }
Chris@49 3752
Chris@49 3753 return *this;
Chris@49 3754 }
Chris@49 3755
Chris@49 3756
Chris@49 3757
Chris@49 3758 template<typename eT>
Chris@49 3759 template<typename T1, typename eop_type>
Chris@49 3760 inline
Chris@49 3761 const Mat<eT>&
Chris@49 3762 Mat<eT>::operator+=(const eOp<T1, eop_type>& X)
Chris@49 3763 {
Chris@49 3764 arma_extra_debug_sigprint();
Chris@49 3765
Chris@49 3766 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3767
Chris@49 3768 eop_type::apply_inplace_plus(*this, X);
Chris@49 3769
Chris@49 3770 return *this;
Chris@49 3771 }
Chris@49 3772
Chris@49 3773
Chris@49 3774
Chris@49 3775 template<typename eT>
Chris@49 3776 template<typename T1, typename eop_type>
Chris@49 3777 inline
Chris@49 3778 const Mat<eT>&
Chris@49 3779 Mat<eT>::operator-=(const eOp<T1, eop_type>& X)
Chris@49 3780 {
Chris@49 3781 arma_extra_debug_sigprint();
Chris@49 3782
Chris@49 3783 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3784
Chris@49 3785 eop_type::apply_inplace_minus(*this, X);
Chris@49 3786
Chris@49 3787 return *this;
Chris@49 3788 }
Chris@49 3789
Chris@49 3790
Chris@49 3791
Chris@49 3792 template<typename eT>
Chris@49 3793 template<typename T1, typename eop_type>
Chris@49 3794 inline
Chris@49 3795 const Mat<eT>&
Chris@49 3796 Mat<eT>::operator*=(const eOp<T1, eop_type>& X)
Chris@49 3797 {
Chris@49 3798 arma_extra_debug_sigprint();
Chris@49 3799
Chris@49 3800 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3801
Chris@49 3802 glue_times::apply_inplace(*this, X);
Chris@49 3803
Chris@49 3804 return *this;
Chris@49 3805 }
Chris@49 3806
Chris@49 3807
Chris@49 3808
Chris@49 3809 template<typename eT>
Chris@49 3810 template<typename T1, typename eop_type>
Chris@49 3811 inline
Chris@49 3812 const Mat<eT>&
Chris@49 3813 Mat<eT>::operator%=(const eOp<T1, eop_type>& X)
Chris@49 3814 {
Chris@49 3815 arma_extra_debug_sigprint();
Chris@49 3816
Chris@49 3817 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3818
Chris@49 3819 eop_type::apply_inplace_schur(*this, X);
Chris@49 3820
Chris@49 3821 return *this;
Chris@49 3822 }
Chris@49 3823
Chris@49 3824
Chris@49 3825
Chris@49 3826 template<typename eT>
Chris@49 3827 template<typename T1, typename eop_type>
Chris@49 3828 inline
Chris@49 3829 const Mat<eT>&
Chris@49 3830 Mat<eT>::operator/=(const eOp<T1, eop_type>& X)
Chris@49 3831 {
Chris@49 3832 arma_extra_debug_sigprint();
Chris@49 3833
Chris@49 3834 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3835
Chris@49 3836 eop_type::apply_inplace_div(*this, X);
Chris@49 3837
Chris@49 3838 return *this;
Chris@49 3839 }
Chris@49 3840
Chris@49 3841
Chris@49 3842
Chris@49 3843 //! EXPERIMENTAL
Chris@49 3844 template<typename eT>
Chris@49 3845 template<typename T1, typename op_type>
Chris@49 3846 inline
Chris@49 3847 Mat<eT>::Mat(const mtOp<eT, T1, op_type>& X)
Chris@49 3848 : n_rows(0)
Chris@49 3849 , n_cols(0)
Chris@49 3850 , n_elem(0)
Chris@49 3851 , vec_state(0)
Chris@49 3852 , mem_state(0)
Chris@49 3853 , mem()
Chris@49 3854 {
Chris@49 3855 arma_extra_debug_sigprint_this(this);
Chris@49 3856
Chris@49 3857 op_type::apply(*this, X);
Chris@49 3858 }
Chris@49 3859
Chris@49 3860
Chris@49 3861
Chris@49 3862 //! EXPERIMENTAL
Chris@49 3863 template<typename eT>
Chris@49 3864 template<typename T1, typename op_type>
Chris@49 3865 inline
Chris@49 3866 const Mat<eT>&
Chris@49 3867 Mat<eT>::operator=(const mtOp<eT, T1, op_type>& X)
Chris@49 3868 {
Chris@49 3869 arma_extra_debug_sigprint();
Chris@49 3870
Chris@49 3871 op_type::apply(*this, X);
Chris@49 3872
Chris@49 3873 return *this;
Chris@49 3874 }
Chris@49 3875
Chris@49 3876
Chris@49 3877
Chris@49 3878 //! EXPERIMENTAL
Chris@49 3879 template<typename eT>
Chris@49 3880 template<typename T1, typename op_type>
Chris@49 3881 inline
Chris@49 3882 const Mat<eT>&
Chris@49 3883 Mat<eT>::operator+=(const mtOp<eT, T1, op_type>& X)
Chris@49 3884 {
Chris@49 3885 arma_extra_debug_sigprint();
Chris@49 3886
Chris@49 3887 const Mat<eT> m(X);
Chris@49 3888
Chris@49 3889 return (*this).operator+=(m);
Chris@49 3890 }
Chris@49 3891
Chris@49 3892
Chris@49 3893
Chris@49 3894 //! EXPERIMENTAL
Chris@49 3895 template<typename eT>
Chris@49 3896 template<typename T1, typename op_type>
Chris@49 3897 inline
Chris@49 3898 const Mat<eT>&
Chris@49 3899 Mat<eT>::operator-=(const mtOp<eT, T1, op_type>& X)
Chris@49 3900 {
Chris@49 3901 arma_extra_debug_sigprint();
Chris@49 3902
Chris@49 3903 const Mat<eT> m(X);
Chris@49 3904
Chris@49 3905 return (*this).operator-=(m);
Chris@49 3906 }
Chris@49 3907
Chris@49 3908
Chris@49 3909
Chris@49 3910 //! EXPERIMENTAL
Chris@49 3911 template<typename eT>
Chris@49 3912 template<typename T1, typename op_type>
Chris@49 3913 inline
Chris@49 3914 const Mat<eT>&
Chris@49 3915 Mat<eT>::operator*=(const mtOp<eT, T1, op_type>& X)
Chris@49 3916 {
Chris@49 3917 arma_extra_debug_sigprint();
Chris@49 3918
Chris@49 3919 const Mat<eT> m(X);
Chris@49 3920
Chris@49 3921 return (*this).operator*=(m);
Chris@49 3922 }
Chris@49 3923
Chris@49 3924
Chris@49 3925
Chris@49 3926 //! EXPERIMENTAL
Chris@49 3927 template<typename eT>
Chris@49 3928 template<typename T1, typename op_type>
Chris@49 3929 inline
Chris@49 3930 const Mat<eT>&
Chris@49 3931 Mat<eT>::operator%=(const mtOp<eT, T1, op_type>& X)
Chris@49 3932 {
Chris@49 3933 arma_extra_debug_sigprint();
Chris@49 3934
Chris@49 3935 const Mat<eT> m(X);
Chris@49 3936
Chris@49 3937 return (*this).operator%=(m);
Chris@49 3938 }
Chris@49 3939
Chris@49 3940
Chris@49 3941
Chris@49 3942 //! EXPERIMENTAL
Chris@49 3943 template<typename eT>
Chris@49 3944 template<typename T1, typename op_type>
Chris@49 3945 inline
Chris@49 3946 const Mat<eT>&
Chris@49 3947 Mat<eT>::operator/=(const mtOp<eT, T1, op_type>& X)
Chris@49 3948 {
Chris@49 3949 arma_extra_debug_sigprint();
Chris@49 3950
Chris@49 3951 const Mat<eT> m(X);
Chris@49 3952
Chris@49 3953 return (*this).operator/=(m);
Chris@49 3954 }
Chris@49 3955
Chris@49 3956
Chris@49 3957
Chris@49 3958 //! create a matrix from Glue, i.e. run the previously delayed binary operations
Chris@49 3959 template<typename eT>
Chris@49 3960 template<typename T1, typename T2, typename glue_type>
Chris@49 3961 inline
Chris@49 3962 Mat<eT>::Mat(const Glue<T1, T2, glue_type>& X)
Chris@49 3963 : n_rows(0)
Chris@49 3964 , n_cols(0)
Chris@49 3965 , n_elem(0)
Chris@49 3966 , vec_state(0)
Chris@49 3967 , mem_state(0)
Chris@49 3968 , mem()
Chris@49 3969 {
Chris@49 3970 arma_extra_debug_sigprint_this(this);
Chris@49 3971
Chris@49 3972 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3973 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 3974
Chris@49 3975 glue_type::apply(*this, X);
Chris@49 3976 }
Chris@49 3977
Chris@49 3978
Chris@49 3979
Chris@49 3980 //! create a matrix from Glue, i.e. run the previously delayed binary operations
Chris@49 3981 template<typename eT>
Chris@49 3982 template<typename T1, typename T2, typename glue_type>
Chris@49 3983 inline
Chris@49 3984 const Mat<eT>&
Chris@49 3985 Mat<eT>::operator=(const Glue<T1, T2, glue_type>& X)
Chris@49 3986 {
Chris@49 3987 arma_extra_debug_sigprint();
Chris@49 3988
Chris@49 3989 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 3990 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 3991
Chris@49 3992 glue_type::apply(*this, X);
Chris@49 3993
Chris@49 3994 return *this;
Chris@49 3995 }
Chris@49 3996
Chris@49 3997
Chris@49 3998
Chris@49 3999 //! in-place matrix addition, with the right-hand-side operands having delayed operations
Chris@49 4000 template<typename eT>
Chris@49 4001 template<typename T1, typename T2, typename glue_type>
Chris@49 4002 inline
Chris@49 4003 const Mat<eT>&
Chris@49 4004 Mat<eT>::operator+=(const Glue<T1, T2, glue_type>& X)
Chris@49 4005 {
Chris@49 4006 arma_extra_debug_sigprint();
Chris@49 4007
Chris@49 4008 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4009 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4010
Chris@49 4011 const Mat<eT> m(X);
Chris@49 4012
Chris@49 4013 return (*this).operator+=(m);
Chris@49 4014 }
Chris@49 4015
Chris@49 4016
Chris@49 4017
Chris@49 4018 //! in-place matrix subtraction, with the right-hand-side operands having delayed operations
Chris@49 4019 template<typename eT>
Chris@49 4020 template<typename T1, typename T2, typename glue_type>
Chris@49 4021 inline
Chris@49 4022 const Mat<eT>&
Chris@49 4023 Mat<eT>::operator-=(const Glue<T1, T2, glue_type>& X)
Chris@49 4024 {
Chris@49 4025 arma_extra_debug_sigprint();
Chris@49 4026
Chris@49 4027 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4028 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4029
Chris@49 4030 const Mat<eT> m(X);
Chris@49 4031
Chris@49 4032 return (*this).operator-=(m);
Chris@49 4033 }
Chris@49 4034
Chris@49 4035
Chris@49 4036
Chris@49 4037 //! in-place matrix multiplications, with the right-hand-side operands having delayed operations
Chris@49 4038 template<typename eT>
Chris@49 4039 template<typename T1, typename T2, typename glue_type>
Chris@49 4040 inline
Chris@49 4041 const Mat<eT>&
Chris@49 4042 Mat<eT>::operator*=(const Glue<T1, T2, glue_type>& X)
Chris@49 4043 {
Chris@49 4044 arma_extra_debug_sigprint();
Chris@49 4045
Chris@49 4046 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4047 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4048
Chris@49 4049 glue_times::apply_inplace(*this, X);
Chris@49 4050
Chris@49 4051 return *this;
Chris@49 4052 }
Chris@49 4053
Chris@49 4054
Chris@49 4055
Chris@49 4056 //! in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations
Chris@49 4057 template<typename eT>
Chris@49 4058 template<typename T1, typename T2, typename glue_type>
Chris@49 4059 inline
Chris@49 4060 const Mat<eT>&
Chris@49 4061 Mat<eT>::operator%=(const Glue<T1, T2, glue_type>& X)
Chris@49 4062 {
Chris@49 4063 arma_extra_debug_sigprint();
Chris@49 4064
Chris@49 4065 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4066 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4067
Chris@49 4068 const Mat<eT> m(X);
Chris@49 4069
Chris@49 4070 return (*this).operator%=(m);
Chris@49 4071 }
Chris@49 4072
Chris@49 4073
Chris@49 4074
Chris@49 4075 //! in-place matrix element-wise division, with the right-hand-side operands having delayed operations
Chris@49 4076 template<typename eT>
Chris@49 4077 template<typename T1, typename T2, typename glue_type>
Chris@49 4078 inline
Chris@49 4079 const Mat<eT>&
Chris@49 4080 Mat<eT>::operator/=(const Glue<T1, T2, glue_type>& X)
Chris@49 4081 {
Chris@49 4082 arma_extra_debug_sigprint();
Chris@49 4083
Chris@49 4084 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4085 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4086
Chris@49 4087 const Mat<eT> m(X);
Chris@49 4088
Chris@49 4089 return (*this).operator/=(m);
Chris@49 4090 }
Chris@49 4091
Chris@49 4092
Chris@49 4093
Chris@49 4094 template<typename eT>
Chris@49 4095 template<typename T1, typename T2>
Chris@49 4096 inline
Chris@49 4097 const Mat<eT>&
Chris@49 4098 Mat<eT>::operator+=(const Glue<T1, T2, glue_times>& X)
Chris@49 4099 {
Chris@49 4100 arma_extra_debug_sigprint();
Chris@49 4101
Chris@49 4102 glue_times::apply_inplace_plus(*this, X, sword(+1));
Chris@49 4103
Chris@49 4104 return *this;
Chris@49 4105 }
Chris@49 4106
Chris@49 4107
Chris@49 4108
Chris@49 4109 template<typename eT>
Chris@49 4110 template<typename T1, typename T2>
Chris@49 4111 inline
Chris@49 4112 const Mat<eT>&
Chris@49 4113 Mat<eT>::operator-=(const Glue<T1, T2, glue_times>& X)
Chris@49 4114 {
Chris@49 4115 arma_extra_debug_sigprint();
Chris@49 4116
Chris@49 4117 glue_times::apply_inplace_plus(*this, X, sword(-1));
Chris@49 4118
Chris@49 4119 return *this;
Chris@49 4120 }
Chris@49 4121
Chris@49 4122
Chris@49 4123
Chris@49 4124 //! create a matrix from eGlue, i.e. run the previously delayed binary operations
Chris@49 4125 template<typename eT>
Chris@49 4126 template<typename T1, typename T2, typename eglue_type>
Chris@49 4127 inline
Chris@49 4128 Mat<eT>::Mat(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4129 : n_rows(X.get_n_rows())
Chris@49 4130 , n_cols(X.get_n_cols())
Chris@49 4131 , n_elem(X.get_n_elem())
Chris@49 4132 , vec_state(0)
Chris@49 4133 , mem_state(0)
Chris@49 4134 , mem()
Chris@49 4135 {
Chris@49 4136 arma_extra_debug_sigprint_this(this);
Chris@49 4137
Chris@49 4138 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4139 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4140
Chris@49 4141 init_cold();
Chris@49 4142
Chris@49 4143 eglue_type::apply(*this, X);
Chris@49 4144 }
Chris@49 4145
Chris@49 4146
Chris@49 4147
Chris@49 4148 //! create a matrix from eGlue, i.e. run the previously delayed binary operations
Chris@49 4149 template<typename eT>
Chris@49 4150 template<typename T1, typename T2, typename eglue_type>
Chris@49 4151 inline
Chris@49 4152 const Mat<eT>&
Chris@49 4153 Mat<eT>::operator=(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4154 {
Chris@49 4155 arma_extra_debug_sigprint();
Chris@49 4156
Chris@49 4157 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4158 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4159
Chris@49 4160 const bool bad_alias =
Chris@49 4161 (
Chris@49 4162 (eGlue<T1, T2, eglue_type>::proxy1_type::has_subview && X.P1.is_alias(*this))
Chris@49 4163 ||
Chris@49 4164 (eGlue<T1, T2, eglue_type>::proxy2_type::has_subview && X.P2.is_alias(*this))
Chris@49 4165 );
Chris@49 4166
Chris@49 4167 if(bad_alias == false)
Chris@49 4168 {
Chris@49 4169 init_warm(X.get_n_rows(), X.get_n_cols());
Chris@49 4170
Chris@49 4171 eglue_type::apply(*this, X);
Chris@49 4172 }
Chris@49 4173 else
Chris@49 4174 {
Chris@49 4175 arma_extra_debug_print("bad_alias = true");
Chris@49 4176
Chris@49 4177 Mat<eT> tmp(X);
Chris@49 4178
Chris@49 4179 steal_mem(tmp);
Chris@49 4180 }
Chris@49 4181
Chris@49 4182 return *this;
Chris@49 4183 }
Chris@49 4184
Chris@49 4185
Chris@49 4186
Chris@49 4187 //! in-place matrix addition, with the right-hand-side operands having delayed operations
Chris@49 4188 template<typename eT>
Chris@49 4189 template<typename T1, typename T2, typename eglue_type>
Chris@49 4190 inline
Chris@49 4191 const Mat<eT>&
Chris@49 4192 Mat<eT>::operator+=(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4193 {
Chris@49 4194 arma_extra_debug_sigprint();
Chris@49 4195
Chris@49 4196 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4197 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4198
Chris@49 4199 eglue_type::apply_inplace_plus(*this, X);
Chris@49 4200
Chris@49 4201 return *this;
Chris@49 4202 }
Chris@49 4203
Chris@49 4204
Chris@49 4205
Chris@49 4206 //! in-place matrix subtraction, with the right-hand-side operands having delayed operations
Chris@49 4207 template<typename eT>
Chris@49 4208 template<typename T1, typename T2, typename eglue_type>
Chris@49 4209 inline
Chris@49 4210 const Mat<eT>&
Chris@49 4211 Mat<eT>::operator-=(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4212 {
Chris@49 4213 arma_extra_debug_sigprint();
Chris@49 4214
Chris@49 4215 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4216 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4217
Chris@49 4218 eglue_type::apply_inplace_minus(*this, X);
Chris@49 4219
Chris@49 4220 return *this;
Chris@49 4221 }
Chris@49 4222
Chris@49 4223
Chris@49 4224
Chris@49 4225 template<typename eT>
Chris@49 4226 template<typename T1, typename T2, typename eglue_type>
Chris@49 4227 inline
Chris@49 4228 const Mat<eT>&
Chris@49 4229 Mat<eT>::operator*=(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4230 {
Chris@49 4231 arma_extra_debug_sigprint();
Chris@49 4232
Chris@49 4233 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4234 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4235
Chris@49 4236 glue_times::apply_inplace(*this, X);
Chris@49 4237 return *this;
Chris@49 4238 }
Chris@49 4239
Chris@49 4240
Chris@49 4241
Chris@49 4242 template<typename eT>
Chris@49 4243 template<typename T1, typename T2, typename eglue_type>
Chris@49 4244 inline
Chris@49 4245 const Mat<eT>&
Chris@49 4246 Mat<eT>::operator%=(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4247 {
Chris@49 4248 arma_extra_debug_sigprint();
Chris@49 4249
Chris@49 4250 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4251 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4252
Chris@49 4253 eglue_type::apply_inplace_schur(*this, X);
Chris@49 4254 return *this;
Chris@49 4255 }
Chris@49 4256
Chris@49 4257
Chris@49 4258
Chris@49 4259 template<typename eT>
Chris@49 4260 template<typename T1, typename T2, typename eglue_type>
Chris@49 4261 inline
Chris@49 4262 const Mat<eT>&
Chris@49 4263 Mat<eT>::operator/=(const eGlue<T1, T2, eglue_type>& X)
Chris@49 4264 {
Chris@49 4265 arma_extra_debug_sigprint();
Chris@49 4266
Chris@49 4267 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
Chris@49 4268 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
Chris@49 4269
Chris@49 4270 eglue_type::apply_inplace_div(*this, X);
Chris@49 4271 return *this;
Chris@49 4272 }
Chris@49 4273
Chris@49 4274
Chris@49 4275
Chris@49 4276 //! EXPERIMENTAL: create a matrix from mtGlue, i.e. run the previously delayed binary operations
Chris@49 4277 template<typename eT>
Chris@49 4278 template<typename T1, typename T2, typename glue_type>
Chris@49 4279 inline
Chris@49 4280 Mat<eT>::Mat(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4281 : n_rows(0)
Chris@49 4282 , n_cols(0)
Chris@49 4283 , n_elem(0)
Chris@49 4284 , vec_state(0)
Chris@49 4285 , mem_state(0)
Chris@49 4286 , mem()
Chris@49 4287 {
Chris@49 4288 arma_extra_debug_sigprint_this(this);
Chris@49 4289
Chris@49 4290 glue_type::apply(*this, X);
Chris@49 4291 }
Chris@49 4292
Chris@49 4293
Chris@49 4294
Chris@49 4295 //! EXPERIMENTAL: create a matrix from Glue, i.e. run the previously delayed binary operations
Chris@49 4296 template<typename eT>
Chris@49 4297 template<typename T1, typename T2, typename glue_type>
Chris@49 4298 inline
Chris@49 4299 const Mat<eT>&
Chris@49 4300 Mat<eT>::operator=(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4301 {
Chris@49 4302 arma_extra_debug_sigprint();
Chris@49 4303
Chris@49 4304 glue_type::apply(*this, X);
Chris@49 4305
Chris@49 4306 return *this;
Chris@49 4307 }
Chris@49 4308
Chris@49 4309
Chris@49 4310
Chris@49 4311 //! EXPERIMENTAL: in-place matrix addition, with the right-hand-side operands having delayed operations
Chris@49 4312 template<typename eT>
Chris@49 4313 template<typename T1, typename T2, typename glue_type>
Chris@49 4314 inline
Chris@49 4315 const Mat<eT>&
Chris@49 4316 Mat<eT>::operator+=(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4317 {
Chris@49 4318 arma_extra_debug_sigprint();
Chris@49 4319
Chris@49 4320 const Mat<eT> m(X);
Chris@49 4321
Chris@49 4322 return (*this).operator+=(m);
Chris@49 4323 }
Chris@49 4324
Chris@49 4325
Chris@49 4326
Chris@49 4327 //! EXPERIMENTAL: in-place matrix subtraction, with the right-hand-side operands having delayed operations
Chris@49 4328 template<typename eT>
Chris@49 4329 template<typename T1, typename T2, typename glue_type>
Chris@49 4330 inline
Chris@49 4331 const Mat<eT>&
Chris@49 4332 Mat<eT>::operator-=(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4333 {
Chris@49 4334 arma_extra_debug_sigprint();
Chris@49 4335
Chris@49 4336 const Mat<eT> m(X);
Chris@49 4337
Chris@49 4338 return (*this).operator-=(m);
Chris@49 4339 }
Chris@49 4340
Chris@49 4341
Chris@49 4342
Chris@49 4343 //! EXPERIMENTAL: in-place matrix multiplications, with the right-hand-side operands having delayed operations
Chris@49 4344 template<typename eT>
Chris@49 4345 template<typename T1, typename T2, typename glue_type>
Chris@49 4346 inline
Chris@49 4347 const Mat<eT>&
Chris@49 4348 Mat<eT>::operator*=(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4349 {
Chris@49 4350 arma_extra_debug_sigprint();
Chris@49 4351
Chris@49 4352 const Mat<eT> m(X);
Chris@49 4353
Chris@49 4354 glue_times::apply_inplace(*this, m);
Chris@49 4355
Chris@49 4356 return *this;
Chris@49 4357 }
Chris@49 4358
Chris@49 4359
Chris@49 4360
Chris@49 4361 //! EXPERIMENTAL: in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations
Chris@49 4362 template<typename eT>
Chris@49 4363 template<typename T1, typename T2, typename glue_type>
Chris@49 4364 inline
Chris@49 4365 const Mat<eT>&
Chris@49 4366 Mat<eT>::operator%=(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4367 {
Chris@49 4368 arma_extra_debug_sigprint();
Chris@49 4369
Chris@49 4370 const Mat<eT> m(X);
Chris@49 4371
Chris@49 4372 return (*this).operator%=(m);
Chris@49 4373 }
Chris@49 4374
Chris@49 4375
Chris@49 4376
Chris@49 4377 //! EXPERIMENTAL: in-place matrix element-wise division, with the right-hand-side operands having delayed operations
Chris@49 4378 template<typename eT>
Chris@49 4379 template<typename T1, typename T2, typename glue_type>
Chris@49 4380 inline
Chris@49 4381 const Mat<eT>&
Chris@49 4382 Mat<eT>::operator/=(const mtGlue<eT, T1, T2, glue_type>& X)
Chris@49 4383 {
Chris@49 4384 arma_extra_debug_sigprint();
Chris@49 4385
Chris@49 4386 const Mat<eT> m(X);
Chris@49 4387
Chris@49 4388 return (*this).operator/=(m);
Chris@49 4389 }
Chris@49 4390
Chris@49 4391
Chris@49 4392
Chris@49 4393 //! linear element accessor (treats the matrix as a vector); no bounds check; assumes memory is aligned
Chris@49 4394 template<typename eT>
Chris@49 4395 arma_inline
Chris@49 4396 arma_warn_unused
Chris@49 4397 const eT&
Chris@49 4398 Mat<eT>::at_alt(const uword ii) const
Chris@49 4399 {
Chris@49 4400 const eT* mem_aligned = mem;
Chris@49 4401 memory::mark_as_aligned(mem_aligned);
Chris@49 4402
Chris@49 4403 return mem_aligned[ii];
Chris@49 4404 }
Chris@49 4405
Chris@49 4406
Chris@49 4407
Chris@49 4408 //! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined
Chris@49 4409 template<typename eT>
Chris@49 4410 arma_inline
Chris@49 4411 arma_warn_unused
Chris@49 4412 eT&
Chris@49 4413 Mat<eT>::operator() (const uword ii)
Chris@49 4414 {
Chris@49 4415 arma_debug_check( (ii >= n_elem), "Mat::operator(): index out of bounds");
Chris@49 4416 return access::rw(mem[ii]);
Chris@49 4417 }
Chris@49 4418
Chris@49 4419
Chris@49 4420
Chris@49 4421 //! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined
Chris@49 4422 template<typename eT>
Chris@49 4423 arma_inline
Chris@49 4424 arma_warn_unused
Chris@49 4425 const eT&
Chris@49 4426 Mat<eT>::operator() (const uword ii) const
Chris@49 4427 {
Chris@49 4428 arma_debug_check( (ii >= n_elem), "Mat::operator(): index out of bounds");
Chris@49 4429 return mem[ii];
Chris@49 4430 }
Chris@49 4431
Chris@49 4432
Chris@49 4433 //! linear element accessor (treats the matrix as a vector); no bounds check.
Chris@49 4434 template<typename eT>
Chris@49 4435 arma_inline
Chris@49 4436 arma_warn_unused
Chris@49 4437 eT&
Chris@49 4438 Mat<eT>::operator[] (const uword ii)
Chris@49 4439 {
Chris@49 4440 return access::rw(mem[ii]);
Chris@49 4441 }
Chris@49 4442
Chris@49 4443
Chris@49 4444
Chris@49 4445 //! linear element accessor (treats the matrix as a vector); no bounds check
Chris@49 4446 template<typename eT>
Chris@49 4447 arma_inline
Chris@49 4448 arma_warn_unused
Chris@49 4449 const eT&
Chris@49 4450 Mat<eT>::operator[] (const uword ii) const
Chris@49 4451 {
Chris@49 4452 return mem[ii];
Chris@49 4453 }
Chris@49 4454
Chris@49 4455
Chris@49 4456
Chris@49 4457 //! linear element accessor (treats the matrix as a vector); no bounds check.
Chris@49 4458 template<typename eT>
Chris@49 4459 arma_inline
Chris@49 4460 arma_warn_unused
Chris@49 4461 eT&
Chris@49 4462 Mat<eT>::at(const uword ii)
Chris@49 4463 {
Chris@49 4464 return access::rw(mem[ii]);
Chris@49 4465 }
Chris@49 4466
Chris@49 4467
Chris@49 4468
Chris@49 4469 //! linear element accessor (treats the matrix as a vector); no bounds check
Chris@49 4470 template<typename eT>
Chris@49 4471 arma_inline
Chris@49 4472 arma_warn_unused
Chris@49 4473 const eT&
Chris@49 4474 Mat<eT>::at(const uword ii) const
Chris@49 4475 {
Chris@49 4476 return mem[ii];
Chris@49 4477 }
Chris@49 4478
Chris@49 4479
Chris@49 4480
Chris@49 4481 //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined
Chris@49 4482 template<typename eT>
Chris@49 4483 arma_inline
Chris@49 4484 arma_warn_unused
Chris@49 4485 eT&
Chris@49 4486 Mat<eT>::operator() (const uword in_row, const uword in_col)
Chris@49 4487 {
Chris@49 4488 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): index out of bounds");
Chris@49 4489 return access::rw(mem[in_row + in_col*n_rows]);
Chris@49 4490 }
Chris@49 4491
Chris@49 4492
Chris@49 4493
Chris@49 4494 //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined
Chris@49 4495 template<typename eT>
Chris@49 4496 arma_inline
Chris@49 4497 arma_warn_unused
Chris@49 4498 const eT&
Chris@49 4499 Mat<eT>::operator() (const uword in_row, const uword in_col) const
Chris@49 4500 {
Chris@49 4501 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): index out of bounds");
Chris@49 4502 return mem[in_row + in_col*n_rows];
Chris@49 4503 }
Chris@49 4504
Chris@49 4505
Chris@49 4506
Chris@49 4507 //! element accessor; no bounds check
Chris@49 4508 template<typename eT>
Chris@49 4509 arma_inline
Chris@49 4510 arma_warn_unused
Chris@49 4511 eT&
Chris@49 4512 Mat<eT>::at(const uword in_row, const uword in_col)
Chris@49 4513 {
Chris@49 4514 return access::rw( mem[in_row + in_col*n_rows] );
Chris@49 4515 }
Chris@49 4516
Chris@49 4517
Chris@49 4518
Chris@49 4519 //! element accessor; no bounds check
Chris@49 4520 template<typename eT>
Chris@49 4521 arma_inline
Chris@49 4522 arma_warn_unused
Chris@49 4523 const eT&
Chris@49 4524 Mat<eT>::at(const uword in_row, const uword in_col) const
Chris@49 4525 {
Chris@49 4526 return mem[in_row + in_col*n_rows];
Chris@49 4527 }
Chris@49 4528
Chris@49 4529
Chris@49 4530
Chris@49 4531 //! prefix ++
Chris@49 4532 template<typename eT>
Chris@49 4533 arma_inline
Chris@49 4534 const Mat<eT>&
Chris@49 4535 Mat<eT>::operator++()
Chris@49 4536 {
Chris@49 4537 Mat_aux::prefix_pp(*this);
Chris@49 4538 return *this;
Chris@49 4539 }
Chris@49 4540
Chris@49 4541
Chris@49 4542
Chris@49 4543 //! postfix ++ (must not return the object by reference)
Chris@49 4544 template<typename eT>
Chris@49 4545 arma_inline
Chris@49 4546 void
Chris@49 4547 Mat<eT>::operator++(int)
Chris@49 4548 {
Chris@49 4549 Mat_aux::postfix_pp(*this);
Chris@49 4550 }
Chris@49 4551
Chris@49 4552
Chris@49 4553
Chris@49 4554 //! prefix --
Chris@49 4555 template<typename eT>
Chris@49 4556 arma_inline
Chris@49 4557 const Mat<eT>&
Chris@49 4558 Mat<eT>::operator--()
Chris@49 4559 {
Chris@49 4560 Mat_aux::prefix_mm(*this);
Chris@49 4561 return *this;
Chris@49 4562 }
Chris@49 4563
Chris@49 4564
Chris@49 4565
Chris@49 4566 //! postfix -- (must not return the object by reference)
Chris@49 4567 template<typename eT>
Chris@49 4568 arma_inline
Chris@49 4569 void
Chris@49 4570 Mat<eT>::operator--(int)
Chris@49 4571 {
Chris@49 4572 Mat_aux::postfix_mm(*this);
Chris@49 4573 }
Chris@49 4574
Chris@49 4575
Chris@49 4576
Chris@49 4577 //! returns true if the matrix has no elements
Chris@49 4578 template<typename eT>
Chris@49 4579 arma_inline
Chris@49 4580 arma_warn_unused
Chris@49 4581 bool
Chris@49 4582 Mat<eT>::is_empty() const
Chris@49 4583 {
Chris@49 4584 return (n_elem == 0);
Chris@49 4585 }
Chris@49 4586
Chris@49 4587
Chris@49 4588
Chris@49 4589 //! returns true if the object can be interpreted as a column or row vector
Chris@49 4590 template<typename eT>
Chris@49 4591 arma_inline
Chris@49 4592 arma_warn_unused
Chris@49 4593 bool
Chris@49 4594 Mat<eT>::is_vec() const
Chris@49 4595 {
Chris@49 4596 return ( (n_rows == 1) || (n_cols == 1) );
Chris@49 4597 }
Chris@49 4598
Chris@49 4599
Chris@49 4600
Chris@49 4601 //! returns true if the object can be interpreted as a row vector
Chris@49 4602 template<typename eT>
Chris@49 4603 arma_inline
Chris@49 4604 arma_warn_unused
Chris@49 4605 bool
Chris@49 4606 Mat<eT>::is_rowvec() const
Chris@49 4607 {
Chris@49 4608 return (n_rows == 1);
Chris@49 4609 }
Chris@49 4610
Chris@49 4611
Chris@49 4612
Chris@49 4613 //! returns true if the object can be interpreted as a column vector
Chris@49 4614 template<typename eT>
Chris@49 4615 arma_inline
Chris@49 4616 arma_warn_unused
Chris@49 4617 bool
Chris@49 4618 Mat<eT>::is_colvec() const
Chris@49 4619 {
Chris@49 4620 return (n_cols == 1);
Chris@49 4621 }
Chris@49 4622
Chris@49 4623
Chris@49 4624
Chris@49 4625 //! returns true if the object has the same number of non-zero rows and columnns
Chris@49 4626 template<typename eT>
Chris@49 4627 arma_inline
Chris@49 4628 arma_warn_unused
Chris@49 4629 bool
Chris@49 4630 Mat<eT>::is_square() const
Chris@49 4631 {
Chris@49 4632 return (n_rows == n_cols);
Chris@49 4633 }
Chris@49 4634
Chris@49 4635
Chris@49 4636
Chris@49 4637 //! returns true if all of the elements are finite
Chris@49 4638 template<typename eT>
Chris@49 4639 inline
Chris@49 4640 arma_warn_unused
Chris@49 4641 bool
Chris@49 4642 Mat<eT>::is_finite() const
Chris@49 4643 {
Chris@49 4644 return arrayops::is_finite( memptr(), n_elem );
Chris@49 4645 }
Chris@49 4646
Chris@49 4647
Chris@49 4648
Chris@49 4649 //! returns true if the given index is currently in range
Chris@49 4650 template<typename eT>
Chris@49 4651 arma_inline
Chris@49 4652 arma_warn_unused
Chris@49 4653 bool
Chris@49 4654 Mat<eT>::in_range(const uword ii) const
Chris@49 4655 {
Chris@49 4656 return (ii < n_elem);
Chris@49 4657 }
Chris@49 4658
Chris@49 4659
Chris@49 4660
Chris@49 4661 //! returns true if the given start and end indices are currently in range
Chris@49 4662 template<typename eT>
Chris@49 4663 arma_inline
Chris@49 4664 arma_warn_unused
Chris@49 4665 bool
Chris@49 4666 Mat<eT>::in_range(const span& x) const
Chris@49 4667 {
Chris@49 4668 arma_extra_debug_sigprint();
Chris@49 4669
Chris@49 4670 if(x.whole == true)
Chris@49 4671 {
Chris@49 4672 return true;
Chris@49 4673 }
Chris@49 4674 else
Chris@49 4675 {
Chris@49 4676 const uword a = x.a;
Chris@49 4677 const uword b = x.b;
Chris@49 4678
Chris@49 4679 return ( (a <= b) && (b < n_elem) );
Chris@49 4680 }
Chris@49 4681 }
Chris@49 4682
Chris@49 4683
Chris@49 4684
Chris@49 4685 //! returns true if the given location is currently in range
Chris@49 4686 template<typename eT>
Chris@49 4687 arma_inline
Chris@49 4688 arma_warn_unused
Chris@49 4689 bool
Chris@49 4690 Mat<eT>::in_range(const uword in_row, const uword in_col) const
Chris@49 4691 {
Chris@49 4692 return ( (in_row < n_rows) && (in_col < n_cols) );
Chris@49 4693 }
Chris@49 4694
Chris@49 4695
Chris@49 4696
Chris@49 4697 template<typename eT>
Chris@49 4698 arma_inline
Chris@49 4699 arma_warn_unused
Chris@49 4700 bool
Chris@49 4701 Mat<eT>::in_range(const span& row_span, const uword in_col) const
Chris@49 4702 {
Chris@49 4703 arma_extra_debug_sigprint();
Chris@49 4704
Chris@49 4705 if(row_span.whole == true)
Chris@49 4706 {
Chris@49 4707 return (in_col < n_cols);
Chris@49 4708 }
Chris@49 4709 else
Chris@49 4710 {
Chris@49 4711 const uword in_row1 = row_span.a;
Chris@49 4712 const uword in_row2 = row_span.b;
Chris@49 4713
Chris@49 4714 return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) );
Chris@49 4715 }
Chris@49 4716 }
Chris@49 4717
Chris@49 4718
Chris@49 4719
Chris@49 4720 template<typename eT>
Chris@49 4721 arma_inline
Chris@49 4722 arma_warn_unused
Chris@49 4723 bool
Chris@49 4724 Mat<eT>::in_range(const uword in_row, const span& col_span) const
Chris@49 4725 {
Chris@49 4726 arma_extra_debug_sigprint();
Chris@49 4727
Chris@49 4728 if(col_span.whole == true)
Chris@49 4729 {
Chris@49 4730 return (in_row < n_rows);
Chris@49 4731 }
Chris@49 4732 else
Chris@49 4733 {
Chris@49 4734 const uword in_col1 = col_span.a;
Chris@49 4735 const uword in_col2 = col_span.b;
Chris@49 4736
Chris@49 4737 return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) );
Chris@49 4738 }
Chris@49 4739 }
Chris@49 4740
Chris@49 4741
Chris@49 4742
Chris@49 4743 template<typename eT>
Chris@49 4744 arma_inline
Chris@49 4745 arma_warn_unused
Chris@49 4746 bool
Chris@49 4747 Mat<eT>::in_range(const span& row_span, const span& col_span) const
Chris@49 4748 {
Chris@49 4749 arma_extra_debug_sigprint();
Chris@49 4750
Chris@49 4751 const uword in_row1 = row_span.a;
Chris@49 4752 const uword in_row2 = row_span.b;
Chris@49 4753
Chris@49 4754 const uword in_col1 = col_span.a;
Chris@49 4755 const uword in_col2 = col_span.b;
Chris@49 4756
Chris@49 4757 const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) );
Chris@49 4758 const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) );
Chris@49 4759
Chris@49 4760 return ( (rows_ok == true) && (cols_ok == true) );
Chris@49 4761 }
Chris@49 4762
Chris@49 4763
Chris@49 4764
Chris@49 4765 //! returns a pointer to array of eTs for a specified column; no bounds check
Chris@49 4766 template<typename eT>
Chris@49 4767 arma_inline
Chris@49 4768 arma_warn_unused
Chris@49 4769 eT*
Chris@49 4770 Mat<eT>::colptr(const uword in_col)
Chris@49 4771 {
Chris@49 4772 return & access::rw(mem[in_col*n_rows]);
Chris@49 4773 }
Chris@49 4774
Chris@49 4775
Chris@49 4776
Chris@49 4777 //! returns a pointer to array of eTs for a specified column; no bounds check
Chris@49 4778 template<typename eT>
Chris@49 4779 arma_inline
Chris@49 4780 arma_warn_unused
Chris@49 4781 const eT*
Chris@49 4782 Mat<eT>::colptr(const uword in_col) const
Chris@49 4783 {
Chris@49 4784 return & mem[in_col*n_rows];
Chris@49 4785 }
Chris@49 4786
Chris@49 4787
Chris@49 4788
Chris@49 4789 //! returns a pointer to array of eTs used by the matrix
Chris@49 4790 template<typename eT>
Chris@49 4791 arma_inline
Chris@49 4792 arma_warn_unused
Chris@49 4793 eT*
Chris@49 4794 Mat<eT>::memptr()
Chris@49 4795 {
Chris@49 4796 return const_cast<eT*>(mem);
Chris@49 4797 }
Chris@49 4798
Chris@49 4799
Chris@49 4800
Chris@49 4801 //! returns a pointer to array of eTs used by the matrix
Chris@49 4802 template<typename eT>
Chris@49 4803 arma_inline
Chris@49 4804 arma_warn_unused
Chris@49 4805 const eT*
Chris@49 4806 Mat<eT>::memptr() const
Chris@49 4807 {
Chris@49 4808 return mem;
Chris@49 4809 }
Chris@49 4810
Chris@49 4811
Chris@49 4812
Chris@49 4813 //! print contents of the matrix (to the cout stream),
Chris@49 4814 //! optionally preceding with a user specified line of text.
Chris@49 4815 //! the precision and cell width are modified.
Chris@49 4816 //! on return, the stream's state are restored to their original values.
Chris@49 4817 template<typename eT>
Chris@49 4818 inline
Chris@49 4819 void
Chris@49 4820 Mat<eT>::impl_print(const std::string& extra_text) const
Chris@49 4821 {
Chris@49 4822 arma_extra_debug_sigprint();
Chris@49 4823
Chris@49 4824 if(extra_text.length() != 0)
Chris@49 4825 {
Chris@49 4826 const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();
Chris@49 4827
Chris@49 4828 ARMA_DEFAULT_OSTREAM << extra_text << '\n';
Chris@49 4829
Chris@49 4830 ARMA_DEFAULT_OSTREAM.width(orig_width);
Chris@49 4831 }
Chris@49 4832
Chris@49 4833 arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, true);
Chris@49 4834 }
Chris@49 4835
Chris@49 4836
Chris@49 4837
Chris@49 4838 //! print contents of the matrix to a user specified stream,
Chris@49 4839 //! optionally preceding with a user specified line of text.
Chris@49 4840 //! the precision and cell width are modified.
Chris@49 4841 //! on return, the stream's state are restored to their original values.
Chris@49 4842 template<typename eT>
Chris@49 4843 inline
Chris@49 4844 void
Chris@49 4845 Mat<eT>::impl_print(std::ostream& user_stream, const std::string& extra_text) const
Chris@49 4846 {
Chris@49 4847 arma_extra_debug_sigprint();
Chris@49 4848
Chris@49 4849 if(extra_text.length() != 0)
Chris@49 4850 {
Chris@49 4851 const std::streamsize orig_width = user_stream.width();
Chris@49 4852
Chris@49 4853 user_stream << extra_text << '\n';
Chris@49 4854
Chris@49 4855 user_stream.width(orig_width);
Chris@49 4856 }
Chris@49 4857
Chris@49 4858 arma_ostream::print(user_stream, *this, true);
Chris@49 4859 }
Chris@49 4860
Chris@49 4861
Chris@49 4862
Chris@49 4863 //! print contents of the matrix (to the cout stream),
Chris@49 4864 //! optionally preceding with a user specified line of text.
Chris@49 4865 //! the stream's state are used as is and are not modified
Chris@49 4866 //! (i.e. the precision and cell width are not modified).
Chris@49 4867 template<typename eT>
Chris@49 4868 inline
Chris@49 4869 void
Chris@49 4870 Mat<eT>::impl_raw_print(const std::string& extra_text) const
Chris@49 4871 {
Chris@49 4872 arma_extra_debug_sigprint();
Chris@49 4873
Chris@49 4874 if(extra_text.length() != 0)
Chris@49 4875 {
Chris@49 4876 const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();
Chris@49 4877
Chris@49 4878 ARMA_DEFAULT_OSTREAM << extra_text << '\n';
Chris@49 4879
Chris@49 4880 ARMA_DEFAULT_OSTREAM.width(orig_width);
Chris@49 4881 }
Chris@49 4882
Chris@49 4883 arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, false);
Chris@49 4884 }
Chris@49 4885
Chris@49 4886
Chris@49 4887
Chris@49 4888 //! print contents of the matrix to a user specified stream,
Chris@49 4889 //! optionally preceding with a user specified line of text.
Chris@49 4890 //! the stream's state are used as is and are not modified.
Chris@49 4891 //! (i.e. the precision and cell width are not modified).
Chris@49 4892 template<typename eT>
Chris@49 4893 inline
Chris@49 4894 void
Chris@49 4895 Mat<eT>::impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const
Chris@49 4896 {
Chris@49 4897 arma_extra_debug_sigprint();
Chris@49 4898
Chris@49 4899 if(extra_text.length() != 0)
Chris@49 4900 {
Chris@49 4901 const std::streamsize orig_width = user_stream.width();
Chris@49 4902
Chris@49 4903 user_stream << extra_text << '\n';
Chris@49 4904
Chris@49 4905 user_stream.width(orig_width);
Chris@49 4906 }
Chris@49 4907
Chris@49 4908 arma_ostream::print(user_stream, *this, false);
Chris@49 4909 }
Chris@49 4910
Chris@49 4911
Chris@49 4912
Chris@49 4913 //! change the matrix to have user specified dimensions (data is not preserved)
Chris@49 4914 template<typename eT>
Chris@49 4915 inline
Chris@49 4916 void
Chris@49 4917 Mat<eT>::set_size(const uword in_elem)
Chris@49 4918 {
Chris@49 4919 arma_extra_debug_sigprint();
Chris@49 4920
Chris@49 4921 switch(vec_state)
Chris@49 4922 {
Chris@49 4923 case 0:
Chris@49 4924 case 1:
Chris@49 4925 init_warm(in_elem, 1);
Chris@49 4926 break;
Chris@49 4927
Chris@49 4928 case 2:
Chris@49 4929 init_warm(1, in_elem);
Chris@49 4930 break;
Chris@49 4931
Chris@49 4932 default:
Chris@49 4933 ;
Chris@49 4934 }
Chris@49 4935 }
Chris@49 4936
Chris@49 4937
Chris@49 4938
Chris@49 4939 //! change the matrix to have user specified dimensions (data is not preserved)
Chris@49 4940 template<typename eT>
Chris@49 4941 inline
Chris@49 4942 void
Chris@49 4943 Mat<eT>::set_size(const uword in_rows, const uword in_cols)
Chris@49 4944 {
Chris@49 4945 arma_extra_debug_sigprint();
Chris@49 4946
Chris@49 4947 init_warm(in_rows, in_cols);
Chris@49 4948 }
Chris@49 4949
Chris@49 4950
Chris@49 4951
Chris@49 4952 //! change the matrix to have user specified dimensions (data is preserved)
Chris@49 4953 template<typename eT>
Chris@49 4954 inline
Chris@49 4955 void
Chris@49 4956 Mat<eT>::resize(const uword in_elem)
Chris@49 4957 {
Chris@49 4958 arma_extra_debug_sigprint();
Chris@49 4959
Chris@49 4960 switch(vec_state)
Chris@49 4961 {
Chris@49 4962 case 0:
Chris@49 4963 case 1:
Chris@49 4964 (*this).resize(in_elem, 1);
Chris@49 4965 break;
Chris@49 4966
Chris@49 4967 case 2:
Chris@49 4968 (*this).resize(1, in_elem);
Chris@49 4969 break;
Chris@49 4970
Chris@49 4971 default:
Chris@49 4972 ;
Chris@49 4973 }
Chris@49 4974 }
Chris@49 4975
Chris@49 4976
Chris@49 4977
Chris@49 4978 //! change the matrix to have user specified dimensions (data is preserved)
Chris@49 4979 template<typename eT>
Chris@49 4980 inline
Chris@49 4981 void
Chris@49 4982 Mat<eT>::resize(const uword in_rows, const uword in_cols)
Chris@49 4983 {
Chris@49 4984 arma_extra_debug_sigprint();
Chris@49 4985
Chris@49 4986 *this = arma::resize(*this, in_rows, in_cols);
Chris@49 4987 }
Chris@49 4988
Chris@49 4989
Chris@49 4990
Chris@49 4991 //! change the matrix to have user specified dimensions (data is preserved)
Chris@49 4992 template<typename eT>
Chris@49 4993 inline
Chris@49 4994 void
Chris@49 4995 Mat<eT>::reshape(const uword in_rows, const uword in_cols, const uword dim)
Chris@49 4996 {
Chris@49 4997 arma_extra_debug_sigprint();
Chris@49 4998
Chris@49 4999 *this = arma::reshape(*this, in_rows, in_cols, dim);
Chris@49 5000 }
Chris@49 5001
Chris@49 5002
Chris@49 5003
Chris@49 5004 //! change the matrix (without preserving data) to have the same dimensions as the given expression
Chris@49 5005 template<typename eT>
Chris@49 5006 template<typename eT2, typename expr>
Chris@49 5007 inline
Chris@49 5008 void
Chris@49 5009 Mat<eT>::copy_size(const Base<eT2, expr>& X)
Chris@49 5010 {
Chris@49 5011 arma_extra_debug_sigprint();
Chris@49 5012
Chris@49 5013 const Proxy<expr> P(X.get_ref());
Chris@49 5014
Chris@49 5015 const uword X_n_rows = P.get_n_rows();
Chris@49 5016 const uword X_n_cols = P.get_n_cols();
Chris@49 5017
Chris@49 5018 init_warm(X_n_rows, X_n_cols);
Chris@49 5019 }
Chris@49 5020
Chris@49 5021
Chris@49 5022
Chris@49 5023 //! transform each element in the matrix using a functor
Chris@49 5024 template<typename eT>
Chris@49 5025 template<typename functor>
Chris@49 5026 inline
Chris@49 5027 const Mat<eT>&
Chris@49 5028 Mat<eT>::transform(functor F)
Chris@49 5029 {
Chris@49 5030 arma_extra_debug_sigprint();
Chris@49 5031
Chris@49 5032 eT* out_mem = memptr();
Chris@49 5033
Chris@49 5034 const uword N = n_elem;
Chris@49 5035
Chris@49 5036 uword ii, jj;
Chris@49 5037
Chris@49 5038 for(ii=0, jj=1; jj < N; ii+=2, jj+=2)
Chris@49 5039 {
Chris@49 5040 eT tmp_ii = out_mem[ii];
Chris@49 5041 eT tmp_jj = out_mem[jj];
Chris@49 5042
Chris@49 5043 tmp_ii = eT( F(tmp_ii) );
Chris@49 5044 tmp_jj = eT( F(tmp_jj) );
Chris@49 5045
Chris@49 5046 out_mem[ii] = tmp_ii;
Chris@49 5047 out_mem[jj] = tmp_jj;
Chris@49 5048 }
Chris@49 5049
Chris@49 5050 if(ii < N)
Chris@49 5051 {
Chris@49 5052 out_mem[ii] = eT( F(out_mem[ii]) );
Chris@49 5053 }
Chris@49 5054
Chris@49 5055 return *this;
Chris@49 5056 }
Chris@49 5057
Chris@49 5058
Chris@49 5059
Chris@49 5060 //! imbue (fill) the matrix with values provided by a functor
Chris@49 5061 template<typename eT>
Chris@49 5062 template<typename functor>
Chris@49 5063 inline
Chris@49 5064 const Mat<eT>&
Chris@49 5065 Mat<eT>::imbue(functor F)
Chris@49 5066 {
Chris@49 5067 arma_extra_debug_sigprint();
Chris@49 5068
Chris@49 5069 eT* out_mem = memptr();
Chris@49 5070
Chris@49 5071 const uword N = n_elem;
Chris@49 5072
Chris@49 5073 uword ii, jj;
Chris@49 5074
Chris@49 5075 for(ii=0, jj=1; jj < N; ii+=2, jj+=2)
Chris@49 5076 {
Chris@49 5077 const eT tmp_ii = eT( F() );
Chris@49 5078 const eT tmp_jj = eT( F() );
Chris@49 5079
Chris@49 5080 out_mem[ii] = tmp_ii;
Chris@49 5081 out_mem[jj] = tmp_jj;
Chris@49 5082 }
Chris@49 5083
Chris@49 5084 if(ii < N)
Chris@49 5085 {
Chris@49 5086 out_mem[ii] = eT( F() );
Chris@49 5087 }
Chris@49 5088
Chris@49 5089 return *this;
Chris@49 5090 }
Chris@49 5091
Chris@49 5092
Chris@49 5093
Chris@49 5094 //! fill the matrix with the specified value
Chris@49 5095 template<typename eT>
Chris@49 5096 arma_hot
Chris@49 5097 inline
Chris@49 5098 const Mat<eT>&
Chris@49 5099 Mat<eT>::fill(const eT val)
Chris@49 5100 {
Chris@49 5101 arma_extra_debug_sigprint();
Chris@49 5102
Chris@49 5103 arrayops::inplace_set( memptr(), val, n_elem );
Chris@49 5104
Chris@49 5105 return *this;
Chris@49 5106 }
Chris@49 5107
Chris@49 5108
Chris@49 5109
Chris@49 5110 template<typename eT>
Chris@49 5111 inline
Chris@49 5112 const Mat<eT>&
Chris@49 5113 Mat<eT>::zeros()
Chris@49 5114 {
Chris@49 5115 arma_extra_debug_sigprint();
Chris@49 5116
Chris@49 5117 return fill(eT(0));
Chris@49 5118 }
Chris@49 5119
Chris@49 5120
Chris@49 5121
Chris@49 5122 template<typename eT>
Chris@49 5123 inline
Chris@49 5124 const Mat<eT>&
Chris@49 5125 Mat<eT>::zeros(const uword in_elem)
Chris@49 5126 {
Chris@49 5127 arma_extra_debug_sigprint();
Chris@49 5128
Chris@49 5129 set_size(in_elem);
Chris@49 5130
Chris@49 5131 return fill(eT(0));
Chris@49 5132 }
Chris@49 5133
Chris@49 5134
Chris@49 5135
Chris@49 5136 template<typename eT>
Chris@49 5137 inline
Chris@49 5138 const Mat<eT>&
Chris@49 5139 Mat<eT>::zeros(const uword in_rows, const uword in_cols)
Chris@49 5140 {
Chris@49 5141 arma_extra_debug_sigprint();
Chris@49 5142
Chris@49 5143 set_size(in_rows, in_cols);
Chris@49 5144
Chris@49 5145 return fill(eT(0));
Chris@49 5146 }
Chris@49 5147
Chris@49 5148
Chris@49 5149
Chris@49 5150 template<typename eT>
Chris@49 5151 inline
Chris@49 5152 const Mat<eT>&
Chris@49 5153 Mat<eT>::ones()
Chris@49 5154 {
Chris@49 5155 arma_extra_debug_sigprint();
Chris@49 5156
Chris@49 5157 return fill(eT(1));
Chris@49 5158 }
Chris@49 5159
Chris@49 5160
Chris@49 5161
Chris@49 5162 template<typename eT>
Chris@49 5163 inline
Chris@49 5164 const Mat<eT>&
Chris@49 5165 Mat<eT>::ones(const uword in_elem)
Chris@49 5166 {
Chris@49 5167 arma_extra_debug_sigprint();
Chris@49 5168
Chris@49 5169 set_size(in_elem);
Chris@49 5170
Chris@49 5171 return fill(eT(1));
Chris@49 5172 }
Chris@49 5173
Chris@49 5174
Chris@49 5175
Chris@49 5176 template<typename eT>
Chris@49 5177 inline
Chris@49 5178 const Mat<eT>&
Chris@49 5179 Mat<eT>::ones(const uword in_rows, const uword in_cols)
Chris@49 5180 {
Chris@49 5181 arma_extra_debug_sigprint();
Chris@49 5182
Chris@49 5183 set_size(in_rows, in_cols);
Chris@49 5184
Chris@49 5185 return fill(eT(1));
Chris@49 5186 }
Chris@49 5187
Chris@49 5188
Chris@49 5189
Chris@49 5190 template<typename eT>
Chris@49 5191 inline
Chris@49 5192 const Mat<eT>&
Chris@49 5193 Mat<eT>::randu()
Chris@49 5194 {
Chris@49 5195 arma_extra_debug_sigprint();
Chris@49 5196
Chris@49 5197 eop_aux_randu<eT>::fill( memptr(), n_elem );
Chris@49 5198
Chris@49 5199 return *this;
Chris@49 5200 }
Chris@49 5201
Chris@49 5202
Chris@49 5203
Chris@49 5204 template<typename eT>
Chris@49 5205 inline
Chris@49 5206 const Mat<eT>&
Chris@49 5207 Mat<eT>::randu(const uword in_elem)
Chris@49 5208 {
Chris@49 5209 arma_extra_debug_sigprint();
Chris@49 5210
Chris@49 5211 set_size(in_elem);
Chris@49 5212
Chris@49 5213 return (*this).randu();
Chris@49 5214 }
Chris@49 5215
Chris@49 5216
Chris@49 5217
Chris@49 5218 template<typename eT>
Chris@49 5219 inline
Chris@49 5220 const Mat<eT>&
Chris@49 5221 Mat<eT>::randu(const uword in_rows, const uword in_cols)
Chris@49 5222 {
Chris@49 5223 arma_extra_debug_sigprint();
Chris@49 5224
Chris@49 5225 set_size(in_rows, in_cols);
Chris@49 5226
Chris@49 5227 return (*this).randu();
Chris@49 5228 }
Chris@49 5229
Chris@49 5230
Chris@49 5231
Chris@49 5232 template<typename eT>
Chris@49 5233 inline
Chris@49 5234 const Mat<eT>&
Chris@49 5235 Mat<eT>::randn()
Chris@49 5236 {
Chris@49 5237 arma_extra_debug_sigprint();
Chris@49 5238
Chris@49 5239 eop_aux_randn<eT>::fill( memptr(), n_elem );
Chris@49 5240
Chris@49 5241 return *this;
Chris@49 5242 }
Chris@49 5243
Chris@49 5244
Chris@49 5245
Chris@49 5246 template<typename eT>
Chris@49 5247 inline
Chris@49 5248 const Mat<eT>&
Chris@49 5249 Mat<eT>::randn(const uword in_elem)
Chris@49 5250 {
Chris@49 5251 arma_extra_debug_sigprint();
Chris@49 5252
Chris@49 5253 set_size(in_elem);
Chris@49 5254
Chris@49 5255 return (*this).randn();
Chris@49 5256 }
Chris@49 5257
Chris@49 5258
Chris@49 5259
Chris@49 5260 template<typename eT>
Chris@49 5261 inline
Chris@49 5262 const Mat<eT>&
Chris@49 5263 Mat<eT>::randn(const uword in_rows, const uword in_cols)
Chris@49 5264 {
Chris@49 5265 arma_extra_debug_sigprint();
Chris@49 5266
Chris@49 5267 set_size(in_rows, in_cols);
Chris@49 5268
Chris@49 5269 return (*this).randn();
Chris@49 5270 }
Chris@49 5271
Chris@49 5272
Chris@49 5273
Chris@49 5274 template<typename eT>
Chris@49 5275 inline
Chris@49 5276 const Mat<eT>&
Chris@49 5277 Mat<eT>::eye()
Chris@49 5278 {
Chris@49 5279 arma_extra_debug_sigprint();
Chris@49 5280
Chris@49 5281 fill(eT(0));
Chris@49 5282
Chris@49 5283 const uword N = (std::min)(n_rows, n_cols);
Chris@49 5284
Chris@49 5285 for(uword ii=0; ii<N; ++ii)
Chris@49 5286 {
Chris@49 5287 at(ii,ii) = eT(1);
Chris@49 5288 }
Chris@49 5289
Chris@49 5290 return *this;
Chris@49 5291 }
Chris@49 5292
Chris@49 5293
Chris@49 5294
Chris@49 5295 template<typename eT>
Chris@49 5296 inline
Chris@49 5297 const Mat<eT>&
Chris@49 5298 Mat<eT>::eye(const uword in_rows, const uword in_cols)
Chris@49 5299 {
Chris@49 5300 arma_extra_debug_sigprint();
Chris@49 5301
Chris@49 5302 set_size(in_rows, in_cols);
Chris@49 5303
Chris@49 5304 return (*this).eye();
Chris@49 5305 }
Chris@49 5306
Chris@49 5307
Chris@49 5308
Chris@49 5309 template<typename eT>
Chris@49 5310 inline
Chris@49 5311 void
Chris@49 5312 Mat<eT>::reset()
Chris@49 5313 {
Chris@49 5314 arma_extra_debug_sigprint();
Chris@49 5315
Chris@49 5316 switch(vec_state)
Chris@49 5317 {
Chris@49 5318 default:
Chris@49 5319 init_warm(0, 0);
Chris@49 5320 break;
Chris@49 5321
Chris@49 5322 case 1:
Chris@49 5323 init_warm(0, 1);
Chris@49 5324 break;
Chris@49 5325
Chris@49 5326 case 2:
Chris@49 5327 init_warm(1, 0);
Chris@49 5328 break;
Chris@49 5329 }
Chris@49 5330 }
Chris@49 5331
Chris@49 5332
Chris@49 5333
Chris@49 5334 template<typename eT>
Chris@49 5335 template<typename T1>
Chris@49 5336 inline
Chris@49 5337 void
Chris@49 5338 Mat<eT>::set_real(const Base<typename Mat<eT>::pod_type,T1>& X)
Chris@49 5339 {
Chris@49 5340 arma_extra_debug_sigprint();
Chris@49 5341
Chris@49 5342 Mat_aux::set_real(*this, X);
Chris@49 5343 }
Chris@49 5344
Chris@49 5345
Chris@49 5346
Chris@49 5347 template<typename eT>
Chris@49 5348 template<typename T1>
Chris@49 5349 inline
Chris@49 5350 void
Chris@49 5351 Mat<eT>::set_imag(const Base<typename Mat<eT>::pod_type,T1>& X)
Chris@49 5352 {
Chris@49 5353 arma_extra_debug_sigprint();
Chris@49 5354
Chris@49 5355 Mat_aux::set_imag(*this, X);
Chris@49 5356 }
Chris@49 5357
Chris@49 5358
Chris@49 5359
Chris@49 5360 template<typename eT>
Chris@49 5361 inline
Chris@49 5362 arma_warn_unused
Chris@49 5363 eT
Chris@49 5364 Mat<eT>::min() const
Chris@49 5365 {
Chris@49 5366 arma_extra_debug_sigprint();
Chris@49 5367
Chris@49 5368 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
Chris@49 5369
Chris@49 5370 return op_min::direct_min(memptr(), n_elem);
Chris@49 5371 }
Chris@49 5372
Chris@49 5373
Chris@49 5374
Chris@49 5375 template<typename eT>
Chris@49 5376 inline
Chris@49 5377 arma_warn_unused
Chris@49 5378 eT
Chris@49 5379 Mat<eT>::max() const
Chris@49 5380 {
Chris@49 5381 arma_extra_debug_sigprint();
Chris@49 5382
Chris@49 5383 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
Chris@49 5384
Chris@49 5385 return op_max::direct_max(memptr(), n_elem);
Chris@49 5386 }
Chris@49 5387
Chris@49 5388
Chris@49 5389
Chris@49 5390 template<typename eT>
Chris@49 5391 inline
Chris@49 5392 eT
Chris@49 5393 Mat<eT>::min(uword& index_of_min_val) const
Chris@49 5394 {
Chris@49 5395 arma_extra_debug_sigprint();
Chris@49 5396
Chris@49 5397 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
Chris@49 5398
Chris@49 5399 return op_min::direct_min(memptr(), n_elem, index_of_min_val);
Chris@49 5400 }
Chris@49 5401
Chris@49 5402
Chris@49 5403
Chris@49 5404 template<typename eT>
Chris@49 5405 inline
Chris@49 5406 eT
Chris@49 5407 Mat<eT>::max(uword& index_of_max_val) const
Chris@49 5408 {
Chris@49 5409 arma_extra_debug_sigprint();
Chris@49 5410
Chris@49 5411 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
Chris@49 5412
Chris@49 5413 return op_max::direct_max(memptr(), n_elem, index_of_max_val);
Chris@49 5414 }
Chris@49 5415
Chris@49 5416
Chris@49 5417
Chris@49 5418 template<typename eT>
Chris@49 5419 inline
Chris@49 5420 eT
Chris@49 5421 Mat<eT>::min(uword& row_of_min_val, uword& col_of_min_val) const
Chris@49 5422 {
Chris@49 5423 arma_extra_debug_sigprint();
Chris@49 5424
Chris@49 5425 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
Chris@49 5426
Chris@49 5427 uword iq;
Chris@49 5428
Chris@49 5429 eT val = op_min::direct_min(memptr(), n_elem, iq);
Chris@49 5430
Chris@49 5431 row_of_min_val = iq % n_rows;
Chris@49 5432 col_of_min_val = iq / n_rows;
Chris@49 5433
Chris@49 5434 return val;
Chris@49 5435 }
Chris@49 5436
Chris@49 5437
Chris@49 5438
Chris@49 5439 template<typename eT>
Chris@49 5440 inline
Chris@49 5441 eT
Chris@49 5442 Mat<eT>::max(uword& row_of_max_val, uword& col_of_max_val) const
Chris@49 5443 {
Chris@49 5444 arma_extra_debug_sigprint();
Chris@49 5445
Chris@49 5446 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
Chris@49 5447
Chris@49 5448 uword iq;
Chris@49 5449
Chris@49 5450 eT val = op_max::direct_max(memptr(), n_elem, iq);
Chris@49 5451
Chris@49 5452 row_of_max_val = iq % n_rows;
Chris@49 5453 col_of_max_val = iq / n_rows;
Chris@49 5454
Chris@49 5455 return val;
Chris@49 5456 }
Chris@49 5457
Chris@49 5458
Chris@49 5459
Chris@49 5460 //! save the matrix to a file
Chris@49 5461 template<typename eT>
Chris@49 5462 inline
Chris@49 5463 bool
Chris@49 5464 Mat<eT>::save(const std::string name, const file_type type, const bool print_status) const
Chris@49 5465 {
Chris@49 5466 arma_extra_debug_sigprint();
Chris@49 5467
Chris@49 5468 bool save_okay;
Chris@49 5469
Chris@49 5470 switch(type)
Chris@49 5471 {
Chris@49 5472 case raw_ascii:
Chris@49 5473 save_okay = diskio::save_raw_ascii(*this, name);
Chris@49 5474 break;
Chris@49 5475
Chris@49 5476 case arma_ascii:
Chris@49 5477 save_okay = diskio::save_arma_ascii(*this, name);
Chris@49 5478 break;
Chris@49 5479
Chris@49 5480 case csv_ascii:
Chris@49 5481 save_okay = diskio::save_csv_ascii(*this, name);
Chris@49 5482 break;
Chris@49 5483
Chris@49 5484 case raw_binary:
Chris@49 5485 save_okay = diskio::save_raw_binary(*this, name);
Chris@49 5486 break;
Chris@49 5487
Chris@49 5488 case arma_binary:
Chris@49 5489 save_okay = diskio::save_arma_binary(*this, name);
Chris@49 5490 break;
Chris@49 5491
Chris@49 5492 case pgm_binary:
Chris@49 5493 save_okay = diskio::save_pgm_binary(*this, name);
Chris@49 5494 break;
Chris@49 5495
Chris@49 5496 case hdf5_binary:
Chris@49 5497 save_okay = diskio::save_hdf5_binary(*this, name);
Chris@49 5498 break;
Chris@49 5499
Chris@49 5500 default:
Chris@49 5501 arma_warn(print_status, "Mat::save(): unsupported file type");
Chris@49 5502 save_okay = false;
Chris@49 5503 }
Chris@49 5504
Chris@49 5505 arma_warn( (print_status && (save_okay == false)), "Mat::save(): couldn't write to ", name);
Chris@49 5506
Chris@49 5507 return save_okay;
Chris@49 5508 }
Chris@49 5509
Chris@49 5510
Chris@49 5511
Chris@49 5512 //! save the matrix to a stream
Chris@49 5513 template<typename eT>
Chris@49 5514 inline
Chris@49 5515 bool
Chris@49 5516 Mat<eT>::save(std::ostream& os, const file_type type, const bool print_status) const
Chris@49 5517 {
Chris@49 5518 arma_extra_debug_sigprint();
Chris@49 5519
Chris@49 5520 bool save_okay;
Chris@49 5521
Chris@49 5522 switch(type)
Chris@49 5523 {
Chris@49 5524 case raw_ascii:
Chris@49 5525 save_okay = diskio::save_raw_ascii(*this, os);
Chris@49 5526 break;
Chris@49 5527
Chris@49 5528 case arma_ascii:
Chris@49 5529 save_okay = diskio::save_arma_ascii(*this, os);
Chris@49 5530 break;
Chris@49 5531
Chris@49 5532 case csv_ascii:
Chris@49 5533 save_okay = diskio::save_csv_ascii(*this, os);
Chris@49 5534 break;
Chris@49 5535
Chris@49 5536 case raw_binary:
Chris@49 5537 save_okay = diskio::save_raw_binary(*this, os);
Chris@49 5538 break;
Chris@49 5539
Chris@49 5540 case arma_binary:
Chris@49 5541 save_okay = diskio::save_arma_binary(*this, os);
Chris@49 5542 break;
Chris@49 5543
Chris@49 5544 case pgm_binary:
Chris@49 5545 save_okay = diskio::save_pgm_binary(*this, os);
Chris@49 5546 break;
Chris@49 5547
Chris@49 5548 default:
Chris@49 5549 arma_warn(print_status, "Mat::save(): unsupported file type");
Chris@49 5550 save_okay = false;
Chris@49 5551 }
Chris@49 5552
Chris@49 5553 arma_warn( (print_status && (save_okay == false)), "Mat::save(): couldn't write to the given stream");
Chris@49 5554
Chris@49 5555 return save_okay;
Chris@49 5556 }
Chris@49 5557
Chris@49 5558
Chris@49 5559
Chris@49 5560 //! load a matrix from a file
Chris@49 5561 template<typename eT>
Chris@49 5562 inline
Chris@49 5563 bool
Chris@49 5564 Mat<eT>::load(const std::string name, const file_type type, const bool print_status)
Chris@49 5565 {
Chris@49 5566 arma_extra_debug_sigprint();
Chris@49 5567
Chris@49 5568 bool load_okay;
Chris@49 5569 std::string err_msg;
Chris@49 5570
Chris@49 5571 switch(type)
Chris@49 5572 {
Chris@49 5573 case auto_detect:
Chris@49 5574 load_okay = diskio::load_auto_detect(*this, name, err_msg);
Chris@49 5575 break;
Chris@49 5576
Chris@49 5577 case raw_ascii:
Chris@49 5578 load_okay = diskio::load_raw_ascii(*this, name, err_msg);
Chris@49 5579 break;
Chris@49 5580
Chris@49 5581 case arma_ascii:
Chris@49 5582 load_okay = diskio::load_arma_ascii(*this, name, err_msg);
Chris@49 5583 break;
Chris@49 5584
Chris@49 5585 case csv_ascii:
Chris@49 5586 load_okay = diskio::load_csv_ascii(*this, name, err_msg);
Chris@49 5587 break;
Chris@49 5588
Chris@49 5589 case raw_binary:
Chris@49 5590 load_okay = diskio::load_raw_binary(*this, name, err_msg);
Chris@49 5591 break;
Chris@49 5592
Chris@49 5593 case arma_binary:
Chris@49 5594 load_okay = diskio::load_arma_binary(*this, name, err_msg);
Chris@49 5595 break;
Chris@49 5596
Chris@49 5597 case pgm_binary:
Chris@49 5598 load_okay = diskio::load_pgm_binary(*this, name, err_msg);
Chris@49 5599 break;
Chris@49 5600
Chris@49 5601 case hdf5_binary:
Chris@49 5602 load_okay = diskio::load_hdf5_binary(*this, name, err_msg);
Chris@49 5603 break;
Chris@49 5604
Chris@49 5605 default:
Chris@49 5606 arma_warn(print_status, "Mat::load(): unsupported file type");
Chris@49 5607 load_okay = false;
Chris@49 5608 }
Chris@49 5609
Chris@49 5610 if( (print_status == true) && (load_okay == false) )
Chris@49 5611 {
Chris@49 5612 if(err_msg.length() > 0)
Chris@49 5613 {
Chris@49 5614 arma_warn(true, "Mat::load(): ", err_msg, name);
Chris@49 5615 }
Chris@49 5616 else
Chris@49 5617 {
Chris@49 5618 arma_warn(true, "Mat::load(): couldn't read ", name);
Chris@49 5619 }
Chris@49 5620 }
Chris@49 5621
Chris@49 5622 if(load_okay == false)
Chris@49 5623 {
Chris@49 5624 (*this).reset();
Chris@49 5625 }
Chris@49 5626
Chris@49 5627 return load_okay;
Chris@49 5628 }
Chris@49 5629
Chris@49 5630
Chris@49 5631
Chris@49 5632 //! load a matrix from a stream
Chris@49 5633 template<typename eT>
Chris@49 5634 inline
Chris@49 5635 bool
Chris@49 5636 Mat<eT>::load(std::istream& is, const file_type type, const bool print_status)
Chris@49 5637 {
Chris@49 5638 arma_extra_debug_sigprint();
Chris@49 5639
Chris@49 5640 bool load_okay;
Chris@49 5641 std::string err_msg;
Chris@49 5642
Chris@49 5643 switch(type)
Chris@49 5644 {
Chris@49 5645 case auto_detect:
Chris@49 5646 load_okay = diskio::load_auto_detect(*this, is, err_msg);
Chris@49 5647 break;
Chris@49 5648
Chris@49 5649 case raw_ascii:
Chris@49 5650 load_okay = diskio::load_raw_ascii(*this, is, err_msg);
Chris@49 5651 break;
Chris@49 5652
Chris@49 5653 case arma_ascii:
Chris@49 5654 load_okay = diskio::load_arma_ascii(*this, is, err_msg);
Chris@49 5655 break;
Chris@49 5656
Chris@49 5657 case csv_ascii:
Chris@49 5658 load_okay = diskio::load_csv_ascii(*this, is, err_msg);
Chris@49 5659 break;
Chris@49 5660
Chris@49 5661 case raw_binary:
Chris@49 5662 load_okay = diskio::load_raw_binary(*this, is, err_msg);
Chris@49 5663 break;
Chris@49 5664
Chris@49 5665 case arma_binary:
Chris@49 5666 load_okay = diskio::load_arma_binary(*this, is, err_msg);
Chris@49 5667 break;
Chris@49 5668
Chris@49 5669 case pgm_binary:
Chris@49 5670 load_okay = diskio::load_pgm_binary(*this, is, err_msg);
Chris@49 5671 break;
Chris@49 5672
Chris@49 5673 default:
Chris@49 5674 arma_warn(print_status, "Mat::load(): unsupported file type");
Chris@49 5675 load_okay = false;
Chris@49 5676 }
Chris@49 5677
Chris@49 5678
Chris@49 5679 if( (print_status == true) && (load_okay == false) )
Chris@49 5680 {
Chris@49 5681 if(err_msg.length() > 0)
Chris@49 5682 {
Chris@49 5683 arma_warn(true, "Mat::load(): ", err_msg, "the given stream");
Chris@49 5684 }
Chris@49 5685 else
Chris@49 5686 {
Chris@49 5687 arma_warn(true, "Mat::load(): couldn't load from the given stream");
Chris@49 5688 }
Chris@49 5689 }
Chris@49 5690
Chris@49 5691 if(load_okay == false)
Chris@49 5692 {
Chris@49 5693 (*this).reset();
Chris@49 5694 }
Chris@49 5695
Chris@49 5696 return load_okay;
Chris@49 5697 }
Chris@49 5698
Chris@49 5699
Chris@49 5700
Chris@49 5701 //! save the matrix to a file, without printing any error messages
Chris@49 5702 template<typename eT>
Chris@49 5703 inline
Chris@49 5704 bool
Chris@49 5705 Mat<eT>::quiet_save(const std::string name, const file_type type) const
Chris@49 5706 {
Chris@49 5707 arma_extra_debug_sigprint();
Chris@49 5708
Chris@49 5709 return (*this).save(name, type, false);
Chris@49 5710 }
Chris@49 5711
Chris@49 5712
Chris@49 5713
Chris@49 5714 //! save the matrix to a stream, without printing any error messages
Chris@49 5715 template<typename eT>
Chris@49 5716 inline
Chris@49 5717 bool
Chris@49 5718 Mat<eT>::quiet_save(std::ostream& os, const file_type type) const
Chris@49 5719 {
Chris@49 5720 arma_extra_debug_sigprint();
Chris@49 5721
Chris@49 5722 return (*this).save(os, type, false);
Chris@49 5723 }
Chris@49 5724
Chris@49 5725
Chris@49 5726
Chris@49 5727 //! load a matrix from a file, without printing any error messages
Chris@49 5728 template<typename eT>
Chris@49 5729 inline
Chris@49 5730 bool
Chris@49 5731 Mat<eT>::quiet_load(const std::string name, const file_type type)
Chris@49 5732 {
Chris@49 5733 arma_extra_debug_sigprint();
Chris@49 5734
Chris@49 5735 return (*this).load(name, type, false);
Chris@49 5736 }
Chris@49 5737
Chris@49 5738
Chris@49 5739
Chris@49 5740 //! load a matrix from a stream, without printing any error messages
Chris@49 5741 template<typename eT>
Chris@49 5742 inline
Chris@49 5743 bool
Chris@49 5744 Mat<eT>::quiet_load(std::istream& is, const file_type type)
Chris@49 5745 {
Chris@49 5746 arma_extra_debug_sigprint();
Chris@49 5747
Chris@49 5748 return (*this).load(is, type, false);
Chris@49 5749 }
Chris@49 5750
Chris@49 5751
Chris@49 5752
Chris@49 5753 template<typename eT>
Chris@49 5754 inline
Chris@49 5755 Mat<eT>::row_iterator::row_iterator(Mat<eT>& in_M, const uword in_row)
Chris@49 5756 : M (in_M )
Chris@49 5757 , row(in_row)
Chris@49 5758 , col(0 )
Chris@49 5759 {
Chris@49 5760 arma_extra_debug_sigprint();
Chris@49 5761 }
Chris@49 5762
Chris@49 5763
Chris@49 5764
Chris@49 5765 template<typename eT>
Chris@49 5766 inline
Chris@49 5767 eT&
Chris@49 5768 Mat<eT>::row_iterator::operator*()
Chris@49 5769 {
Chris@49 5770 return M.at(row,col);
Chris@49 5771 }
Chris@49 5772
Chris@49 5773
Chris@49 5774
Chris@49 5775 template<typename eT>
Chris@49 5776 inline
Chris@49 5777 typename Mat<eT>::row_iterator&
Chris@49 5778 Mat<eT>::row_iterator::operator++()
Chris@49 5779 {
Chris@49 5780 ++col;
Chris@49 5781
Chris@49 5782 if(col >= M.n_cols)
Chris@49 5783 {
Chris@49 5784 col = 0;
Chris@49 5785 ++row;
Chris@49 5786 }
Chris@49 5787
Chris@49 5788 return *this;
Chris@49 5789 }
Chris@49 5790
Chris@49 5791
Chris@49 5792
Chris@49 5793 template<typename eT>
Chris@49 5794 inline
Chris@49 5795 void
Chris@49 5796 Mat<eT>::row_iterator::operator++(int)
Chris@49 5797 {
Chris@49 5798 operator++();
Chris@49 5799 }
Chris@49 5800
Chris@49 5801
Chris@49 5802
Chris@49 5803 template<typename eT>
Chris@49 5804 inline
Chris@49 5805 typename Mat<eT>::row_iterator&
Chris@49 5806 Mat<eT>::row_iterator::operator--()
Chris@49 5807 {
Chris@49 5808 if(col > 0)
Chris@49 5809 {
Chris@49 5810 --col;
Chris@49 5811 }
Chris@49 5812 else
Chris@49 5813 {
Chris@49 5814 if(row > 0)
Chris@49 5815 {
Chris@49 5816 col = M.n_cols - 1;
Chris@49 5817 --row;
Chris@49 5818 }
Chris@49 5819 }
Chris@49 5820
Chris@49 5821 return *this;
Chris@49 5822 }
Chris@49 5823
Chris@49 5824
Chris@49 5825
Chris@49 5826 template<typename eT>
Chris@49 5827 inline
Chris@49 5828 void
Chris@49 5829 Mat<eT>::row_iterator::operator--(int)
Chris@49 5830 {
Chris@49 5831 operator--();
Chris@49 5832 }
Chris@49 5833
Chris@49 5834
Chris@49 5835
Chris@49 5836 template<typename eT>
Chris@49 5837 inline
Chris@49 5838 bool
Chris@49 5839 Mat<eT>::row_iterator::operator!=(const typename Mat<eT>::row_iterator& X) const
Chris@49 5840 {
Chris@49 5841 return ( (row != X.row) || (col != X.col) ) ? true : false;
Chris@49 5842 }
Chris@49 5843
Chris@49 5844
Chris@49 5845
Chris@49 5846 template<typename eT>
Chris@49 5847 inline
Chris@49 5848 bool
Chris@49 5849 Mat<eT>::row_iterator::operator==(const typename Mat<eT>::row_iterator& X) const
Chris@49 5850 {
Chris@49 5851 return ( (row == X.row) && (col == X.col) ) ? true : false;
Chris@49 5852 }
Chris@49 5853
Chris@49 5854
Chris@49 5855
Chris@49 5856 template<typename eT>
Chris@49 5857 inline
Chris@49 5858 Mat<eT>::const_row_iterator::const_row_iterator(const Mat<eT>& in_M, const uword in_row)
Chris@49 5859 : M (in_M )
Chris@49 5860 , row(in_row)
Chris@49 5861 , col(0 )
Chris@49 5862 {
Chris@49 5863 arma_extra_debug_sigprint();
Chris@49 5864 }
Chris@49 5865
Chris@49 5866
Chris@49 5867
Chris@49 5868 template<typename eT>
Chris@49 5869 inline
Chris@49 5870 Mat<eT>::const_row_iterator::const_row_iterator(const typename Mat<eT>::row_iterator& X)
Chris@49 5871 : M (X.M)
Chris@49 5872 , row(X.row)
Chris@49 5873 , col(X.col)
Chris@49 5874 {
Chris@49 5875 arma_extra_debug_sigprint();
Chris@49 5876 }
Chris@49 5877
Chris@49 5878
Chris@49 5879
Chris@49 5880 template<typename eT>
Chris@49 5881 inline
Chris@49 5882 eT
Chris@49 5883 Mat<eT>::const_row_iterator::operator*() const
Chris@49 5884 {
Chris@49 5885 return M.at(row,col);
Chris@49 5886 }
Chris@49 5887
Chris@49 5888
Chris@49 5889
Chris@49 5890 template<typename eT>
Chris@49 5891 inline
Chris@49 5892 typename Mat<eT>::const_row_iterator&
Chris@49 5893 Mat<eT>::const_row_iterator::operator++()
Chris@49 5894 {
Chris@49 5895 ++col;
Chris@49 5896
Chris@49 5897 if(col >= M.n_cols)
Chris@49 5898 {
Chris@49 5899 col = 0;
Chris@49 5900 ++row;
Chris@49 5901 }
Chris@49 5902
Chris@49 5903 return *this;
Chris@49 5904 }
Chris@49 5905
Chris@49 5906
Chris@49 5907
Chris@49 5908 template<typename eT>
Chris@49 5909 inline
Chris@49 5910 void
Chris@49 5911 Mat<eT>::const_row_iterator::operator++(int)
Chris@49 5912 {
Chris@49 5913 operator++();
Chris@49 5914 }
Chris@49 5915
Chris@49 5916
Chris@49 5917
Chris@49 5918 template<typename eT>
Chris@49 5919 inline
Chris@49 5920 typename Mat<eT>::const_row_iterator&
Chris@49 5921 Mat<eT>::const_row_iterator::operator--()
Chris@49 5922 {
Chris@49 5923 if(col > 0)
Chris@49 5924 {
Chris@49 5925 --col;
Chris@49 5926 }
Chris@49 5927 else
Chris@49 5928 {
Chris@49 5929 if(row > 0)
Chris@49 5930 {
Chris@49 5931 col = M.n_cols - 1;
Chris@49 5932 --row;
Chris@49 5933 }
Chris@49 5934 }
Chris@49 5935
Chris@49 5936 return *this;
Chris@49 5937 }
Chris@49 5938
Chris@49 5939
Chris@49 5940
Chris@49 5941 template<typename eT>
Chris@49 5942 inline
Chris@49 5943 void
Chris@49 5944 Mat<eT>::const_row_iterator::operator--(int)
Chris@49 5945 {
Chris@49 5946 operator--();
Chris@49 5947 }
Chris@49 5948
Chris@49 5949
Chris@49 5950
Chris@49 5951 template<typename eT>
Chris@49 5952 inline
Chris@49 5953 bool
Chris@49 5954 Mat<eT>::const_row_iterator::operator!=(const typename Mat<eT>::const_row_iterator& X) const
Chris@49 5955 {
Chris@49 5956 return ( (row != X.row) || (col != X.col) ) ? true : false;
Chris@49 5957 }
Chris@49 5958
Chris@49 5959
Chris@49 5960
Chris@49 5961 template<typename eT>
Chris@49 5962 inline
Chris@49 5963 bool
Chris@49 5964 Mat<eT>::const_row_iterator::operator==(const typename Mat<eT>::const_row_iterator& X) const
Chris@49 5965 {
Chris@49 5966 return ( (row == X.row) && (col == X.col) ) ? true : false;
Chris@49 5967 }
Chris@49 5968
Chris@49 5969
Chris@49 5970
Chris@49 5971 template<typename eT>
Chris@49 5972 inline
Chris@49 5973 typename Mat<eT>::iterator
Chris@49 5974 Mat<eT>::begin()
Chris@49 5975 {
Chris@49 5976 arma_extra_debug_sigprint();
Chris@49 5977
Chris@49 5978 return memptr();
Chris@49 5979 }
Chris@49 5980
Chris@49 5981
Chris@49 5982
Chris@49 5983 template<typename eT>
Chris@49 5984 inline
Chris@49 5985 typename Mat<eT>::const_iterator
Chris@49 5986 Mat<eT>::begin() const
Chris@49 5987 {
Chris@49 5988 arma_extra_debug_sigprint();
Chris@49 5989
Chris@49 5990 return memptr();
Chris@49 5991 }
Chris@49 5992
Chris@49 5993
Chris@49 5994
Chris@49 5995 template<typename eT>
Chris@49 5996 inline
Chris@49 5997 typename Mat<eT>::const_iterator
Chris@49 5998 Mat<eT>::cbegin() const
Chris@49 5999 {
Chris@49 6000 arma_extra_debug_sigprint();
Chris@49 6001
Chris@49 6002 return memptr();
Chris@49 6003 }
Chris@49 6004
Chris@49 6005
Chris@49 6006
Chris@49 6007 template<typename eT>
Chris@49 6008 inline
Chris@49 6009 typename Mat<eT>::iterator
Chris@49 6010 Mat<eT>::end()
Chris@49 6011 {
Chris@49 6012 arma_extra_debug_sigprint();
Chris@49 6013
Chris@49 6014 return memptr() + n_elem;
Chris@49 6015 }
Chris@49 6016
Chris@49 6017
Chris@49 6018
Chris@49 6019 template<typename eT>
Chris@49 6020 inline
Chris@49 6021 typename Mat<eT>::const_iterator
Chris@49 6022 Mat<eT>::end() const
Chris@49 6023 {
Chris@49 6024 arma_extra_debug_sigprint();
Chris@49 6025
Chris@49 6026 return memptr() + n_elem;
Chris@49 6027 }
Chris@49 6028
Chris@49 6029
Chris@49 6030
Chris@49 6031 template<typename eT>
Chris@49 6032 inline
Chris@49 6033 typename Mat<eT>::const_iterator
Chris@49 6034 Mat<eT>::cend() const
Chris@49 6035 {
Chris@49 6036 arma_extra_debug_sigprint();
Chris@49 6037
Chris@49 6038 return memptr() + n_elem;
Chris@49 6039 }
Chris@49 6040
Chris@49 6041
Chris@49 6042
Chris@49 6043 template<typename eT>
Chris@49 6044 inline
Chris@49 6045 typename Mat<eT>::col_iterator
Chris@49 6046 Mat<eT>::begin_col(const uword col_num)
Chris@49 6047 {
Chris@49 6048 arma_extra_debug_sigprint();
Chris@49 6049
Chris@49 6050 arma_debug_check( (col_num >= n_cols), "begin_col(): index out of bounds");
Chris@49 6051
Chris@49 6052 return colptr(col_num);
Chris@49 6053 }
Chris@49 6054
Chris@49 6055
Chris@49 6056
Chris@49 6057 template<typename eT>
Chris@49 6058 inline
Chris@49 6059 typename Mat<eT>::const_col_iterator
Chris@49 6060 Mat<eT>::begin_col(const uword col_num) const
Chris@49 6061 {
Chris@49 6062 arma_extra_debug_sigprint();
Chris@49 6063
Chris@49 6064 arma_debug_check( (col_num >= n_cols), "begin_col(): index out of bounds");
Chris@49 6065
Chris@49 6066 return colptr(col_num);
Chris@49 6067 }
Chris@49 6068
Chris@49 6069
Chris@49 6070
Chris@49 6071 template<typename eT>
Chris@49 6072 inline
Chris@49 6073 typename Mat<eT>::col_iterator
Chris@49 6074 Mat<eT>::end_col(const uword col_num)
Chris@49 6075 {
Chris@49 6076 arma_extra_debug_sigprint();
Chris@49 6077
Chris@49 6078 arma_debug_check( (col_num >= n_cols), "end_col(): index out of bounds");
Chris@49 6079
Chris@49 6080 return colptr(col_num) + n_rows;
Chris@49 6081 }
Chris@49 6082
Chris@49 6083
Chris@49 6084
Chris@49 6085 template<typename eT>
Chris@49 6086 inline
Chris@49 6087 typename Mat<eT>::const_col_iterator
Chris@49 6088 Mat<eT>::end_col(const uword col_num) const
Chris@49 6089 {
Chris@49 6090 arma_extra_debug_sigprint();
Chris@49 6091
Chris@49 6092 arma_debug_check( (col_num >= n_cols), "end_col(): index out of bounds");
Chris@49 6093
Chris@49 6094 return colptr(col_num) + n_rows;
Chris@49 6095 }
Chris@49 6096
Chris@49 6097
Chris@49 6098
Chris@49 6099 template<typename eT>
Chris@49 6100 inline
Chris@49 6101 typename Mat<eT>::row_iterator
Chris@49 6102 Mat<eT>::begin_row(const uword row_num)
Chris@49 6103 {
Chris@49 6104 arma_extra_debug_sigprint();
Chris@49 6105
Chris@49 6106 arma_debug_check( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" );
Chris@49 6107
Chris@49 6108 return typename Mat<eT>::row_iterator(*this, row_num);
Chris@49 6109 }
Chris@49 6110
Chris@49 6111
Chris@49 6112
Chris@49 6113 template<typename eT>
Chris@49 6114 inline
Chris@49 6115 typename Mat<eT>::const_row_iterator
Chris@49 6116 Mat<eT>::begin_row(const uword row_num) const
Chris@49 6117 {
Chris@49 6118 arma_extra_debug_sigprint();
Chris@49 6119
Chris@49 6120 arma_debug_check( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" );
Chris@49 6121
Chris@49 6122 return typename Mat<eT>::const_row_iterator(*this, row_num);
Chris@49 6123 }
Chris@49 6124
Chris@49 6125
Chris@49 6126
Chris@49 6127 template<typename eT>
Chris@49 6128 inline
Chris@49 6129 typename Mat<eT>::row_iterator
Chris@49 6130 Mat<eT>::end_row(const uword row_num)
Chris@49 6131 {
Chris@49 6132 arma_extra_debug_sigprint();
Chris@49 6133
Chris@49 6134 arma_debug_check( (row_num >= n_rows), "Mat::end_row(): index out of bounds" );
Chris@49 6135
Chris@49 6136 return typename Mat<eT>::row_iterator(*this, row_num + 1);
Chris@49 6137 }
Chris@49 6138
Chris@49 6139
Chris@49 6140
Chris@49 6141 template<typename eT>
Chris@49 6142 inline
Chris@49 6143 typename Mat<eT>::const_row_iterator
Chris@49 6144 Mat<eT>::end_row(const uword row_num) const
Chris@49 6145 {
Chris@49 6146 arma_extra_debug_sigprint();
Chris@49 6147
Chris@49 6148 arma_debug_check( (row_num >= n_rows), "Mat::end_row(): index out of bounds" );
Chris@49 6149
Chris@49 6150 return typename Mat<eT>::const_row_iterator(*this, row_num + 1);
Chris@49 6151 }
Chris@49 6152
Chris@49 6153
Chris@49 6154
Chris@49 6155 //! resets this matrix to an empty matrix
Chris@49 6156 template<typename eT>
Chris@49 6157 inline
Chris@49 6158 void
Chris@49 6159 Mat<eT>::clear()
Chris@49 6160 {
Chris@49 6161 reset();
Chris@49 6162 }
Chris@49 6163
Chris@49 6164
Chris@49 6165
Chris@49 6166 //! returns true if the matrix has no elements
Chris@49 6167 template<typename eT>
Chris@49 6168 inline
Chris@49 6169 bool
Chris@49 6170 Mat<eT>::empty() const
Chris@49 6171 {
Chris@49 6172 return (n_elem == 0);
Chris@49 6173 }
Chris@49 6174
Chris@49 6175
Chris@49 6176
Chris@49 6177 //! returns the number of elements in this matrix
Chris@49 6178 template<typename eT>
Chris@49 6179 inline
Chris@49 6180 uword
Chris@49 6181 Mat<eT>::size() const
Chris@49 6182 {
Chris@49 6183 return n_elem;
Chris@49 6184 }
Chris@49 6185
Chris@49 6186
Chris@49 6187
Chris@49 6188 template<typename eT>
Chris@49 6189 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6190 arma_inline
Chris@49 6191 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed()
Chris@49 6192 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6193 {
Chris@49 6194 arma_extra_debug_sigprint_this(this);
Chris@49 6195 }
Chris@49 6196
Chris@49 6197
Chris@49 6198
Chris@49 6199 template<typename eT>
Chris@49 6200 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6201 arma_inline
Chris@49 6202 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const fixed<fixed_n_rows, fixed_n_cols>& X)
Chris@49 6203 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6204 {
Chris@49 6205 arma_extra_debug_sigprint_this(this);
Chris@49 6206
Chris@49 6207 eT* dest = (use_extra) ? mem_local_extra : mem_local;
Chris@49 6208
Chris@49 6209 arrayops::copy( dest, X.mem, fixed_n_elem );
Chris@49 6210 }
Chris@49 6211
Chris@49 6212
Chris@49 6213
Chris@49 6214 template<typename eT>
Chris@49 6215 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6216 template<typename T1>
Chris@49 6217 inline
Chris@49 6218 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<eT,T1>& A)
Chris@49 6219 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6220 {
Chris@49 6221 arma_extra_debug_sigprint_this(this);
Chris@49 6222
Chris@49 6223 Mat<eT>::operator=(A.get_ref());
Chris@49 6224 }
Chris@49 6225
Chris@49 6226
Chris@49 6227
Chris@49 6228 template<typename eT>
Chris@49 6229 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6230 template<typename T1, typename T2>
Chris@49 6231 inline
Chris@49 6232 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)
Chris@49 6233 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6234 {
Chris@49 6235 arma_extra_debug_sigprint_this(this);
Chris@49 6236
Chris@49 6237 Mat<eT>::init(A,B);
Chris@49 6238 }
Chris@49 6239
Chris@49 6240
Chris@49 6241
Chris@49 6242 template<typename eT>
Chris@49 6243 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6244 inline
Chris@49 6245 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const eT* aux_mem)
Chris@49 6246 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6247 {
Chris@49 6248 arma_extra_debug_sigprint_this(this);
Chris@49 6249
Chris@49 6250 eT* dest = (use_extra) ? mem_local_extra : mem_local;
Chris@49 6251
Chris@49 6252 arrayops::copy( dest, aux_mem, fixed_n_elem );
Chris@49 6253 }
Chris@49 6254
Chris@49 6255
Chris@49 6256
Chris@49 6257 template<typename eT>
Chris@49 6258 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6259 inline
Chris@49 6260 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const char* text)
Chris@49 6261 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6262 {
Chris@49 6263 arma_extra_debug_sigprint_this(this);
Chris@49 6264
Chris@49 6265 Mat<eT>::operator=(text);
Chris@49 6266 }
Chris@49 6267
Chris@49 6268
Chris@49 6269
Chris@49 6270 template<typename eT>
Chris@49 6271 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6272 inline
Chris@49 6273 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::string& text)
Chris@49 6274 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6275 {
Chris@49 6276 arma_extra_debug_sigprint_this(this);
Chris@49 6277
Chris@49 6278 Mat<eT>::operator=(text);
Chris@49 6279 }
Chris@49 6280
Chris@49 6281
Chris@49 6282
Chris@49 6283 #if defined(ARMA_USE_CXX11)
Chris@49 6284
Chris@49 6285 template<typename eT>
Chris@49 6286 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6287 inline
Chris@49 6288 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::initializer_list<eT>& list)
Chris@49 6289 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
Chris@49 6290 {
Chris@49 6291 arma_extra_debug_sigprint_this(this);
Chris@49 6292
Chris@49 6293 (*this).operator=(list);
Chris@49 6294 }
Chris@49 6295
Chris@49 6296
Chris@49 6297
Chris@49 6298 template<typename eT>
Chris@49 6299 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6300 inline
Chris@49 6301 const Mat<eT>&
Chris@49 6302 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const std::initializer_list<eT>& list)
Chris@49 6303 {
Chris@49 6304 arma_extra_debug_sigprint();
Chris@49 6305
Chris@49 6306 const uword N = list.size();
Chris@49 6307
Chris@49 6308 arma_debug_check( (N > fixed_n_elem), "Mat::fixed: initialiser list is too long" );
Chris@49 6309
Chris@49 6310 eT* this_mem = (*this).memptr();
Chris@49 6311
Chris@49 6312 arrayops::copy( this_mem, list.begin(), N );
Chris@49 6313
Chris@49 6314 for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); }
Chris@49 6315
Chris@49 6316 return *this;
Chris@49 6317 }
Chris@49 6318
Chris@49 6319 #endif
Chris@49 6320
Chris@49 6321
Chris@49 6322
Chris@49 6323 template<typename eT>
Chris@49 6324 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6325 arma_inline
Chris@49 6326 const Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >
Chris@49 6327 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::t() const
Chris@49 6328 {
Chris@49 6329 return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >(*this);
Chris@49 6330 }
Chris@49 6331
Chris@49 6332
Chris@49 6333
Chris@49 6334 template<typename eT>
Chris@49 6335 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6336 arma_inline
Chris@49 6337 const Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >
Chris@49 6338 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ht() const
Chris@49 6339 {
Chris@49 6340 return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >(*this);
Chris@49 6341 }
Chris@49 6342
Chris@49 6343
Chris@49 6344
Chris@49 6345 template<typename eT>
Chris@49 6346 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6347 arma_inline
Chris@49 6348 const Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_strans >
Chris@49 6349 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::st() const
Chris@49 6350 {
Chris@49 6351 return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_strans >(*this);
Chris@49 6352 }
Chris@49 6353
Chris@49 6354
Chris@49 6355
Chris@49 6356 template<typename eT>
Chris@49 6357 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6358 arma_inline
Chris@49 6359 arma_warn_unused
Chris@49 6360 const eT&
Chris@49 6361 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at_alt(const uword ii) const
Chris@49 6362 {
Chris@49 6363 #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)
Chris@49 6364
Chris@49 6365 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6366
Chris@49 6367 #else
Chris@49 6368 const eT* mem_aligned = (use_extra) ? mem_local_extra : mem_local;
Chris@49 6369
Chris@49 6370 memory::mark_as_aligned(mem_aligned);
Chris@49 6371
Chris@49 6372 return mem_aligned[ii];
Chris@49 6373 #endif
Chris@49 6374 }
Chris@49 6375
Chris@49 6376
Chris@49 6377
Chris@49 6378 template<typename eT>
Chris@49 6379 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6380 arma_inline
Chris@49 6381 arma_warn_unused
Chris@49 6382 eT&
Chris@49 6383 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword ii)
Chris@49 6384 {
Chris@49 6385 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6386 }
Chris@49 6387
Chris@49 6388
Chris@49 6389
Chris@49 6390 template<typename eT>
Chris@49 6391 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6392 arma_inline
Chris@49 6393 arma_warn_unused
Chris@49 6394 const eT&
Chris@49 6395 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword ii) const
Chris@49 6396 {
Chris@49 6397 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6398 }
Chris@49 6399
Chris@49 6400
Chris@49 6401
Chris@49 6402 template<typename eT>
Chris@49 6403 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6404 arma_inline
Chris@49 6405 arma_warn_unused
Chris@49 6406 eT&
Chris@49 6407 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword ii)
Chris@49 6408 {
Chris@49 6409 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6410 }
Chris@49 6411
Chris@49 6412
Chris@49 6413
Chris@49 6414 template<typename eT>
Chris@49 6415 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6416 arma_inline
Chris@49 6417 arma_warn_unused
Chris@49 6418 const eT&
Chris@49 6419 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword ii) const
Chris@49 6420 {
Chris@49 6421 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6422 }
Chris@49 6423
Chris@49 6424
Chris@49 6425
Chris@49 6426 template<typename eT>
Chris@49 6427 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6428 arma_inline
Chris@49 6429 arma_warn_unused
Chris@49 6430 eT&
Chris@49 6431 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword ii)
Chris@49 6432 {
Chris@49 6433 arma_debug_check( (ii >= fixed_n_elem), "Mat::operator(): index out of bounds");
Chris@49 6434
Chris@49 6435 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6436 }
Chris@49 6437
Chris@49 6438
Chris@49 6439
Chris@49 6440 template<typename eT>
Chris@49 6441 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6442 arma_inline
Chris@49 6443 arma_warn_unused
Chris@49 6444 const eT&
Chris@49 6445 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword ii) const
Chris@49 6446 {
Chris@49 6447 arma_debug_check( (ii >= fixed_n_elem), "Mat::operator(): index out of bounds");
Chris@49 6448
Chris@49 6449 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
Chris@49 6450 }
Chris@49 6451
Chris@49 6452
Chris@49 6453
Chris@49 6454 template<typename eT>
Chris@49 6455 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6456 arma_inline
Chris@49 6457 arma_warn_unused
Chris@49 6458 eT&
Chris@49 6459 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col)
Chris@49 6460 {
Chris@49 6461 const uword iq = in_row + in_col*fixed_n_rows;
Chris@49 6462
Chris@49 6463 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
Chris@49 6464 }
Chris@49 6465
Chris@49 6466
Chris@49 6467
Chris@49 6468 template<typename eT>
Chris@49 6469 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6470 arma_inline
Chris@49 6471 arma_warn_unused
Chris@49 6472 const eT&
Chris@49 6473 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col) const
Chris@49 6474 {
Chris@49 6475 const uword iq = in_row + in_col*fixed_n_rows;
Chris@49 6476
Chris@49 6477 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
Chris@49 6478 }
Chris@49 6479
Chris@49 6480
Chris@49 6481
Chris@49 6482 template<typename eT>
Chris@49 6483 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6484 arma_inline
Chris@49 6485 arma_warn_unused
Chris@49 6486 eT&
Chris@49 6487 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col)
Chris@49 6488 {
Chris@49 6489 arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::operator(): index out of bounds");
Chris@49 6490
Chris@49 6491 const uword iq = in_row + in_col*fixed_n_rows;
Chris@49 6492
Chris@49 6493 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
Chris@49 6494 }
Chris@49 6495
Chris@49 6496
Chris@49 6497
Chris@49 6498 template<typename eT>
Chris@49 6499 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6500 arma_inline
Chris@49 6501 arma_warn_unused
Chris@49 6502 const eT&
Chris@49 6503 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col) const
Chris@49 6504 {
Chris@49 6505 arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::operator(): index out of bounds");
Chris@49 6506
Chris@49 6507 const uword iq = in_row + in_col*fixed_n_rows;
Chris@49 6508
Chris@49 6509 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
Chris@49 6510 }
Chris@49 6511
Chris@49 6512
Chris@49 6513
Chris@49 6514 template<typename eT>
Chris@49 6515 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6516 arma_inline
Chris@49 6517 arma_warn_unused
Chris@49 6518 eT*
Chris@49 6519 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::colptr(const uword in_col)
Chris@49 6520 {
Chris@49 6521 eT* mem_actual = (use_extra) ? mem_local_extra : mem_local;
Chris@49 6522
Chris@49 6523 return & access::rw(mem_actual[in_col*fixed_n_rows]);
Chris@49 6524 }
Chris@49 6525
Chris@49 6526
Chris@49 6527
Chris@49 6528 template<typename eT>
Chris@49 6529 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6530 arma_inline
Chris@49 6531 arma_warn_unused
Chris@49 6532 const eT*
Chris@49 6533 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::colptr(const uword in_col) const
Chris@49 6534 {
Chris@49 6535 const eT* mem_actual = (use_extra) ? mem_local_extra : mem_local;
Chris@49 6536
Chris@49 6537 return & mem_actual[in_col*fixed_n_rows];
Chris@49 6538 }
Chris@49 6539
Chris@49 6540
Chris@49 6541
Chris@49 6542 template<typename eT>
Chris@49 6543 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6544 arma_inline
Chris@49 6545 arma_warn_unused
Chris@49 6546 eT*
Chris@49 6547 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::memptr()
Chris@49 6548 {
Chris@49 6549 return (use_extra) ? mem_local_extra : mem_local;
Chris@49 6550 }
Chris@49 6551
Chris@49 6552
Chris@49 6553
Chris@49 6554 template<typename eT>
Chris@49 6555 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6556 arma_inline
Chris@49 6557 arma_warn_unused
Chris@49 6558 const eT*
Chris@49 6559 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::memptr() const
Chris@49 6560 {
Chris@49 6561 return (use_extra) ? mem_local_extra : mem_local;
Chris@49 6562 }
Chris@49 6563
Chris@49 6564
Chris@49 6565
Chris@49 6566 template<typename eT>
Chris@49 6567 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6568 arma_inline
Chris@49 6569 arma_warn_unused
Chris@49 6570 bool
Chris@49 6571 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::is_vec() const
Chris@49 6572 {
Chris@49 6573 return ( (fixed_n_rows == 1) || (fixed_n_cols == 1) );
Chris@49 6574 }
Chris@49 6575
Chris@49 6576
Chris@49 6577
Chris@49 6578 template<typename eT>
Chris@49 6579 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6580 arma_hot
Chris@49 6581 inline
Chris@49 6582 const Mat<eT>&
Chris@49 6583 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fill(const eT val)
Chris@49 6584 {
Chris@49 6585 arma_extra_debug_sigprint();
Chris@49 6586
Chris@49 6587 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);
Chris@49 6588
Chris@49 6589 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, val );
Chris@49 6590
Chris@49 6591 return *this;
Chris@49 6592 }
Chris@49 6593
Chris@49 6594
Chris@49 6595
Chris@49 6596 template<typename eT>
Chris@49 6597 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6598 arma_hot
Chris@49 6599 inline
Chris@49 6600 const Mat<eT>&
Chris@49 6601 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::zeros()
Chris@49 6602 {
Chris@49 6603 arma_extra_debug_sigprint();
Chris@49 6604
Chris@49 6605 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);
Chris@49 6606
Chris@49 6607 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(0) );
Chris@49 6608
Chris@49 6609 return *this;
Chris@49 6610 }
Chris@49 6611
Chris@49 6612
Chris@49 6613
Chris@49 6614 template<typename eT>
Chris@49 6615 template<uword fixed_n_rows, uword fixed_n_cols>
Chris@49 6616 arma_hot
Chris@49 6617 inline
Chris@49 6618 const Mat<eT>&
Chris@49 6619 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ones()
Chris@49 6620 {
Chris@49 6621 arma_extra_debug_sigprint();
Chris@49 6622
Chris@49 6623 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);
Chris@49 6624
Chris@49 6625 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(1) );
Chris@49 6626
Chris@49 6627 return *this;
Chris@49 6628 }
Chris@49 6629
Chris@49 6630
Chris@49 6631
Chris@49 6632 //! prefix ++
Chris@49 6633 template<typename eT>
Chris@49 6634 arma_inline
Chris@49 6635 void
Chris@49 6636 Mat_aux::prefix_pp(Mat<eT>& x)
Chris@49 6637 {
Chris@49 6638 eT* memptr = x.memptr();
Chris@49 6639 const uword n_elem = x.n_elem;
Chris@49 6640
Chris@49 6641 uword i,j;
Chris@49 6642
Chris@49 6643 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 6644 {
Chris@49 6645 ++(memptr[i]);
Chris@49 6646 ++(memptr[j]);
Chris@49 6647 }
Chris@49 6648
Chris@49 6649 if(i < n_elem)
Chris@49 6650 {
Chris@49 6651 ++(memptr[i]);
Chris@49 6652 }
Chris@49 6653 }
Chris@49 6654
Chris@49 6655
Chris@49 6656
Chris@49 6657 //! prefix ++ for complex numbers (work around for limitations of the std::complex class)
Chris@49 6658 template<typename T>
Chris@49 6659 arma_inline
Chris@49 6660 void
Chris@49 6661 Mat_aux::prefix_pp(Mat< std::complex<T> >& x)
Chris@49 6662 {
Chris@49 6663 x += T(1);
Chris@49 6664 }
Chris@49 6665
Chris@49 6666
Chris@49 6667
Chris@49 6668 //! postfix ++
Chris@49 6669 template<typename eT>
Chris@49 6670 arma_inline
Chris@49 6671 void
Chris@49 6672 Mat_aux::postfix_pp(Mat<eT>& x)
Chris@49 6673 {
Chris@49 6674 eT* memptr = x.memptr();
Chris@49 6675 const uword n_elem = x.n_elem;
Chris@49 6676
Chris@49 6677 uword i,j;
Chris@49 6678
Chris@49 6679 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 6680 {
Chris@49 6681 (memptr[i])++;
Chris@49 6682 (memptr[j])++;
Chris@49 6683 }
Chris@49 6684
Chris@49 6685 if(i < n_elem)
Chris@49 6686 {
Chris@49 6687 (memptr[i])++;
Chris@49 6688 }
Chris@49 6689 }
Chris@49 6690
Chris@49 6691
Chris@49 6692
Chris@49 6693 //! postfix ++ for complex numbers (work around for limitations of the std::complex class)
Chris@49 6694 template<typename T>
Chris@49 6695 arma_inline
Chris@49 6696 void
Chris@49 6697 Mat_aux::postfix_pp(Mat< std::complex<T> >& x)
Chris@49 6698 {
Chris@49 6699 x += T(1);
Chris@49 6700 }
Chris@49 6701
Chris@49 6702
Chris@49 6703
Chris@49 6704 //! prefix --
Chris@49 6705 template<typename eT>
Chris@49 6706 arma_inline
Chris@49 6707 void
Chris@49 6708 Mat_aux::prefix_mm(Mat<eT>& x)
Chris@49 6709 {
Chris@49 6710 eT* memptr = x.memptr();
Chris@49 6711 const uword n_elem = x.n_elem;
Chris@49 6712
Chris@49 6713 uword i,j;
Chris@49 6714
Chris@49 6715 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 6716 {
Chris@49 6717 --(memptr[i]);
Chris@49 6718 --(memptr[j]);
Chris@49 6719 }
Chris@49 6720
Chris@49 6721 if(i < n_elem)
Chris@49 6722 {
Chris@49 6723 --(memptr[i]);
Chris@49 6724 }
Chris@49 6725 }
Chris@49 6726
Chris@49 6727
Chris@49 6728
Chris@49 6729 //! prefix -- for complex numbers (work around for limitations of the std::complex class)
Chris@49 6730 template<typename T>
Chris@49 6731 arma_inline
Chris@49 6732 void
Chris@49 6733 Mat_aux::prefix_mm(Mat< std::complex<T> >& x)
Chris@49 6734 {
Chris@49 6735 x -= T(1);
Chris@49 6736 }
Chris@49 6737
Chris@49 6738
Chris@49 6739
Chris@49 6740 //! postfix --
Chris@49 6741 template<typename eT>
Chris@49 6742 arma_inline
Chris@49 6743 void
Chris@49 6744 Mat_aux::postfix_mm(Mat<eT>& x)
Chris@49 6745 {
Chris@49 6746 eT* memptr = x.memptr();
Chris@49 6747 const uword n_elem = x.n_elem;
Chris@49 6748
Chris@49 6749 uword i,j;
Chris@49 6750
Chris@49 6751 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 6752 {
Chris@49 6753 (memptr[i])--;
Chris@49 6754 (memptr[j])--;
Chris@49 6755 }
Chris@49 6756
Chris@49 6757 if(i < n_elem)
Chris@49 6758 {
Chris@49 6759 (memptr[i])--;
Chris@49 6760 }
Chris@49 6761 }
Chris@49 6762
Chris@49 6763
Chris@49 6764
Chris@49 6765 //! postfix ++ for complex numbers (work around for limitations of the std::complex class)
Chris@49 6766 template<typename T>
Chris@49 6767 arma_inline
Chris@49 6768 void
Chris@49 6769 Mat_aux::postfix_mm(Mat< std::complex<T> >& x)
Chris@49 6770 {
Chris@49 6771 x -= T(1);
Chris@49 6772 }
Chris@49 6773
Chris@49 6774
Chris@49 6775
Chris@49 6776 template<typename eT, typename T1>
Chris@49 6777 inline
Chris@49 6778 void
Chris@49 6779 Mat_aux::set_real(Mat<eT>& out, const Base<eT,T1>& X)
Chris@49 6780 {
Chris@49 6781 arma_extra_debug_sigprint();
Chris@49 6782
Chris@49 6783 const unwrap<T1> tmp(X.get_ref());
Chris@49 6784 const Mat<eT>& A = tmp.M;
Chris@49 6785
Chris@49 6786 arma_debug_assert_same_size( out, A, "Mat::set_real()" );
Chris@49 6787
Chris@49 6788 out = A;
Chris@49 6789 }
Chris@49 6790
Chris@49 6791
Chris@49 6792
Chris@49 6793 template<typename eT, typename T1>
Chris@49 6794 inline
Chris@49 6795 void
Chris@49 6796 Mat_aux::set_imag(Mat<eT>&, const Base<eT,T1>&)
Chris@49 6797 {
Chris@49 6798 arma_extra_debug_sigprint();
Chris@49 6799 }
Chris@49 6800
Chris@49 6801
Chris@49 6802
Chris@49 6803 template<typename T, typename T1>
Chris@49 6804 inline
Chris@49 6805 void
Chris@49 6806 Mat_aux::set_real(Mat< std::complex<T> >& out, const Base<T,T1>& X)
Chris@49 6807 {
Chris@49 6808 arma_extra_debug_sigprint();
Chris@49 6809
Chris@49 6810 typedef typename std::complex<T> eT;
Chris@49 6811
Chris@49 6812 const Proxy<T1> P(X.get_ref());
Chris@49 6813
Chris@49 6814 const uword local_n_rows = P.get_n_rows();
Chris@49 6815 const uword local_n_cols = P.get_n_cols();
Chris@49 6816
Chris@49 6817 arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, "Mat::set_real()" );
Chris@49 6818
Chris@49 6819 eT* out_mem = out.memptr();
Chris@49 6820
Chris@49 6821 if(Proxy<T1>::prefer_at_accessor == false)
Chris@49 6822 {
Chris@49 6823 typedef typename Proxy<T1>::ea_type ea_type;
Chris@49 6824
Chris@49 6825 ea_type A = P.get_ea();
Chris@49 6826
Chris@49 6827 const uword N = out.n_elem;
Chris@49 6828
Chris@49 6829 for(uword i=0; i<N; ++i)
Chris@49 6830 {
Chris@49 6831 out_mem[i] = std::complex<T>( A[i], out_mem[i].imag() );
Chris@49 6832 }
Chris@49 6833 }
Chris@49 6834 else
Chris@49 6835 {
Chris@49 6836 for(uword col=0; col < local_n_cols; ++col)
Chris@49 6837 for(uword row=0; row < local_n_rows; ++row)
Chris@49 6838 {
Chris@49 6839 (*out_mem) = std::complex<T>( P.at(row,col), (*out_mem).imag() );
Chris@49 6840 out_mem++;
Chris@49 6841 }
Chris@49 6842 }
Chris@49 6843 }
Chris@49 6844
Chris@49 6845
Chris@49 6846
Chris@49 6847 template<typename T, typename T1>
Chris@49 6848 inline
Chris@49 6849 void
Chris@49 6850 Mat_aux::set_imag(Mat< std::complex<T> >& out, const Base<T,T1>& X)
Chris@49 6851 {
Chris@49 6852 arma_extra_debug_sigprint();
Chris@49 6853
Chris@49 6854 typedef typename std::complex<T> eT;
Chris@49 6855
Chris@49 6856 const Proxy<T1> P(X.get_ref());
Chris@49 6857
Chris@49 6858 const uword local_n_rows = P.get_n_rows();
Chris@49 6859 const uword local_n_cols = P.get_n_cols();
Chris@49 6860
Chris@49 6861 arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, "Mat::set_imag()" );
Chris@49 6862
Chris@49 6863 eT* out_mem = out.memptr();
Chris@49 6864
Chris@49 6865 if(Proxy<T1>::prefer_at_accessor == false)
Chris@49 6866 {
Chris@49 6867 typedef typename Proxy<T1>::ea_type ea_type;
Chris@49 6868
Chris@49 6869 ea_type A = P.get_ea();
Chris@49 6870
Chris@49 6871 const uword N = out.n_elem;
Chris@49 6872
Chris@49 6873 for(uword i=0; i<N; ++i)
Chris@49 6874 {
Chris@49 6875 out_mem[i] = std::complex<T>( out_mem[i].real(), A[i] );
Chris@49 6876 }
Chris@49 6877 }
Chris@49 6878 else
Chris@49 6879 {
Chris@49 6880 for(uword col=0; col < local_n_cols; ++col)
Chris@49 6881 for(uword row=0; row < local_n_rows; ++row)
Chris@49 6882 {
Chris@49 6883 (*out_mem) = std::complex<T>( (*out_mem).real(), P.at(row,col) );
Chris@49 6884 out_mem++;
Chris@49 6885 }
Chris@49 6886 }
Chris@49 6887 }
Chris@49 6888
Chris@49 6889
Chris@49 6890
Chris@49 6891 #ifdef ARMA_EXTRA_MAT_MEAT
Chris@49 6892 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_MEAT)
Chris@49 6893 #endif
Chris@49 6894
Chris@49 6895
Chris@49 6896
Chris@49 6897 //! @}