00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00016
00017
00018 template<typename eT>
00019 inline
00020 Mat<eT>::~Mat()
00021 {
00022 arma_extra_debug_sigprint_this(this);
00023
00024 if(mem_state == 0)
00025 {
00026 if(n_elem > arma_config::mat_prealloc)
00027 {
00028 #if defined(ARMA_USE_TBB_ALLOC)
00029 scalable_free((void *)(mem));
00030 #else
00031 delete [] mem;
00032 #endif
00033 }
00034 }
00035
00036 if(arma_config::debug == true)
00037 {
00038
00039 access::rw(n_rows) = 0;
00040 access::rw(n_cols) = 0;
00041 access::rw(n_elem) = 0;
00042 access::rw(mem) = 0;
00043 }
00044
00045 arma_type_check(( is_supported_elem_type<eT>::value == false ));
00046 }
00047
00048
00049
00050 template<typename eT>
00051 inline
00052 Mat<eT>::Mat()
00053 : n_rows(0)
00054 , n_cols(0)
00055 , n_elem(0)
00056 , vec_state(0)
00057 , mem_state(0)
00058 , mem()
00059 {
00060 arma_extra_debug_sigprint_this(this);
00061 }
00062
00063
00064
00066 template<typename eT>
00067 inline
00068 Mat<eT>::Mat(const uword in_n_rows, const uword in_n_cols)
00069 : n_rows(in_n_rows)
00070 , n_cols(in_n_cols)
00071 , n_elem(in_n_rows*in_n_cols)
00072 , vec_state(0)
00073 , mem_state(0)
00074 , mem()
00075 {
00076 arma_extra_debug_sigprint_this(this);
00077
00078 init_cold();
00079 }
00080
00081
00082
00083 template<typename eT>
00084 inline
00085 void
00086 Mat<eT>::init_cold()
00087 {
00088 arma_extra_debug_sigprint( arma_boost::format("n_rows = %d, n_cols = %d") % n_rows % n_cols );
00089
00090
00091
00092 arma_debug_check
00093 (
00094 (
00095 ( (n_rows > ARMA_MAX_UHWORD) || (n_cols > ARMA_MAX_UHWORD) )
00096 ? ( (float(n_rows) * float(n_cols)) > float(ARMA_MAX_UWORD) )
00097 : false
00098 ),
00099 "Mat::init(): requested size is too large"
00100 );
00101
00102 if(n_elem <= arma_config::mat_prealloc)
00103 {
00104 access::rw(mem) = mem_local;
00105 }
00106 else
00107 {
00108 arma_extra_debug_print("Mat::init(): allocating memory");
00109
00110 #if defined(ARMA_USE_TBB_ALLOC)
00111 access::rw(mem) = (eT *) scalable_malloc(sizeof(eT)*n_elem);
00112 #else
00113 access::rw(mem) = new(std::nothrow) eT[n_elem];
00114 #endif
00115
00116 arma_check_bad_alloc( (mem == 0), "Mat::init(): out of memory" );
00117 }
00118 }
00119
00120
00121
00123 template<typename eT>
00124 inline
00125 void
00126 Mat<eT>::init_warm(uword in_n_rows, uword in_n_cols)
00127 {
00128 arma_extra_debug_sigprint( arma_boost::format("in_n_rows = %d, in_n_cols = %d") % in_n_rows % in_n_cols );
00129
00130 if( (n_rows == in_n_rows) && (n_cols == in_n_cols) )
00131 {
00132 return;
00133 }
00134
00135 bool err_state = false;
00136 char* err_msg = 0;
00137
00138 const uhword t_vec_state = vec_state;
00139 const uhword t_mem_state = mem_state;
00140
00141 arma_debug_set_error
00142 (
00143 err_state,
00144 err_msg,
00145 (t_mem_state == 3),
00146 "Mat::init(): size is fixed and hence cannot be changed"
00147 );
00148
00149 if(t_vec_state > 0)
00150 {
00151 if( (in_n_rows == 0) && (in_n_cols == 0) )
00152 {
00153 if(t_vec_state == 1)
00154 {
00155 in_n_cols = 1;
00156 }
00157 else
00158 if(t_vec_state == 2)
00159 {
00160 in_n_rows = 1;
00161 }
00162 }
00163 else
00164 {
00165 arma_debug_set_error
00166 (
00167 err_state,
00168 err_msg,
00169 ( ((t_vec_state == 1) && (in_n_cols != 1)) || ((t_vec_state == 2) && (in_n_rows != 1)) ),
00170 "Mat::init(): object is a vector; requested size is not compatible"
00171 );
00172 }
00173 }
00174
00175
00176
00177 arma_debug_set_error
00178 (
00179 err_state,
00180 err_msg,
00181 (
00182 ( (in_n_rows > ARMA_MAX_UHWORD) || (in_n_cols > ARMA_MAX_UHWORD) )
00183 ? ( (float(in_n_rows) * float(in_n_cols)) > float(ARMA_MAX_UWORD) )
00184 : false
00185 ),
00186 "Mat::init(): requested size is too large"
00187 );
00188
00189 arma_debug_check(err_state, err_msg);
00190
00191 const uword old_n_elem = n_elem;
00192 const uword new_n_elem = in_n_rows * in_n_cols;
00193
00194 if(old_n_elem == new_n_elem)
00195 {
00196 arma_extra_debug_print("Mat::init(): reusing memory");
00197
00198 access::rw(n_rows) = in_n_rows;
00199 access::rw(n_cols) = in_n_cols;
00200 }
00201 else
00202 {
00203 arma_debug_check
00204 (
00205 (t_mem_state == 2),
00206 "Mat::init(): mismatch between size of auxiliary memory and requested size"
00207 );
00208
00209 if(t_mem_state == 0)
00210 {
00211 if(old_n_elem > arma_config::mat_prealloc)
00212 {
00213 arma_extra_debug_print("Mat::init(): freeing memory");
00214
00215 #if defined(ARMA_USE_TBB_ALLOC)
00216 scalable_free((void *)(mem));
00217 #else
00218 delete [] mem;
00219 #endif
00220 }
00221 }
00222
00223
00224 if(new_n_elem <= arma_config::mat_prealloc)
00225 {
00226 access::rw(mem) = mem_local;
00227 }
00228 else
00229 {
00230 arma_extra_debug_print("Mat::init(): allocating memory");
00231
00232 #if defined(ARMA_USE_TBB_ALLOC)
00233 access::rw(mem) = (eT *) scalable_malloc(sizeof(eT)*new_n_elem);
00234 #else
00235 access::rw(mem) = new(std::nothrow) eT[new_n_elem];
00236 #endif
00237
00238 arma_check_bad_alloc( (mem == 0), "Mat::init(): out of memory" );
00239 }
00240
00241 access::rw(n_rows) = in_n_rows;
00242 access::rw(n_cols) = in_n_cols;
00243 access::rw(n_elem) = new_n_elem;
00244 access::rw(mem_state) = 0;
00245 }
00246 }
00247
00248
00249
00251 template<typename eT>
00252 inline
00253 Mat<eT>::Mat(const char* text)
00254 : n_rows(0)
00255 , n_cols(0)
00256 , n_elem(0)
00257 , vec_state(0)
00258 , mem_state(0)
00259 , mem()
00260 {
00261 arma_extra_debug_sigprint_this(this);
00262
00263 init( std::string(text) );
00264 }
00265
00266
00267
00269 template<typename eT>
00270 inline
00271 const Mat<eT>&
00272 Mat<eT>::operator=(const char* text)
00273 {
00274 arma_extra_debug_sigprint();
00275
00276 init( std::string(text) );
00277 return *this;
00278 }
00279
00280
00281
00283 template<typename eT>
00284 inline
00285 Mat<eT>::Mat(const std::string& text)
00286 : n_rows(0)
00287 , n_cols(0)
00288 , n_elem(0)
00289 , vec_state(0)
00290 , mem_state(0)
00291 , mem()
00292 {
00293 arma_extra_debug_sigprint_this(this);
00294
00295 init(text);
00296 }
00297
00298
00299
00301 template<typename eT>
00302 inline
00303 const Mat<eT>&
00304 Mat<eT>::operator=(const std::string& text)
00305 {
00306 arma_extra_debug_sigprint();
00307
00308 init(text);
00309 return *this;
00310 }
00311
00312
00313
00315 template<typename eT>
00316 inline
00317 void
00318 Mat<eT>::init(const std::string& text)
00319 {
00320 arma_extra_debug_sigprint();
00321
00322
00323
00324
00325 uword t_n_rows = 0;
00326 uword t_n_cols = 0;
00327
00328 bool t_n_cols_found = false;
00329
00330 std::string token;
00331
00332 std::string::size_type line_start = 0;
00333 std::string::size_type line_end = 0;
00334
00335 while( line_start < text.length() )
00336 {
00337
00338 line_end = text.find(';', line_start);
00339
00340 if(line_end == std::string::npos)
00341 line_end = text.length()-1;
00342
00343 std::string::size_type line_len = line_end - line_start + 1;
00344 std::stringstream line_stream( text.substr(line_start,line_len) );
00345
00346
00347 uword line_n_cols = 0;
00348 while(line_stream >> token)
00349 {
00350 ++line_n_cols;
00351 }
00352
00353
00354 if(line_n_cols > 0)
00355 {
00356 if(t_n_cols_found == false)
00357 {
00358 t_n_cols = line_n_cols;
00359 t_n_cols_found = true;
00360 }
00361 else
00362 arma_check( (line_n_cols != t_n_cols), "Mat::init(): inconsistent number of columns in given string");
00363
00364 ++t_n_rows;
00365 }
00366 line_start = line_end+1;
00367
00368 }
00369
00370 Mat<eT>& x = *this;
00371 x.set_size(t_n_rows, t_n_cols);
00372
00373 line_start = 0;
00374 line_end = 0;
00375
00376 uword row = 0;
00377
00378 while( line_start < text.length() )
00379 {
00380
00381 line_end = text.find(';', line_start);
00382
00383 if(line_end == std::string::npos)
00384 line_end = text.length()-1;
00385
00386 std::string::size_type line_len = line_end - line_start + 1;
00387 std::stringstream line_stream( text.substr(line_start,line_len) );
00388
00389
00390
00391
00392
00393
00394
00395
00396 uword col = 0;
00397 eT val;
00398 while(line_stream >> val)
00399 {
00400 x.at(row,col) = val;
00401 ++col;
00402 }
00403
00404 ++row;
00405 line_start = line_end+1;
00406 }
00407
00408 }
00409
00410
00411
00412 #if defined(ARMA_USE_CXX11)
00413
00414 template<typename eT>
00415 inline
00416 Mat<eT>::Mat(const std::initializer_list<eT>& list)
00417 : n_rows(0)
00418 , n_cols(0)
00419 , n_elem(0)
00420 , vec_state(0)
00421 , mem_state(0)
00422 , mem()
00423 {
00424 arma_extra_debug_sigprint_this(this);
00425
00426 init(list);
00427 }
00428
00429
00430
00431 template<typename eT>
00432 inline
00433 const Mat<eT>&
00434 Mat<eT>::operator=(const std::initializer_list<eT>& list)
00435 {
00436 arma_extra_debug_sigprint();
00437
00438 init(list);
00439
00440 return *this;
00441 }
00442
00443 #endif
00444
00445
00446
00449 template<typename eT>
00450 arma_inline
00451 const Mat<eT>&
00452 Mat<eT>::operator=(const eT val)
00453 {
00454 arma_extra_debug_sigprint();
00455
00456 init_warm(1,1);
00457 access::rw(mem[0]) = val;
00458 return *this;
00459 }
00460
00461
00462
00464 template<typename eT>
00465 arma_inline
00466 const Mat<eT>&
00467 Mat<eT>::operator+=(const eT val)
00468 {
00469 arma_extra_debug_sigprint();
00470
00471 arrayops::inplace_plus( memptr(), val, n_elem );
00472
00473 return *this;
00474 }
00475
00476
00477
00479 template<typename eT>
00480 arma_inline
00481 const Mat<eT>&
00482 Mat<eT>::operator-=(const eT val)
00483 {
00484 arma_extra_debug_sigprint();
00485
00486 arrayops::inplace_minus( memptr(), val, n_elem );
00487
00488 return *this;
00489 }
00490
00491
00492
00494 template<typename eT>
00495 arma_inline
00496 const Mat<eT>&
00497 Mat<eT>::operator*=(const eT val)
00498 {
00499 arma_extra_debug_sigprint();
00500
00501 arrayops::inplace_mul( memptr(), val, n_elem );
00502
00503 return *this;
00504 }
00505
00506
00507
00509 template<typename eT>
00510 arma_inline
00511 const Mat<eT>&
00512 Mat<eT>::operator/=(const eT val)
00513 {
00514 arma_extra_debug_sigprint();
00515
00516 arrayops::inplace_div( memptr(), val, n_elem );
00517
00518 return *this;
00519 }
00520
00521
00522
00524 template<typename eT>
00525 inline
00526 Mat<eT>::Mat(const Mat<eT>& in_mat)
00527 : n_rows(in_mat.n_rows)
00528 , n_cols(in_mat.n_cols)
00529 , n_elem(in_mat.n_elem)
00530 , vec_state(0)
00531 , mem_state(0)
00532 , mem()
00533 {
00534 arma_extra_debug_sigprint(arma_boost::format("this = %x in_mat = %x") % this % &in_mat);
00535
00536 init_cold();
00537
00538 arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );
00539 }
00540
00541
00542
00544 template<typename eT>
00545 inline
00546 const Mat<eT>&
00547 Mat<eT>::operator=(const Mat<eT>& in_mat)
00548 {
00549 arma_extra_debug_sigprint(arma_boost::format("this = %x in_mat = %x") % this % &in_mat);
00550
00551 if(this != &in_mat)
00552 {
00553 init_warm(in_mat.n_rows, in_mat.n_cols);
00554
00555 arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );
00556 }
00557
00558 return *this;
00559 }
00560
00561
00562
00563 #if defined(ARMA_USE_CXX11)
00564
00565 template<typename eT>
00566 inline
00567 void
00568 Mat<eT>::init(const std::initializer_list<eT>& list)
00569 {
00570 arma_extra_debug_sigprint();
00571
00572 const uword N = list.size();
00573
00574 set_size(1, N);
00575
00576 arrayops::copy( memptr(), list.begin(), N );
00577 }
00578
00579 #endif
00580
00581
00582
00584 template<typename eT>
00585 template<typename T1, typename T2>
00586 inline
00587 void
00588 Mat<eT>::init
00589 (
00590 const Base<typename Mat<eT>::pod_type, T1>& A,
00591 const Base<typename Mat<eT>::pod_type, T2>& B
00592 )
00593 {
00594 arma_extra_debug_sigprint();
00595
00596 typedef typename T1::elem_type T;
00597 typedef typename Proxy<T1>::ea_type ea_type1;
00598 typedef typename Proxy<T2>::ea_type ea_type2;
00599
00600 arma_type_check(( is_complex<eT>::value == false ));
00601 arma_type_check(( is_complex< T>::value == true ));
00602
00603 arma_type_check(( is_same_type< std::complex<T>, eT >::value == false ));
00604
00605 const Proxy<T1> X(A.get_ref());
00606 const Proxy<T2> Y(B.get_ref());
00607
00608 arma_assert_same_size(X, Y, "Mat()");
00609
00610 init_warm(X.get_n_rows(), X.get_n_cols());
00611
00612 const uword N = n_elem;
00613 eT* out_mem = memptr();
00614 ea_type1 PX = X.get_ea();
00615 ea_type2 PY = Y.get_ea();
00616
00617 for(uword i=0; i<N; ++i)
00618 {
00619 out_mem[i] = std::complex<T>(PX[i], PY[i]);
00620 }
00621 }
00622
00623
00624
00627 template<typename eT>
00628 inline
00629 void
00630 Mat<eT>::steal_mem(Mat<eT>& x)
00631 {
00632 arma_extra_debug_sigprint();
00633
00634 if(this != &x)
00635 {
00636 const uword x_n_rows = x.n_rows;
00637 const uword x_n_cols = x.n_cols;
00638 const uword x_n_elem = x.n_elem;
00639 const uword x_vec_state = x.vec_state;
00640 const uword x_mem_state = x.mem_state;
00641
00642 const uword t_vec_state = vec_state;
00643
00644 bool layout_ok = false;
00645
00646 if(t_vec_state == x_vec_state)
00647 {
00648 layout_ok = true;
00649 }
00650 else
00651 {
00652 if( (t_vec_state == 1) && ( x_n_cols == 1) )
00653 {
00654 layout_ok = true;
00655 }
00656
00657 if( (t_vec_state == 2) && ( x_n_rows == 1) )
00658 {
00659 layout_ok = true;
00660 }
00661 }
00662
00663
00664 if( (x_mem_state == 0) && (x_n_elem > arma_config::mat_prealloc) && (layout_ok == true) )
00665 {
00666 reset();
00667
00668
00669 access::rw(n_rows) = x_n_rows;
00670 access::rw(n_cols) = x_n_cols;
00671 access::rw(n_elem) = x_n_elem;
00672 access::rw(mem) = x.mem;
00673
00674 access::rw(x.n_rows) = 0;
00675 access::rw(x.n_cols) = 0;
00676 access::rw(x.n_elem) = 0;
00677 access::rw(x.mem) = 0;
00678 }
00679 else
00680 {
00681 (*this).operator=(x);
00682 }
00683 }
00684 }
00685
00686
00687
00692
00693 template<typename eT>
00694 inline
00695 Mat<eT>::Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem, const bool strict)
00696 : n_rows ( aux_n_rows )
00697 , n_cols ( aux_n_cols )
00698 , n_elem ( aux_n_rows*aux_n_cols )
00699 , vec_state( 0 )
00700 , mem_state( copy_aux_mem ? 0 : ( strict ? 2 : 1 ) )
00701 , mem ( copy_aux_mem ? 0 : aux_mem )
00702 {
00703 arma_extra_debug_sigprint_this(this);
00704
00705 if(copy_aux_mem == true)
00706 {
00707 init_cold();
00708
00709 arrayops::copy( memptr(), aux_mem, n_elem );
00710 }
00711 }
00712
00713
00714
00717 template<typename eT>
00718 inline
00719 Mat<eT>::Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)
00720 : n_rows(aux_n_rows)
00721 , n_cols(aux_n_cols)
00722 , n_elem(aux_n_rows*aux_n_cols)
00723 , vec_state(0)
00724 , mem_state(0)
00725 , mem()
00726 {
00727 arma_extra_debug_sigprint_this(this);
00728
00729 init_cold();
00730
00731 arrayops::copy( memptr(), aux_mem, n_elem );
00732 }
00733
00734
00735
00739
00740 template<typename eT>
00741 inline
00742 Mat<eT>::Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)
00743 : n_rows (aux_n_rows )
00744 , n_cols (aux_n_cols )
00745 , n_elem (aux_n_rows*aux_n_cols)
00746 , vec_state(0 )
00747 , mem_state(3 )
00748 , mem (aux_mem )
00749 {
00750 arma_extra_debug_sigprint_this(this);
00751 arma_ignore(junk);
00752 }
00753
00754
00755
00757 template<typename eT>
00758 inline
00759 const Mat<eT>&
00760 Mat<eT>::operator+=(const Mat<eT>& m)
00761 {
00762 arma_extra_debug_sigprint();
00763
00764 arma_debug_assert_same_size(*this, m, "addition");
00765
00766 arrayops::inplace_plus( memptr(), m.memptr(), n_elem );
00767
00768 return *this;
00769 }
00770
00771
00772
00774 template<typename eT>
00775 inline
00776 const Mat<eT>&
00777 Mat<eT>::operator-=(const Mat<eT>& m)
00778 {
00779 arma_extra_debug_sigprint();
00780
00781 arma_debug_assert_same_size(*this, m, "subtraction");
00782
00783 arrayops::inplace_minus( memptr(), m.memptr(), n_elem );
00784
00785 return *this;
00786 }
00787
00788
00789
00791 template<typename eT>
00792 inline
00793 const Mat<eT>&
00794 Mat<eT>::operator*=(const Mat<eT>& m)
00795 {
00796 arma_extra_debug_sigprint();
00797
00798 glue_times::apply_inplace(*this, m);
00799
00800 return *this;
00801 }
00802
00803
00804
00806 template<typename eT>
00807 inline
00808 const Mat<eT>&
00809 Mat<eT>::operator%=(const Mat<eT>& m)
00810 {
00811 arma_extra_debug_sigprint();
00812
00813 arma_debug_assert_same_size(*this, m, "element-wise multiplication");
00814
00815 arrayops::inplace_mul( memptr(), m.memptr(), n_elem );
00816
00817 return *this;
00818 }
00819
00820
00821
00823 template<typename eT>
00824 inline
00825 const Mat<eT>&
00826 Mat<eT>::operator/=(const Mat<eT>& m)
00827 {
00828 arma_extra_debug_sigprint();
00829
00830 arma_debug_assert_same_size(*this, m, "element-wise division");
00831
00832 arrayops::inplace_div( memptr(), m.memptr(), n_elem );
00833
00834 return *this;
00835 }
00836
00837
00838
00839 template<typename eT>
00840 template<typename T1>
00841 inline
00842 Mat<eT>::Mat(const BaseCube<eT,T1>& X)
00843 : n_rows(0)
00844 , n_cols(0)
00845 , n_elem(0)
00846 , vec_state(0)
00847 , mem_state(0)
00848 , mem()
00849 {
00850 arma_extra_debug_sigprint_this(this);
00851
00852 (*this).operator=(X);
00853 }
00854
00855
00856
00857 template<typename eT>
00858 template<typename T1>
00859 inline
00860 const Mat<eT>&
00861 Mat<eT>::operator=(const BaseCube<eT,T1>& X)
00862 {
00863 arma_extra_debug_sigprint();
00864
00865 Mat<eT>& out = *this;
00866
00867 const unwrap_cube<T1> tmp(X.get_ref());
00868 const Cube<eT>& in = tmp.M;
00869
00870 arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false);
00871
00872 const uword in_n_rows = in.n_rows;
00873 const uword in_n_cols = in.n_cols;
00874 const uword in_n_slices = in.n_slices;
00875
00876 const uword out_vec_state = out.vec_state;
00877
00878 if(in_n_slices == 1)
00879 {
00880 out.set_size(in_n_rows, in_n_cols);
00881
00882 for(uword col=0; col < in_n_cols; ++col)
00883 {
00884 arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
00885 }
00886 }
00887 else
00888 {
00889 if(out_vec_state == 0)
00890 {
00891 if(in_n_cols == 1)
00892 {
00893 out.set_size(in_n_rows, in_n_slices);
00894
00895 for(uword i=0; i < in_n_slices; ++i)
00896 {
00897 arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
00898 }
00899 }
00900 else
00901 if(in_n_rows == 1)
00902 {
00903 out.set_size(in_n_cols, in_n_slices);
00904
00905 for(uword slice=0; slice < in_n_slices; ++slice)
00906 {
00907 eT* out_colptr = out.colptr(slice);
00908
00909 uword i,j;
00910 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
00911 {
00912 const eT tmp_i = in.at(0, i, slice);
00913 const eT tmp_j = in.at(0, j, slice);
00914
00915 out_colptr[i] = tmp_i;
00916 out_colptr[j] = tmp_j;
00917 }
00918
00919 if(i < in_n_cols)
00920 {
00921 out_colptr[i] = in.at(0, i, slice);
00922 }
00923 }
00924 }
00925 }
00926 else
00927 {
00928 out.set_size(in_n_slices);
00929
00930 eT* out_mem = out.memptr();
00931
00932 for(uword i=0; i<in_n_slices; ++i)
00933 {
00934 out_mem[i] = in.at(0, 0, i);
00935 }
00936 }
00937 }
00938
00939 return *this;
00940 }
00941
00942
00943
00944 template<typename eT>
00945 template<typename T1>
00946 inline
00947 const Mat<eT>&
00948 Mat<eT>::operator+=(const BaseCube<eT,T1>& X)
00949 {
00950 arma_extra_debug_sigprint();
00951
00952 Mat<eT>& out = *this;
00953
00954 const unwrap_cube<T1> tmp(X.get_ref());
00955 const Cube<eT>& in = tmp.M;
00956
00957 arma_debug_assert_cube_as_mat(out, in, "addition", true);
00958
00959 const uword in_n_rows = in.n_rows;
00960 const uword in_n_cols = in.n_cols;
00961 const uword in_n_slices = in.n_slices;
00962
00963 const uword out_n_rows = out.n_rows;
00964 const uword out_n_cols = out.n_cols;
00965 const uword out_vec_state = out.vec_state;
00966
00967 if(in_n_slices == 1)
00968 {
00969 for(uword col=0; col < in_n_cols; ++col)
00970 {
00971 arrayops::inplace_plus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
00972 }
00973 }
00974 else
00975 {
00976 if(out_vec_state == 0)
00977 {
00978 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
00979 {
00980 for(uword i=0; i < in_n_slices; ++i)
00981 {
00982 arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
00983 }
00984 }
00985 else
00986 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
00987 {
00988 for(uword slice=0; slice < in_n_slices; ++slice)
00989 {
00990 eT* out_colptr = out.colptr(slice);
00991
00992 uword i,j;
00993 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
00994 {
00995 const eT tmp_i = in.at(0, i, slice);
00996 const eT tmp_j = in.at(0, j, slice);
00997
00998 out_colptr[i] += tmp_i;
00999 out_colptr[j] += tmp_j;
01000 }
01001
01002 if(i < in_n_cols)
01003 {
01004 out_colptr[i] += in.at(0, i, slice);
01005 }
01006 }
01007 }
01008 }
01009 else
01010 {
01011 eT* out_mem = out.memptr();
01012
01013 for(uword i=0; i<in_n_slices; ++i)
01014 {
01015 out_mem[i] += in.at(0, 0, i);
01016 }
01017 }
01018 }
01019
01020 return *this;
01021 }
01022
01023
01024
01025 template<typename eT>
01026 template<typename T1>
01027 inline
01028 const Mat<eT>&
01029 Mat<eT>::operator-=(const BaseCube<eT,T1>& X)
01030 {
01031 arma_extra_debug_sigprint();
01032
01033 Mat<eT>& out = *this;
01034
01035 const unwrap_cube<T1> tmp(X.get_ref());
01036 const Cube<eT>& in = tmp.M;
01037
01038 arma_debug_assert_cube_as_mat(out, in, "subtraction", true);
01039
01040 const uword in_n_rows = in.n_rows;
01041 const uword in_n_cols = in.n_cols;
01042 const uword in_n_slices = in.n_slices;
01043
01044 const uword out_n_rows = out.n_rows;
01045 const uword out_n_cols = out.n_cols;
01046 const uword out_vec_state = out.vec_state;
01047
01048 if(in_n_slices == 1)
01049 {
01050 for(uword col=0; col < in_n_cols; ++col)
01051 {
01052 arrayops::inplace_minus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01053 }
01054 }
01055 else
01056 {
01057 if(out_vec_state == 0)
01058 {
01059 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01060 {
01061 for(uword i=0; i < in_n_slices; ++i)
01062 {
01063 arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01064 }
01065 }
01066 else
01067 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01068 {
01069 for(uword slice=0; slice < in_n_slices; ++slice)
01070 {
01071 eT* out_colptr = out.colptr(slice);
01072
01073 uword i,j;
01074 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01075 {
01076 const eT tmp_i = in.at(0, i, slice);
01077 const eT tmp_j = in.at(0, j, slice);
01078
01079 out_colptr[i] -= tmp_i;
01080 out_colptr[j] -= tmp_j;
01081 }
01082
01083 if(i < in_n_cols)
01084 {
01085 out_colptr[i] -= in.at(0, i, slice);
01086 }
01087 }
01088 }
01089 }
01090 else
01091 {
01092 eT* out_mem = out.memptr();
01093
01094 for(uword i=0; i<in_n_slices; ++i)
01095 {
01096 out_mem[i] -= in.at(0, 0, i);
01097 }
01098 }
01099 }
01100
01101 return *this;
01102 }
01103
01104
01105
01106 template<typename eT>
01107 template<typename T1>
01108 inline
01109 const Mat<eT>&
01110 Mat<eT>::operator*=(const BaseCube<eT,T1>& X)
01111 {
01112 arma_extra_debug_sigprint();
01113
01114 const Mat<eT> B(X);
01115
01116 (*this).operator*=(B);
01117
01118 return *this;
01119 }
01120
01121
01122
01123 template<typename eT>
01124 template<typename T1>
01125 inline
01126 const Mat<eT>&
01127 Mat<eT>::operator%=(const BaseCube<eT,T1>& X)
01128 {
01129 arma_extra_debug_sigprint();
01130
01131 Mat<eT>& out = *this;
01132
01133 const unwrap_cube<T1> tmp(X.get_ref());
01134 const Cube<eT>& in = tmp.M;
01135
01136 arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true);
01137
01138 const uword in_n_rows = in.n_rows;
01139 const uword in_n_cols = in.n_cols;
01140 const uword in_n_slices = in.n_slices;
01141
01142 const uword out_n_rows = out.n_rows;
01143 const uword out_n_cols = out.n_cols;
01144 const uword out_vec_state = out.vec_state;
01145
01146 if(in_n_slices == 1)
01147 {
01148 for(uword col=0; col < in_n_cols; ++col)
01149 {
01150 arrayops::inplace_mul( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01151 }
01152 }
01153 else
01154 {
01155 if(out_vec_state == 0)
01156 {
01157 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01158 {
01159 for(uword i=0; i < in_n_slices; ++i)
01160 {
01161 arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01162 }
01163 }
01164 else
01165 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01166 {
01167 for(uword slice=0; slice < in_n_slices; ++slice)
01168 {
01169 eT* out_colptr = out.colptr(slice);
01170
01171 uword i,j;
01172 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01173 {
01174 const eT tmp_i = in.at(0, i, slice);
01175 const eT tmp_j = in.at(0, j, slice);
01176
01177 out_colptr[i] *= tmp_i;
01178 out_colptr[j] *= tmp_j;
01179 }
01180
01181 if(i < in_n_cols)
01182 {
01183 out_colptr[i] *= in.at(0, i, slice);
01184 }
01185 }
01186 }
01187 }
01188 else
01189 {
01190 eT* out_mem = out.memptr();
01191
01192 for(uword i=0; i<in_n_slices; ++i)
01193 {
01194 out_mem[i] *= in.at(0, 0, i);
01195 }
01196 }
01197 }
01198
01199 return *this;
01200 }
01201
01202
01203
01204 template<typename eT>
01205 template<typename T1>
01206 inline
01207 const Mat<eT>&
01208 Mat<eT>::operator/=(const BaseCube<eT,T1>& X)
01209 {
01210 arma_extra_debug_sigprint();
01211
01212 Mat<eT>& out = *this;
01213
01214 const unwrap_cube<T1> tmp(X.get_ref());
01215 const Cube<eT>& in = tmp.M;
01216
01217 arma_debug_assert_cube_as_mat(out, in, "element-wise division", true);
01218
01219 const uword in_n_rows = in.n_rows;
01220 const uword in_n_cols = in.n_cols;
01221 const uword in_n_slices = in.n_slices;
01222
01223 const uword out_n_rows = out.n_rows;
01224 const uword out_n_cols = out.n_cols;
01225 const uword out_vec_state = out.vec_state;
01226
01227 if(in_n_slices == 1)
01228 {
01229 for(uword col=0; col < in_n_cols; ++col)
01230 {
01231 arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01232 }
01233 }
01234 else
01235 {
01236 if(out_vec_state == 0)
01237 {
01238 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01239 {
01240 for(uword i=0; i < in_n_slices; ++i)
01241 {
01242 arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01243 }
01244 }
01245 else
01246 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01247 {
01248 for(uword slice=0; slice < in_n_slices; ++slice)
01249 {
01250 eT* out_colptr = out.colptr(slice);
01251
01252 uword i,j;
01253 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01254 {
01255 const eT tmp_i = in.at(0, i, slice);
01256 const eT tmp_j = in.at(0, j, slice);
01257
01258 out_colptr[i] /= tmp_i;
01259 out_colptr[j] /= tmp_j;
01260 }
01261
01262 if(i < in_n_cols)
01263 {
01264 out_colptr[i] /= in.at(0, i, slice);
01265 }
01266 }
01267 }
01268 }
01269 else
01270 {
01271 eT* out_mem = out.memptr();
01272
01273 for(uword i=0; i<in_n_slices; ++i)
01274 {
01275 out_mem[i] /= in.at(0, 0, i);
01276 }
01277 }
01278 }
01279
01280 return *this;
01281 }
01282
01283
01284
01286 template<typename eT>
01287 template<typename T1, typename T2>
01288 inline
01289 Mat<eT>::Mat
01290 (
01291 const Base<typename Mat<eT>::pod_type,T1>& A,
01292 const Base<typename Mat<eT>::pod_type,T2>& B
01293 )
01294 : n_rows(0)
01295 , n_cols(0)
01296 , n_elem(0)
01297 , vec_state(0)
01298 , mem_state(0)
01299 , mem()
01300 {
01301 arma_extra_debug_sigprint_this(this);
01302
01303 init(A,B);
01304 }
01305
01306
01307
01309 template<typename eT>
01310 inline
01311 Mat<eT>::Mat(const subview<eT>& X)
01312 : n_rows(X.n_rows)
01313 , n_cols(X.n_cols)
01314 , n_elem(X.n_elem)
01315 , vec_state(0)
01316 , mem_state(0)
01317 , mem()
01318 {
01319 arma_extra_debug_sigprint_this(this);
01320
01321 init_cold();
01322
01323 subview<eT>::extract(*this, X);
01324 }
01325
01326
01327
01329 template<typename eT>
01330 inline
01331 const Mat<eT>&
01332 Mat<eT>::operator=(const subview<eT>& X)
01333 {
01334 arma_extra_debug_sigprint();
01335
01336 const bool alias = (this == &(X.m));
01337
01338 if(alias == false)
01339 {
01340 init_warm(X.n_rows, X.n_cols);
01341
01342 subview<eT>::extract(*this, X);
01343 }
01344 else
01345 {
01346 Mat<eT> tmp(X);
01347
01348 steal_mem(tmp);
01349 }
01350
01351 return *this;
01352 }
01353
01354
01356 template<typename eT>
01357 inline
01358 const Mat<eT>&
01359 Mat<eT>::operator+=(const subview<eT>& X)
01360 {
01361 arma_extra_debug_sigprint();
01362
01363 subview<eT>::plus_inplace(*this, X);
01364
01365 return *this;
01366 }
01367
01368
01370 template<typename eT>
01371 inline
01372 const Mat<eT>&
01373 Mat<eT>::operator-=(const subview<eT>& X)
01374 {
01375 arma_extra_debug_sigprint();
01376
01377 subview<eT>::minus_inplace(*this, X);
01378
01379 return *this;
01380 }
01381
01382
01383
01385 template<typename eT>
01386 inline
01387 const Mat<eT>&
01388 Mat<eT>::operator*=(const subview<eT>& X)
01389 {
01390 arma_extra_debug_sigprint();
01391
01392 glue_times::apply_inplace(*this, X);
01393
01394 return *this;
01395 }
01396
01397
01398
01400 template<typename eT>
01401 inline
01402 const Mat<eT>&
01403 Mat<eT>::operator%=(const subview<eT>& X)
01404 {
01405 arma_extra_debug_sigprint();
01406
01407 subview<eT>::schur_inplace(*this, X);
01408
01409 return *this;
01410 }
01411
01412
01413
01415 template<typename eT>
01416 inline
01417 const Mat<eT>&
01418 Mat<eT>::operator/=(const subview<eT>& X)
01419 {
01420 arma_extra_debug_sigprint();
01421
01422 subview<eT>::div_inplace(*this, X);
01423
01424 return *this;
01425 }
01426
01427
01428
01430 template<typename eT>
01431 inline
01432 Mat<eT>::Mat(const subview_cube<eT>& x)
01433 : n_rows(0)
01434 , n_cols(0)
01435 , n_elem(0)
01436 , vec_state(0)
01437 , mem_state(0)
01438 , mem()
01439 {
01440 arma_extra_debug_sigprint_this(this);
01441
01442 this->operator=(x);
01443 }
01444
01445
01446
01448 template<typename eT>
01449 inline
01450 const Mat<eT>&
01451 Mat<eT>::operator=(const subview_cube<eT>& X)
01452 {
01453 arma_extra_debug_sigprint();
01454
01455 subview_cube<eT>::extract(*this, X);
01456
01457 return *this;
01458 }
01459
01460
01461
01463 template<typename eT>
01464 inline
01465 const Mat<eT>&
01466 Mat<eT>::operator+=(const subview_cube<eT>& X)
01467 {
01468 arma_extra_debug_sigprint();
01469
01470 subview_cube<eT>::plus_inplace(*this, X);
01471
01472 return *this;
01473 }
01474
01475
01476
01478 template<typename eT>
01479 inline
01480 const Mat<eT>&
01481 Mat<eT>::operator-=(const subview_cube<eT>& X)
01482 {
01483 arma_extra_debug_sigprint();
01484
01485 subview_cube<eT>::minus_inplace(*this, X);
01486
01487 return *this;
01488 }
01489
01490
01491
01493 template<typename eT>
01494 inline
01495 const Mat<eT>&
01496 Mat<eT>::operator*=(const subview_cube<eT>& X)
01497 {
01498 arma_extra_debug_sigprint();
01499
01500 const Mat<eT> tmp(X);
01501 glue_times::apply_inplace(*this, tmp);
01502
01503 return *this;
01504 }
01505
01506
01507
01509 template<typename eT>
01510 inline
01511 const Mat<eT>&
01512 Mat<eT>::operator%=(const subview_cube<eT>& X)
01513 {
01514 arma_extra_debug_sigprint();
01515
01516 subview_cube<eT>::schur_inplace(*this, X);
01517
01518 return *this;
01519 }
01520
01521
01522
01524 template<typename eT>
01525 inline
01526 const Mat<eT>&
01527 Mat<eT>::operator/=(const subview_cube<eT>& X)
01528 {
01529 arma_extra_debug_sigprint();
01530
01531 subview_cube<eT>::div_inplace(*this, X);
01532
01533 return *this;
01534 }
01535
01536
01537
01539 template<typename eT>
01540 inline
01541 Mat<eT>::Mat(const diagview<eT>& X)
01542 : n_rows(X.n_rows)
01543 , n_cols(X.n_cols)
01544 , n_elem(X.n_elem)
01545 , vec_state(0)
01546 , mem_state(0)
01547 , mem()
01548 {
01549 arma_extra_debug_sigprint_this(this);
01550
01551 init_cold();
01552
01553 diagview<eT>::extract(*this, X);
01554 }
01555
01556
01557
01559 template<typename eT>
01560 inline
01561 const Mat<eT>&
01562 Mat<eT>::operator=(const diagview<eT>& X)
01563 {
01564 arma_extra_debug_sigprint();
01565
01566 const bool alias = (this == &(X.m));
01567
01568 if(alias == false)
01569 {
01570 init_warm(X.n_rows, X.n_cols);
01571
01572 diagview<eT>::extract(*this, X);
01573 }
01574 else
01575 {
01576 Mat<eT> tmp(X);
01577
01578 steal_mem(tmp);
01579 }
01580
01581 return *this;
01582 }
01583
01584
01585
01587 template<typename eT>
01588 inline
01589 const Mat<eT>&
01590 Mat<eT>::operator+=(const diagview<eT>& X)
01591 {
01592 arma_extra_debug_sigprint();
01593
01594 diagview<eT>::plus_inplace(*this, X);
01595
01596 return *this;
01597 }
01598
01599
01601 template<typename eT>
01602 inline
01603 const Mat<eT>&
01604 Mat<eT>::operator-=(const diagview<eT>& X)
01605 {
01606 arma_extra_debug_sigprint();
01607
01608 diagview<eT>::minus_inplace(*this, X);
01609
01610 return *this;
01611 }
01612
01613
01614
01616 template<typename eT>
01617 inline
01618 const Mat<eT>&
01619 Mat<eT>::operator*=(const diagview<eT>& X)
01620 {
01621 arma_extra_debug_sigprint();
01622
01623 glue_times::apply_inplace(*this, X);
01624
01625 return *this;
01626 }
01627
01628
01629
01631 template<typename eT>
01632 inline
01633 const Mat<eT>&
01634 Mat<eT>::operator%=(const diagview<eT>& X)
01635 {
01636 arma_extra_debug_sigprint();
01637
01638 diagview<eT>::schur_inplace(*this, X);
01639
01640 return *this;
01641 }
01642
01643
01644
01646 template<typename eT>
01647 inline
01648 const Mat<eT>&
01649 Mat<eT>::operator/=(const diagview<eT>& X)
01650 {
01651 arma_extra_debug_sigprint();
01652
01653 diagview<eT>::div_inplace(*this, X);
01654
01655 return *this;
01656 }
01657
01658
01659
01660 template<typename eT>
01661 template<typename T1>
01662 inline
01663 Mat<eT>::Mat(const subview_elem1<eT,T1>& X)
01664 : n_rows(0)
01665 , n_cols(0)
01666 , n_elem(0)
01667 , vec_state(0)
01668 , mem_state(0)
01669 , mem()
01670 {
01671 arma_extra_debug_sigprint_this(this);
01672
01673 this->operator=(X);
01674 }
01675
01676
01677
01678 template<typename eT>
01679 template<typename T1>
01680 inline
01681 const Mat<eT>&
01682 Mat<eT>::operator=(const subview_elem1<eT,T1>& X)
01683 {
01684 arma_extra_debug_sigprint();
01685
01686 subview_elem1<eT,T1>::extract(*this, X);
01687
01688 return *this;
01689 }
01690
01691
01692
01693 template<typename eT>
01694 template<typename T1>
01695 inline
01696 const Mat<eT>&
01697 Mat<eT>::operator+=(const subview_elem1<eT,T1>& X)
01698 {
01699 arma_extra_debug_sigprint();
01700
01701 subview_elem1<eT,T1>::plus_inplace(*this, X);
01702
01703 return *this;
01704 }
01705
01706
01707
01708 template<typename eT>
01709 template<typename T1>
01710 inline
01711 const Mat<eT>&
01712 Mat<eT>::operator-=(const subview_elem1<eT,T1>& X)
01713 {
01714 arma_extra_debug_sigprint();
01715
01716 subview_elem1<eT,T1>::minus_inplace(*this, X);
01717
01718 return *this;
01719 }
01720
01721
01722
01723 template<typename eT>
01724 template<typename T1>
01725 inline
01726 const Mat<eT>&
01727 Mat<eT>::operator*=(const subview_elem1<eT,T1>& X)
01728 {
01729 arma_extra_debug_sigprint();
01730
01731 glue_times::apply_inplace(*this, X);
01732
01733 return *this;
01734 }
01735
01736
01737
01738 template<typename eT>
01739 template<typename T1>
01740 inline
01741 const Mat<eT>&
01742 Mat<eT>::operator%=(const subview_elem1<eT,T1>& X)
01743 {
01744 arma_extra_debug_sigprint();
01745
01746 subview_elem1<eT,T1>::schur_inplace(*this, X);
01747
01748 return *this;
01749 }
01750
01751
01752
01753 template<typename eT>
01754 template<typename T1>
01755 inline
01756 const Mat<eT>&
01757 Mat<eT>::operator/=(const subview_elem1<eT,T1>& X)
01758 {
01759 arma_extra_debug_sigprint();
01760
01761 subview_elem1<eT,T1>::div_inplace(*this, X);
01762
01763 return *this;
01764 }
01765
01766
01767
01768 template<typename eT>
01769 inline
01770 mat_injector< Mat<eT> >
01771 Mat<eT>::operator<<(const eT val)
01772 {
01773 return mat_injector< Mat<eT> >(*this, val);
01774 }
01775
01776
01777
01778 template<typename eT>
01779 inline
01780 mat_injector< Mat<eT> >
01781 Mat<eT>::operator<<(const injector_end_of_row& x)
01782 {
01783 return mat_injector< Mat<eT> >(*this, x);
01784 }
01785
01786
01787
01789 template<typename eT>
01790 arma_inline
01791 subview_row<eT>
01792 Mat<eT>::row(const uword row_num)
01793 {
01794 arma_extra_debug_sigprint();
01795
01796 arma_debug_check( row_num >= n_rows, "Mat::row(): out of bounds" );
01797
01798 return subview_row<eT>(*this, row_num);
01799 }
01800
01801
01802
01804 template<typename eT>
01805 arma_inline
01806 const subview_row<eT>
01807 Mat<eT>::row(const uword row_num) const
01808 {
01809 arma_extra_debug_sigprint();
01810
01811 arma_debug_check( row_num >= n_rows, "Mat::row(): out of bounds" );
01812
01813 return subview_row<eT>(*this, row_num);
01814 }
01815
01816
01817
01818 template<typename eT>
01819 inline
01820 subview_row<eT>
01821 Mat<eT>::operator()(const uword row_num, const span& col_span)
01822 {
01823 arma_extra_debug_sigprint();
01824
01825 const bool col_all = col_span.whole;
01826
01827 const uword local_n_cols = n_cols;
01828
01829 const uword in_col1 = col_all ? 0 : col_span.a;
01830 const uword in_col2 = col_span.b;
01831 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
01832
01833 arma_debug_check
01834 (
01835 (row_num >= n_rows)
01836 ||
01837 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
01838 ,
01839 "Mat::operator(): indices out of bounds or incorrectly used"
01840 );
01841
01842 return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);
01843 }
01844
01845
01846
01847 template<typename eT>
01848 inline
01849 const subview_row<eT>
01850 Mat<eT>::operator()(const uword row_num, const span& col_span) const
01851 {
01852 arma_extra_debug_sigprint();
01853
01854 const bool col_all = col_span.whole;
01855
01856 const uword local_n_cols = n_cols;
01857
01858 const uword in_col1 = col_all ? 0 : col_span.a;
01859 const uword in_col2 = col_span.b;
01860 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
01861
01862 arma_debug_check
01863 (
01864 (row_num >= n_rows)
01865 ||
01866 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
01867 ,
01868 "Mat::operator(): indices out of bounds or incorrectly used"
01869 );
01870
01871 return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);
01872 }
01873
01874
01875
01877 template<typename eT>
01878 arma_inline
01879 subview_col<eT>
01880 Mat<eT>::col(const uword col_num)
01881 {
01882 arma_extra_debug_sigprint();
01883
01884 arma_debug_check( col_num >= n_cols, "Mat::col(): out of bounds");
01885
01886 return subview_col<eT>(*this, col_num);
01887 }
01888
01889
01890
01892 template<typename eT>
01893 arma_inline
01894 const subview_col<eT>
01895 Mat<eT>::col(const uword col_num) const
01896 {
01897 arma_extra_debug_sigprint();
01898
01899 arma_debug_check( col_num >= n_cols, "Mat::col(): out of bounds");
01900
01901 return subview_col<eT>(*this, col_num);
01902 }
01903
01904
01905
01906 template<typename eT>
01907 inline
01908 subview_col<eT>
01909 Mat<eT>::operator()(const span& row_span, const uword col_num)
01910 {
01911 arma_extra_debug_sigprint();
01912
01913 const bool row_all = row_span.whole;
01914
01915 const uword local_n_rows = n_rows;
01916
01917 const uword in_row1 = row_all ? 0 : row_span.a;
01918 const uword in_row2 = row_span.b;
01919 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
01920
01921 arma_debug_check
01922 (
01923 (col_num >= n_cols)
01924 ||
01925 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
01926 ,
01927 "Mat::operator(): indices out of bounds or incorrectly used"
01928 );
01929
01930 return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);
01931 }
01932
01933
01934
01935 template<typename eT>
01936 inline
01937 const subview_col<eT>
01938 Mat<eT>::operator()(const span& row_span, const uword col_num) const
01939 {
01940 arma_extra_debug_sigprint();
01941
01942 const bool row_all = row_span.whole;
01943
01944 const uword local_n_rows = n_rows;
01945
01946 const uword in_row1 = row_all ? 0 : row_span.a;
01947 const uword in_row2 = row_span.b;
01948 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
01949
01950 arma_debug_check
01951 (
01952 (col_num >= n_cols)
01953 ||
01954 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
01955 ,
01956 "Mat::operator(): indices out of bounds or incorrectly used"
01957 );
01958
01959 return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);
01960 }
01961
01962
01963
01969 template<typename eT>
01970 inline
01971 Col<eT>
01972 Mat<eT>::unsafe_col(const uword col_num)
01973 {
01974 arma_extra_debug_sigprint();
01975
01976 arma_debug_check( col_num >= n_cols, "Mat::unsafe_col(): out of bounds");
01977
01978 return Col<eT>(colptr(col_num), n_rows, false, true);
01979 }
01980
01981
01982
01988 template<typename eT>
01989 inline
01990 const Col<eT>
01991 Mat<eT>::unsafe_col(const uword col_num) const
01992 {
01993 arma_extra_debug_sigprint();
01994
01995 arma_debug_check( col_num >= n_cols, "Mat::unsafe_col(): out of bounds");
01996
01997 typedef const Col<eT> out_type;
01998
01999 return out_type(const_cast<eT*>(colptr(col_num)), n_rows, false, true);
02000 }
02001
02002
02003
02005 template<typename eT>
02006 arma_inline
02007 subview<eT>
02008 Mat<eT>::rows(const uword in_row1, const uword in_row2)
02009 {
02010 arma_extra_debug_sigprint();
02011
02012 arma_debug_check
02013 (
02014 (in_row1 > in_row2) || (in_row2 >= n_rows),
02015 "Mat::rows(): indices out of bounds or incorrectly used"
02016 );
02017
02018 const uword subview_n_rows = in_row2 - in_row1 + 1;
02019
02020 return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );
02021 }
02022
02023
02024
02026 template<typename eT>
02027 arma_inline
02028 const subview<eT>
02029 Mat<eT>::rows(const uword in_row1, const uword in_row2) const
02030 {
02031 arma_extra_debug_sigprint();
02032
02033 arma_debug_check
02034 (
02035 (in_row1 > in_row2) || (in_row2 >= n_rows),
02036 "Mat::rows(): indices out of bounds or incorrectly used"
02037 );
02038
02039 const uword subview_n_rows = in_row2 - in_row1 + 1;
02040
02041 return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );
02042 }
02043
02044
02045
02047 template<typename eT>
02048 arma_inline
02049 subview<eT>
02050 Mat<eT>::cols(const uword in_col1, const uword in_col2)
02051 {
02052 arma_extra_debug_sigprint();
02053
02054 arma_debug_check
02055 (
02056 (in_col1 > in_col2) || (in_col2 >= n_cols),
02057 "Mat::cols(): indices out of bounds or incorrectly used"
02058 );
02059
02060 const uword subview_n_cols = in_col2 - in_col1 + 1;
02061
02062 return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);
02063 }
02064
02065
02066
02068 template<typename eT>
02069 arma_inline
02070 const subview<eT>
02071 Mat<eT>::cols(const uword in_col1, const uword in_col2) const
02072 {
02073 arma_extra_debug_sigprint();
02074
02075 arma_debug_check
02076 (
02077 (in_col1 > in_col2) || (in_col2 >= n_cols),
02078 "Mat::cols(): indices out of bounds or incorrectly used"
02079 );
02080
02081 const uword subview_n_cols = in_col2 - in_col1 + 1;
02082
02083 return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);
02084 }
02085
02086
02087
02089 template<typename eT>
02090 arma_inline
02091 subview<eT>
02092 Mat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)
02093 {
02094 arma_extra_debug_sigprint();
02095
02096 arma_debug_check
02097 (
02098 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
02099 "Mat::submat(): indices out of bounds or incorrectly used"
02100 );
02101
02102 const uword subview_n_rows = in_row2 - in_row1 + 1;
02103 const uword subview_n_cols = in_col2 - in_col1 + 1;
02104
02105 return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);
02106 }
02107
02108
02109
02111 template<typename eT>
02112 arma_inline
02113 const subview<eT>
02114 Mat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const
02115 {
02116 arma_extra_debug_sigprint();
02117
02118 arma_debug_check
02119 (
02120 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
02121 "Mat::submat(): indices out of bounds or incorrectly used"
02122 );
02123
02124 const uword subview_n_rows = in_row2 - in_row1 + 1;
02125 const uword subview_n_cols = in_col2 - in_col1 + 1;
02126
02127 return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);
02128 }
02129
02130
02131
02133 template<typename eT>
02134 inline
02135 subview<eT>
02136 Mat<eT>::submat(const span& row_span, const span& col_span)
02137 {
02138 arma_extra_debug_sigprint();
02139
02140 const bool row_all = row_span.whole;
02141 const bool col_all = col_span.whole;
02142
02143 const uword local_n_rows = n_rows;
02144 const uword local_n_cols = n_cols;
02145
02146 const uword in_row1 = row_all ? 0 : row_span.a;
02147 const uword in_row2 = row_span.b;
02148 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
02149
02150 const uword in_col1 = col_all ? 0 : col_span.a;
02151 const uword in_col2 = col_span.b;
02152 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
02153
02154 arma_debug_check
02155 (
02156 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
02157 ||
02158 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
02159 ,
02160 "Mat::submat(): indices out of bounds or incorrectly used"
02161 );
02162
02163 return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);
02164 }
02165
02166
02167
02169 template<typename eT>
02170 inline
02171 const subview<eT>
02172 Mat<eT>::submat(const span& row_span, const span& col_span) const
02173 {
02174 arma_extra_debug_sigprint();
02175
02176 const bool row_all = row_span.whole;
02177 const bool col_all = col_span.whole;
02178
02179 const uword local_n_rows = n_rows;
02180 const uword local_n_cols = n_cols;
02181
02182 const uword in_row1 = row_all ? 0 : row_span.a;
02183 const uword in_row2 = row_span.b;
02184 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
02185
02186 const uword in_col1 = col_all ? 0 : col_span.a;
02187 const uword in_col2 = col_span.b;
02188 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
02189
02190 arma_debug_check
02191 (
02192 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
02193 ||
02194 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
02195 ,
02196 "Mat::submat(): indices out of bounds or incorrectly used"
02197 );
02198
02199 return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);
02200 }
02201
02202
02203
02204 template<typename eT>
02205 inline
02206 subview<eT>
02207 Mat<eT>::operator()(const span& row_span, const span& col_span)
02208 {
02209 arma_extra_debug_sigprint();
02210
02211 return (*this).submat(row_span, col_span);
02212 }
02213
02214
02215
02216 template<typename eT>
02217 inline
02218 const subview<eT>
02219 Mat<eT>::operator()(const span& row_span, const span& col_span) const
02220 {
02221 arma_extra_debug_sigprint();
02222
02223 return (*this).submat(row_span, col_span);
02224 }
02225
02226
02227
02228 template<typename eT>
02229 template<typename T1>
02230 arma_inline
02231 subview_elem1<eT,T1>
02232 Mat<eT>::elem(const Base<uword,T1>& a)
02233 {
02234 arma_extra_debug_sigprint();
02235
02236 return subview_elem1<eT,T1>(*this, a);
02237 }
02238
02239
02240
02241 template<typename eT>
02242 template<typename T1>
02243 arma_inline
02244 const subview_elem1<eT,T1>
02245 Mat<eT>::elem(const Base<uword,T1>& a) const
02246 {
02247 arma_extra_debug_sigprint();
02248
02249 return subview_elem1<eT,T1>(*this, a);
02250 }
02251
02252
02253
02254
02255
02256
02257
02258
02259
02260
02261
02262
02263
02264
02265
02266
02267
02268
02269
02270
02271
02272
02273
02274
02275
02276
02277
02278
02279
02281 template<typename eT>
02282 arma_inline
02283 diagview<eT>
02284 Mat<eT>::diag(const sword in_id)
02285 {
02286 arma_extra_debug_sigprint();
02287
02288 const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;
02289 const uword col_offset = (in_id > 0) ? uword( in_id) : 0;
02290
02291 arma_debug_check
02292 (
02293 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
02294 "Mat::diag(): requested diagonal out of bounds"
02295 );
02296
02297 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
02298
02299 return diagview<eT>(*this, row_offset, col_offset, len);
02300 }
02301
02302
02303
02305 template<typename eT>
02306 arma_inline
02307 const diagview<eT>
02308 Mat<eT>::diag(const sword in_id) const
02309 {
02310 arma_extra_debug_sigprint();
02311
02312 const uword row_offset = (in_id < 0) ? -in_id : 0;
02313 const uword col_offset = (in_id > 0) ? in_id : 0;
02314
02315 arma_debug_check
02316 (
02317 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
02318 "Mat::diag(): requested diagonal out of bounds"
02319 );
02320
02321 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
02322
02323 return diagview<eT>(*this, row_offset, col_offset, len);
02324 }
02325
02326
02327
02328 template<typename eT>
02329 inline
02330 void
02331 Mat<eT>::swap_rows(const uword in_row1, const uword in_row2)
02332 {
02333 arma_extra_debug_sigprint();
02334
02335 arma_debug_check
02336 (
02337 (in_row1 >= n_rows) || (in_row2 >= n_rows),
02338 "Mat::swap_rows(): out of bounds"
02339 );
02340
02341 for(uword col=0; col<n_cols; ++col)
02342 {
02343 const uword offset = col*n_rows;
02344 const uword pos1 = in_row1 + offset;
02345 const uword pos2 = in_row2 + offset;
02346
02347 const eT tmp = mem[pos1];
02348 access::rw(mem[pos1]) = mem[pos2];
02349 access::rw(mem[pos2]) = tmp;
02350 }
02351
02352 }
02353
02354
02355
02356 template<typename eT>
02357 inline
02358 void
02359 Mat<eT>::swap_cols(const uword in_col1, const uword in_col2)
02360 {
02361 arma_extra_debug_sigprint();
02362
02363 arma_debug_check
02364 (
02365 (in_col1 >= n_cols) || (in_col2 >= n_cols),
02366 "Mat::swap_cols(): out of bounds"
02367 );
02368
02369 if(n_elem > 0)
02370 {
02371 eT* ptr1 = colptr(in_col1);
02372 eT* ptr2 = colptr(in_col2);
02373
02374 for(uword row=0; row<n_rows; ++row)
02375 {
02376 const eT tmp = ptr1[row];
02377 ptr1[row] = ptr2[row];
02378 ptr2[row] = tmp;
02379 }
02380 }
02381 }
02382
02383
02384
02386 template<typename eT>
02387 inline
02388 void
02389 Mat<eT>::shed_row(const uword row_num)
02390 {
02391 arma_extra_debug_sigprint();
02392
02393 arma_debug_check( row_num >= n_rows, "Mat::shed_row(): out of bounds");
02394
02395 shed_rows(row_num, row_num);
02396 }
02397
02398
02399
02401 template<typename eT>
02402 inline
02403 void
02404 Mat<eT>::shed_col(const uword col_num)
02405 {
02406 arma_extra_debug_sigprint();
02407
02408 arma_debug_check( col_num >= n_cols, "Mat::shed_col(): out of bounds");
02409
02410 shed_cols(col_num, col_num);
02411 }
02412
02413
02414
02416 template<typename eT>
02417 inline
02418 void
02419 Mat<eT>::shed_rows(const uword in_row1, const uword in_row2)
02420 {
02421 arma_extra_debug_sigprint();
02422
02423 arma_debug_check
02424 (
02425 (in_row1 > in_row2) || (in_row2 >= n_rows),
02426 "Mat::shed_rows(): indices out of bounds or incorrectly used"
02427 );
02428
02429 const uword n_keep_front = in_row1;
02430 const uword n_keep_back = n_rows - (in_row2 + 1);
02431
02432 Mat<eT> X(n_keep_front + n_keep_back, n_cols);
02433
02434 if(n_keep_front > 0)
02435 {
02436 X.rows( 0, (n_keep_front-1) ) = rows( 0, (in_row1-1) );
02437 }
02438
02439 if(n_keep_back > 0)
02440 {
02441 X.rows( n_keep_front, (n_keep_front+n_keep_back-1) ) = rows( (in_row2+1), (n_rows-1) );
02442 }
02443
02444 steal_mem(X);
02445 }
02446
02447
02448
02450 template<typename eT>
02451 inline
02452 void
02453 Mat<eT>::shed_cols(const uword in_col1, const uword in_col2)
02454 {
02455 arma_extra_debug_sigprint();
02456
02457 arma_debug_check
02458 (
02459 (in_col1 > in_col2) || (in_col2 >= n_cols),
02460 "Mat::shed_cols(): indices out of bounds or incorrectly used"
02461 );
02462
02463 const uword n_keep_front = in_col1;
02464 const uword n_keep_back = n_cols - (in_col2 + 1);
02465
02466 Mat<eT> X(n_rows, n_keep_front + n_keep_back);
02467
02468 if(n_keep_front > 0)
02469 {
02470 X.cols( 0, (n_keep_front-1) ) = cols( 0, (in_col1-1) );
02471 }
02472
02473 if(n_keep_back > 0)
02474 {
02475 X.cols( n_keep_front, (n_keep_front+n_keep_back-1) ) = cols( (in_col2+1), (n_cols-1) );
02476 }
02477
02478 steal_mem(X);
02479 }
02480
02481
02482
02485 template<typename eT>
02486 inline
02487 void
02488 Mat<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)
02489 {
02490 arma_extra_debug_sigprint();
02491
02492 const uword t_n_rows = n_rows;
02493 const uword t_n_cols = n_cols;
02494
02495 const uword A_n_rows = row_num;
02496 const uword B_n_rows = t_n_rows - row_num;
02497
02498
02499 arma_debug_check( (row_num > t_n_rows), "Mat::insert_rows(): out of bounds");
02500
02501 if(N > 0)
02502 {
02503 Mat<eT> out(t_n_rows + N, t_n_cols);
02504
02505 if(A_n_rows > 0)
02506 {
02507 out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);
02508 }
02509
02510 if(B_n_rows > 0)
02511 {
02512 out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1);
02513 }
02514
02515 if(set_to_zero == true)
02516 {
02517 out.rows(row_num, row_num + N - 1).zeros();
02518 }
02519
02520 steal_mem(out);
02521 }
02522 }
02523
02524
02525
02528 template<typename eT>
02529 inline
02530 void
02531 Mat<eT>::insert_cols(const uword col_num, const uword N, const bool set_to_zero)
02532 {
02533 arma_extra_debug_sigprint();
02534
02535 const uword t_n_rows = n_rows;
02536 const uword t_n_cols = n_cols;
02537
02538 const uword A_n_cols = col_num;
02539 const uword B_n_cols = t_n_cols - col_num;
02540
02541
02542 arma_debug_check( (col_num > t_n_cols), "Mat::insert_cols(): out of bounds");
02543
02544 if(N > 0)
02545 {
02546 Mat<eT> out(t_n_rows, t_n_cols + N);
02547
02548 if(A_n_cols > 0)
02549 {
02550 out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);
02551 }
02552
02553 if(B_n_cols > 0)
02554 {
02555 out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1);
02556 }
02557
02558 if(set_to_zero == true)
02559 {
02560 out.cols(col_num, col_num + N - 1).zeros();
02561 }
02562
02563 steal_mem(out);
02564 }
02565 }
02566
02567
02568
02571 template<typename eT>
02572 template<typename T1>
02573 inline
02574 void
02575 Mat<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)
02576 {
02577 arma_extra_debug_sigprint();
02578
02579 const unwrap<T1> tmp(X.get_ref());
02580 const Mat<eT>& C = tmp.M;
02581
02582 const uword C_n_rows = C.n_rows;
02583 const uword C_n_cols = C.n_cols;
02584
02585 const uword t_n_rows = n_rows;
02586 const uword t_n_cols = n_cols;
02587
02588 const uword A_n_rows = row_num;
02589 const uword B_n_rows = t_n_rows - row_num;
02590
02591 bool err_state = false;
02592 char* err_msg = 0;
02593
02594
02595
02596 arma_debug_set_error
02597 (
02598 err_state,
02599 err_msg,
02600 (row_num > t_n_rows),
02601 "Mat::insert_rows(): out of bounds"
02602 );
02603
02604 arma_debug_set_error
02605 (
02606 err_state,
02607 err_msg,
02608 ( (C_n_cols != t_n_cols) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),
02609 "Mat::insert_rows(): given object has an incompatible number of columns"
02610 );
02611
02612 arma_debug_check(err_state, err_msg);
02613
02614 if(C_n_rows > 0)
02615 {
02616 Mat<eT> out( t_n_rows + C_n_rows, (std::max)(t_n_cols, C_n_cols) );
02617
02618 if(t_n_cols > 0)
02619 {
02620 if(A_n_rows > 0)
02621 {
02622 out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);
02623 }
02624
02625 if( (t_n_cols > 0) && (B_n_rows > 0) )
02626 {
02627 out.rows(row_num + C_n_rows, t_n_rows + C_n_rows - 1) = rows(row_num, t_n_rows - 1);
02628 }
02629 }
02630
02631 if(C_n_cols > 0)
02632 {
02633 out.rows(row_num, row_num + C_n_rows - 1) = C;
02634 }
02635
02636 steal_mem(out);
02637 }
02638 }
02639
02640
02641
02644 template<typename eT>
02645 template<typename T1>
02646 inline
02647 void
02648 Mat<eT>::insert_cols(const uword col_num, const Base<eT,T1>& X)
02649 {
02650 arma_extra_debug_sigprint();
02651
02652 const unwrap<T1> tmp(X.get_ref());
02653 const Mat<eT>& C = tmp.M;
02654
02655 const uword C_n_rows = C.n_rows;
02656 const uword C_n_cols = C.n_cols;
02657
02658 const uword t_n_rows = n_rows;
02659 const uword t_n_cols = n_cols;
02660
02661 const uword A_n_cols = col_num;
02662 const uword B_n_cols = t_n_cols - col_num;
02663
02664 bool err_state = false;
02665 char* err_msg = 0;
02666
02667
02668
02669 arma_debug_set_error
02670 (
02671 err_state,
02672 err_msg,
02673 (col_num > t_n_cols),
02674 "Mat::insert_cols(): out of bounds"
02675 );
02676
02677 arma_debug_set_error
02678 (
02679 err_state,
02680 err_msg,
02681 ( (C_n_rows != t_n_rows) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),
02682 "Mat::insert_cols(): given object has an incompatible number of rows"
02683 );
02684
02685 arma_debug_check(err_state, err_msg);
02686
02687 if(C_n_cols > 0)
02688 {
02689 Mat<eT> out( (std::max)(t_n_rows, C_n_rows), t_n_cols + C_n_cols );
02690
02691 if(t_n_rows > 0)
02692 {
02693 if(A_n_cols > 0)
02694 {
02695 out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);
02696 }
02697
02698 if(B_n_cols > 0)
02699 {
02700 out.cols(col_num + C_n_cols, t_n_cols + C_n_cols - 1) = cols(col_num, t_n_cols - 1);
02701 }
02702 }
02703
02704 if(C_n_rows > 0)
02705 {
02706 out.cols(col_num, col_num + C_n_cols - 1) = C;
02707 }
02708
02709 steal_mem(out);
02710 }
02711 }
02712
02713
02714
02715 template<typename eT>
02716 template<typename gen_type>
02717 inline
02718 Mat<eT>::Mat(const Gen<eT, gen_type>& X)
02719 : n_rows(X.n_rows)
02720 , n_cols(X.n_cols)
02721 , n_elem(n_rows*n_cols)
02722 , vec_state(0)
02723 , mem_state(0)
02724 , mem()
02725 {
02726 arma_extra_debug_sigprint_this(this);
02727
02728 init_cold();
02729
02730 X.apply(*this);
02731 }
02732
02733
02734
02735 template<typename eT>
02736 template<typename gen_type>
02737 inline
02738 const Mat<eT>&
02739 Mat<eT>::operator=(const Gen<eT, gen_type>& X)
02740 {
02741 arma_extra_debug_sigprint();
02742
02743 init_warm(X.n_rows, X.n_cols);
02744
02745 X.apply(*this);
02746
02747 return *this;
02748 }
02749
02750
02751
02752 template<typename eT>
02753 template<typename gen_type>
02754 inline
02755 const Mat<eT>&
02756 Mat<eT>::operator+=(const Gen<eT, gen_type>& X)
02757 {
02758 arma_extra_debug_sigprint();
02759
02760 X.apply_inplace_plus(*this);
02761
02762 return *this;
02763 }
02764
02765
02766
02767 template<typename eT>
02768 template<typename gen_type>
02769 inline
02770 const Mat<eT>&
02771 Mat<eT>::operator-=(const Gen<eT, gen_type>& X)
02772 {
02773 arma_extra_debug_sigprint();
02774
02775 X.apply_inplace_minus(*this);
02776
02777 return *this;
02778 }
02779
02780
02781
02782 template<typename eT>
02783 template<typename gen_type>
02784 inline
02785 const Mat<eT>&
02786 Mat<eT>::operator*=(const Gen<eT, gen_type>& X)
02787 {
02788 arma_extra_debug_sigprint();
02789
02790 const Mat<eT> tmp(X);
02791
02792 return (*this).operator*=(tmp);
02793 }
02794
02795
02796
02797 template<typename eT>
02798 template<typename gen_type>
02799 inline
02800 const Mat<eT>&
02801 Mat<eT>::operator%=(const Gen<eT, gen_type>& X)
02802 {
02803 arma_extra_debug_sigprint();
02804
02805 X.apply_inplace_schur(*this);
02806
02807 return *this;
02808 }
02809
02810
02811
02812 template<typename eT>
02813 template<typename gen_type>
02814 inline
02815 const Mat<eT>&
02816 Mat<eT>::operator/=(const Gen<eT, gen_type>& X)
02817 {
02818 arma_extra_debug_sigprint();
02819
02820 X.apply_inplace_div(*this);
02821
02822 return *this;
02823 }
02824
02825
02826
02828 template<typename eT>
02829 template<typename T1, typename op_type>
02830 inline
02831 Mat<eT>::Mat(const Op<T1, op_type>& X)
02832 : n_rows(0)
02833 , n_cols(0)
02834 , n_elem(0)
02835 , vec_state(0)
02836 , mem_state(0)
02837 , mem()
02838 {
02839 arma_extra_debug_sigprint_this(this);
02840
02841 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02842
02843 op_type::apply(*this, X);
02844 }
02845
02846
02847
02849 template<typename eT>
02850 template<typename T1, typename op_type>
02851 inline
02852 const Mat<eT>&
02853 Mat<eT>::operator=(const Op<T1, op_type>& X)
02854 {
02855 arma_extra_debug_sigprint();
02856
02857 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02858
02859 op_type::apply(*this, X);
02860
02861 return *this;
02862 }
02863
02864
02865
02867 template<typename eT>
02868 template<typename T1, typename op_type>
02869 inline
02870 const Mat<eT>&
02871 Mat<eT>::operator+=(const Op<T1, op_type>& X)
02872 {
02873 arma_extra_debug_sigprint();
02874
02875 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02876
02877 const Mat<eT> m(X);
02878
02879 return (*this).operator+=(m);
02880 }
02881
02882
02883
02885 template<typename eT>
02886 template<typename T1, typename op_type>
02887 inline
02888 const Mat<eT>&
02889 Mat<eT>::operator-=(const Op<T1, op_type>& X)
02890 {
02891 arma_extra_debug_sigprint();
02892
02893 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02894
02895 const Mat<eT> m(X);
02896
02897 return (*this).operator-=(m);
02898 }
02899
02900
02901
02903 template<typename eT>
02904 template<typename T1, typename op_type>
02905 inline
02906 const Mat<eT>&
02907 Mat<eT>::operator*=(const Op<T1, op_type>& X)
02908 {
02909 arma_extra_debug_sigprint();
02910
02911 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02912
02913 glue_times::apply_inplace(*this, X);
02914
02915 return *this;
02916 }
02917
02918
02919
02921 template<typename eT>
02922 template<typename T1, typename op_type>
02923 inline
02924 const Mat<eT>&
02925 Mat<eT>::operator%=(const Op<T1, op_type>& X)
02926 {
02927 arma_extra_debug_sigprint();
02928
02929 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02930
02931 const Mat<eT> m(X);
02932
02933 return (*this).operator%=(m);
02934 }
02935
02936
02937
02939 template<typename eT>
02940 template<typename T1, typename op_type>
02941 inline
02942 const Mat<eT>&
02943 Mat<eT>::operator/=(const Op<T1, op_type>& X)
02944 {
02945 arma_extra_debug_sigprint();
02946
02947 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02948
02949 const Mat<eT> m(X);
02950
02951 return (*this).operator/=(m);
02952 }
02953
02954
02955
02957 template<typename eT>
02958 template<typename T1, typename eop_type>
02959 inline
02960 Mat<eT>::Mat(const eOp<T1, eop_type>& X)
02961 : n_rows(X.get_n_rows())
02962 , n_cols(X.get_n_cols())
02963 , n_elem(X.get_n_elem())
02964 , vec_state(0)
02965 , mem_state(0)
02966 , mem()
02967 {
02968 arma_extra_debug_sigprint_this(this);
02969
02970 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02971
02972 init_cold();
02973
02974 eop_type::apply(*this, X);
02975 }
02976
02977
02978
02980 template<typename eT>
02981 template<typename T1, typename eop_type>
02982 inline
02983 const Mat<eT>&
02984 Mat<eT>::operator=(const eOp<T1, eop_type>& X)
02985 {
02986 arma_extra_debug_sigprint();
02987
02988 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
02989
02990 const bool bad_alias = (X.P.has_subview && X.P.is_alias(*this));
02991
02992 if(bad_alias == false)
02993 {
02994 init_warm(X.get_n_rows(), X.get_n_cols());
02995
02996 eop_type::apply(*this, X);
02997 }
02998 else
02999 {
03000 Mat<eT> tmp(X);
03001
03002 steal_mem(tmp);
03003 }
03004
03005 return *this;
03006 }
03007
03008
03009
03010 template<typename eT>
03011 template<typename T1, typename eop_type>
03012 inline
03013 const Mat<eT>&
03014 Mat<eT>::operator+=(const eOp<T1, eop_type>& X)
03015 {
03016 arma_extra_debug_sigprint();
03017
03018 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03019
03020 eop_type::apply_inplace_plus(*this, X);
03021
03022 return *this;
03023 }
03024
03025
03026
03027 template<typename eT>
03028 template<typename T1, typename eop_type>
03029 inline
03030 const Mat<eT>&
03031 Mat<eT>::operator-=(const eOp<T1, eop_type>& X)
03032 {
03033 arma_extra_debug_sigprint();
03034
03035 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03036
03037 eop_type::apply_inplace_minus(*this, X);
03038
03039 return *this;
03040 }
03041
03042
03043
03044 template<typename eT>
03045 template<typename T1, typename eop_type>
03046 inline
03047 const Mat<eT>&
03048 Mat<eT>::operator*=(const eOp<T1, eop_type>& X)
03049 {
03050 arma_extra_debug_sigprint();
03051
03052 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03053
03054 glue_times::apply_inplace(*this, X);
03055
03056 return *this;
03057 }
03058
03059
03060
03061 template<typename eT>
03062 template<typename T1, typename eop_type>
03063 inline
03064 const Mat<eT>&
03065 Mat<eT>::operator%=(const eOp<T1, eop_type>& X)
03066 {
03067 arma_extra_debug_sigprint();
03068
03069 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03070
03071 eop_type::apply_inplace_schur(*this, X);
03072
03073 return *this;
03074 }
03075
03076
03077
03078 template<typename eT>
03079 template<typename T1, typename eop_type>
03080 inline
03081 const Mat<eT>&
03082 Mat<eT>::operator/=(const eOp<T1, eop_type>& X)
03083 {
03084 arma_extra_debug_sigprint();
03085
03086 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03087
03088 eop_type::apply_inplace_div(*this, X);
03089
03090 return *this;
03091 }
03092
03093
03094
03096 template<typename eT>
03097 template<typename T1, typename op_type>
03098 inline
03099 Mat<eT>::Mat(const mtOp<eT, T1, op_type>& X)
03100 : n_rows(0)
03101 , n_cols(0)
03102 , n_elem(0)
03103 , vec_state(0)
03104 , mem_state(0)
03105 , mem()
03106 {
03107 arma_extra_debug_sigprint_this(this);
03108
03109 op_type::apply(*this, X);
03110 }
03111
03112
03113
03115 template<typename eT>
03116 template<typename T1, typename op_type>
03117 inline
03118 const Mat<eT>&
03119 Mat<eT>::operator=(const mtOp<eT, T1, op_type>& X)
03120 {
03121 arma_extra_debug_sigprint();
03122
03123 op_type::apply(*this, X);
03124
03125 return *this;
03126 }
03127
03128
03129
03131 template<typename eT>
03132 template<typename T1, typename op_type>
03133 inline
03134 const Mat<eT>&
03135 Mat<eT>::operator+=(const mtOp<eT, T1, op_type>& X)
03136 {
03137 arma_extra_debug_sigprint();
03138
03139 const Mat<eT> m(X);
03140
03141 return (*this).operator+=(m);
03142 }
03143
03144
03145
03147 template<typename eT>
03148 template<typename T1, typename op_type>
03149 inline
03150 const Mat<eT>&
03151 Mat<eT>::operator-=(const mtOp<eT, T1, op_type>& X)
03152 {
03153 arma_extra_debug_sigprint();
03154
03155 const Mat<eT> m(X);
03156
03157 return (*this).operator-=(m);
03158 }
03159
03160
03161
03163 template<typename eT>
03164 template<typename T1, typename op_type>
03165 inline
03166 const Mat<eT>&
03167 Mat<eT>::operator*=(const mtOp<eT, T1, op_type>& X)
03168 {
03169 arma_extra_debug_sigprint();
03170
03171 const Mat<eT> m(X);
03172
03173 return (*this).operator*=(m);
03174 }
03175
03176
03177
03179 template<typename eT>
03180 template<typename T1, typename op_type>
03181 inline
03182 const Mat<eT>&
03183 Mat<eT>::operator%=(const mtOp<eT, T1, op_type>& X)
03184 {
03185 arma_extra_debug_sigprint();
03186
03187 const Mat<eT> m(X);
03188
03189 return (*this).operator%=(m);
03190 }
03191
03192
03193
03195 template<typename eT>
03196 template<typename T1, typename op_type>
03197 inline
03198 const Mat<eT>&
03199 Mat<eT>::operator/=(const mtOp<eT, T1, op_type>& X)
03200 {
03201 arma_extra_debug_sigprint();
03202
03203 const Mat<eT> m(X);
03204
03205 return (*this).operator/=(m);
03206 }
03207
03208
03209
03211 template<typename eT>
03212 template<typename T1, typename T2, typename glue_type>
03213 inline
03214 Mat<eT>::Mat(const Glue<T1, T2, glue_type>& X)
03215 : n_rows(0)
03216 , n_cols(0)
03217 , n_elem(0)
03218 , vec_state(0)
03219 , mem_state(0)
03220 , mem()
03221 {
03222 arma_extra_debug_sigprint_this(this);
03223
03224 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03225 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03226
03227 glue_type::apply(*this, X);
03228 }
03229
03230
03231
03233 template<typename eT>
03234 template<typename T1, typename T2, typename glue_type>
03235 inline
03236 const Mat<eT>&
03237 Mat<eT>::operator=(const Glue<T1, T2, glue_type>& X)
03238 {
03239 arma_extra_debug_sigprint();
03240
03241 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03242 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03243
03244 glue_type::apply(*this, X);
03245
03246 return *this;
03247 }
03248
03249
03250
03252 template<typename eT>
03253 template<typename T1, typename T2, typename glue_type>
03254 inline
03255 const Mat<eT>&
03256 Mat<eT>::operator+=(const Glue<T1, T2, glue_type>& X)
03257 {
03258 arma_extra_debug_sigprint();
03259
03260 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03261 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03262
03263 const Mat<eT> m(X);
03264
03265 return (*this).operator+=(m);
03266 }
03267
03268
03269
03271 template<typename eT>
03272 template<typename T1, typename T2, typename glue_type>
03273 inline
03274 const Mat<eT>&
03275 Mat<eT>::operator-=(const Glue<T1, T2, glue_type>& X)
03276 {
03277 arma_extra_debug_sigprint();
03278
03279 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03280 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03281
03282 const Mat<eT> m(X);
03283
03284 return (*this).operator-=(m);
03285 }
03286
03287
03288
03290 template<typename eT>
03291 template<typename T1, typename T2, typename glue_type>
03292 inline
03293 const Mat<eT>&
03294 Mat<eT>::operator*=(const Glue<T1, T2, glue_type>& X)
03295 {
03296 arma_extra_debug_sigprint();
03297
03298 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03299 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03300
03301 glue_times::apply_inplace(*this, X);
03302
03303 return *this;
03304 }
03305
03306
03307
03309 template<typename eT>
03310 template<typename T1, typename T2, typename glue_type>
03311 inline
03312 const Mat<eT>&
03313 Mat<eT>::operator%=(const Glue<T1, T2, glue_type>& X)
03314 {
03315 arma_extra_debug_sigprint();
03316
03317 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03318 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03319
03320 const Mat<eT> m(X);
03321
03322 return (*this).operator%=(m);
03323 }
03324
03325
03326
03328 template<typename eT>
03329 template<typename T1, typename T2, typename glue_type>
03330 inline
03331 const Mat<eT>&
03332 Mat<eT>::operator/=(const Glue<T1, T2, glue_type>& X)
03333 {
03334 arma_extra_debug_sigprint();
03335
03336 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03337 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03338
03339 const Mat<eT> m(X);
03340
03341 return (*this).operator/=(m);
03342 }
03343
03344
03345
03346 template<typename eT>
03347 template<typename T1, typename T2>
03348 inline
03349 const Mat<eT>&
03350 Mat<eT>::operator+=(const Glue<T1, T2, glue_times>& X)
03351 {
03352 arma_extra_debug_sigprint();
03353
03354 glue_times::apply_inplace_plus(*this, X, sword(+1));
03355
03356 return *this;
03357 }
03358
03359
03360
03361 template<typename eT>
03362 template<typename T1, typename T2>
03363 inline
03364 const Mat<eT>&
03365 Mat<eT>::operator-=(const Glue<T1, T2, glue_times>& X)
03366 {
03367 arma_extra_debug_sigprint();
03368
03369 glue_times::apply_inplace_plus(*this, X, sword(-1));
03370
03371 return *this;
03372 }
03373
03374
03375
03377 template<typename eT>
03378 template<typename T1, typename T2, typename eglue_type>
03379 inline
03380 Mat<eT>::Mat(const eGlue<T1, T2, eglue_type>& X)
03381 : n_rows(X.get_n_rows())
03382 , n_cols(X.get_n_cols())
03383 , n_elem(X.get_n_elem())
03384 , vec_state(0)
03385 , mem_state(0)
03386 , mem()
03387 {
03388 arma_extra_debug_sigprint_this(this);
03389
03390 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03391 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03392
03393 init_cold();
03394
03395 eglue_type::apply(*this, X);
03396 }
03397
03398
03399
03401 template<typename eT>
03402 template<typename T1, typename T2, typename eglue_type>
03403 inline
03404 const Mat<eT>&
03405 Mat<eT>::operator=(const eGlue<T1, T2, eglue_type>& X)
03406 {
03407 arma_extra_debug_sigprint();
03408
03409 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03410 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03411
03412 const bool bad_alias = ( (X.P1.has_subview && X.P1.is_alias(*this)) || ( X.P2.has_subview && X.P2.is_alias(*this)) );
03413
03414 if(bad_alias == false)
03415 {
03416 init_warm(X.get_n_rows(), X.get_n_cols());
03417
03418 eglue_type::apply(*this, X);
03419 }
03420 else
03421 {
03422 Mat<eT> tmp(X);
03423
03424 steal_mem(tmp);
03425 }
03426
03427 return *this;
03428 }
03429
03430
03431
03433 template<typename eT>
03434 template<typename T1, typename T2, typename eglue_type>
03435 inline
03436 const Mat<eT>&
03437 Mat<eT>::operator+=(const eGlue<T1, T2, eglue_type>& X)
03438 {
03439 arma_extra_debug_sigprint();
03440
03441 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03442 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03443
03444 eglue_type::apply_inplace_plus(*this, X);
03445
03446 return *this;
03447 }
03448
03449
03450
03452 template<typename eT>
03453 template<typename T1, typename T2, typename eglue_type>
03454 inline
03455 const Mat<eT>&
03456 Mat<eT>::operator-=(const eGlue<T1, T2, eglue_type>& X)
03457 {
03458 arma_extra_debug_sigprint();
03459
03460 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03461 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03462
03463 eglue_type::apply_inplace_minus(*this, X);
03464
03465 return *this;
03466 }
03467
03468
03469
03470 template<typename eT>
03471 template<typename T1, typename T2, typename eglue_type>
03472 inline
03473 const Mat<eT>&
03474 Mat<eT>::operator*=(const eGlue<T1, T2, eglue_type>& X)
03475 {
03476 arma_extra_debug_sigprint();
03477
03478 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03479 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03480
03481 glue_times::apply_inplace(*this, X);
03482 return *this;
03483 }
03484
03485
03486
03487 template<typename eT>
03488 template<typename T1, typename T2, typename eglue_type>
03489 inline
03490 const Mat<eT>&
03491 Mat<eT>::operator%=(const eGlue<T1, T2, eglue_type>& X)
03492 {
03493 arma_extra_debug_sigprint();
03494
03495 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03496 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03497
03498 eglue_type::apply_inplace_schur(*this, X);
03499 return *this;
03500 }
03501
03502
03503
03504 template<typename eT>
03505 template<typename T1, typename T2, typename eglue_type>
03506 inline
03507 const Mat<eT>&
03508 Mat<eT>::operator/=(const eGlue<T1, T2, eglue_type>& X)
03509 {
03510 arma_extra_debug_sigprint();
03511
03512 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
03513 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
03514
03515 eglue_type::apply_inplace_div(*this, X);
03516 return *this;
03517 }
03518
03519
03520
03522 template<typename eT>
03523 template<typename T1, typename T2, typename glue_type>
03524 inline
03525 Mat<eT>::Mat(const mtGlue<eT, T1, T2, glue_type>& X)
03526 : n_rows(0)
03527 , n_cols(0)
03528 , n_elem(0)
03529 , vec_state(0)
03530 , mem_state(0)
03531 , mem()
03532 {
03533 arma_extra_debug_sigprint_this(this);
03534
03535 glue_type::apply(*this, X);
03536 }
03537
03538
03539
03541 template<typename eT>
03542 template<typename T1, typename T2, typename glue_type>
03543 inline
03544 const Mat<eT>&
03545 Mat<eT>::operator=(const mtGlue<eT, T1, T2, glue_type>& X)
03546 {
03547 arma_extra_debug_sigprint();
03548
03549 glue_type::apply(*this, X);
03550
03551 return *this;
03552 }
03553
03554
03555
03557 template<typename eT>
03558 template<typename T1, typename T2, typename glue_type>
03559 inline
03560 const Mat<eT>&
03561 Mat<eT>::operator+=(const mtGlue<eT, T1, T2, glue_type>& X)
03562 {
03563 arma_extra_debug_sigprint();
03564
03565 const Mat<eT> m(X);
03566
03567 return (*this).operator+=(m);
03568 }
03569
03570
03571
03573 template<typename eT>
03574 template<typename T1, typename T2, typename glue_type>
03575 inline
03576 const Mat<eT>&
03577 Mat<eT>::operator-=(const mtGlue<eT, T1, T2, glue_type>& X)
03578 {
03579 arma_extra_debug_sigprint();
03580
03581 const Mat<eT> m(X);
03582
03583 return (*this).operator-=(m);
03584 }
03585
03586
03587
03589 template<typename eT>
03590 template<typename T1, typename T2, typename glue_type>
03591 inline
03592 const Mat<eT>&
03593 Mat<eT>::operator*=(const mtGlue<eT, T1, T2, glue_type>& X)
03594 {
03595 arma_extra_debug_sigprint();
03596
03597 const Mat<eT> m(X);
03598
03599 glue_times::apply_inplace(*this, m);
03600
03601 return *this;
03602 }
03603
03604
03605
03607 template<typename eT>
03608 template<typename T1, typename T2, typename glue_type>
03609 inline
03610 const Mat<eT>&
03611 Mat<eT>::operator%=(const mtGlue<eT, T1, T2, glue_type>& X)
03612 {
03613 arma_extra_debug_sigprint();
03614
03615 const Mat<eT> m(X);
03616
03617 return (*this).operator%=(m);
03618 }
03619
03620
03621
03623 template<typename eT>
03624 template<typename T1, typename T2, typename glue_type>
03625 inline
03626 const Mat<eT>&
03627 Mat<eT>::operator/=(const mtGlue<eT, T1, T2, glue_type>& X)
03628 {
03629 arma_extra_debug_sigprint();
03630
03631 const Mat<eT> m(X);
03632
03633 return (*this).operator/=(m);
03634 }
03635
03636
03637
03639 template<typename eT>
03640 arma_inline
03641 arma_warn_unused
03642 eT&
03643 Mat<eT>::operator() (const uword i)
03644 {
03645 arma_debug_check( (i >= n_elem), "Mat::operator(): out of bounds");
03646 return access::rw(mem[i]);
03647 }
03648
03649
03650
03652 template<typename eT>
03653 arma_inline
03654 arma_warn_unused
03655 eT
03656 Mat<eT>::operator() (const uword i) const
03657 {
03658 arma_debug_check( (i >= n_elem), "Mat::operator(): out of bounds");
03659 return mem[i];
03660 }
03661
03662
03664 template<typename eT>
03665 arma_inline
03666 arma_warn_unused
03667 eT&
03668 Mat<eT>::operator[] (const uword i)
03669 {
03670 return access::rw(mem[i]);
03671 }
03672
03673
03674
03676 template<typename eT>
03677 arma_inline
03678 arma_warn_unused
03679 eT
03680 Mat<eT>::operator[] (const uword i) const
03681 {
03682 return mem[i];
03683 }
03684
03685
03686
03688 template<typename eT>
03689 arma_inline
03690 arma_warn_unused
03691 eT&
03692 Mat<eT>::at(const uword i)
03693 {
03694 return access::rw(mem[i]);
03695 }
03696
03697
03698
03700 template<typename eT>
03701 arma_inline
03702 arma_warn_unused
03703 eT
03704 Mat<eT>::at(const uword i) const
03705 {
03706 return mem[i];
03707 }
03708
03709
03710
03712 template<typename eT>
03713 arma_inline
03714 arma_warn_unused
03715 eT&
03716 Mat<eT>::operator() (const uword in_row, const uword in_col)
03717 {
03718 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): out of bounds");
03719 return access::rw(mem[in_row + in_col*n_rows]);
03720 }
03721
03722
03723
03725 template<typename eT>
03726 arma_inline
03727 arma_warn_unused
03728 eT
03729 Mat<eT>::operator() (const uword in_row, const uword in_col) const
03730 {
03731 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): out of bounds");
03732 return mem[in_row + in_col*n_rows];
03733 }
03734
03735
03736
03738 template<typename eT>
03739 arma_inline
03740 arma_warn_unused
03741 eT&
03742 Mat<eT>::at(const uword in_row, const uword in_col)
03743 {
03744 return access::rw( mem[in_row + in_col*n_rows] );
03745 }
03746
03747
03748
03750 template<typename eT>
03751 arma_inline
03752 arma_warn_unused
03753 eT
03754 Mat<eT>::at(const uword in_row, const uword in_col) const
03755 {
03756 return mem[in_row + in_col*n_rows];
03757 }
03758
03759
03760
03762 template<typename eT>
03763 arma_inline
03764 const Mat<eT>&
03765 Mat<eT>::operator++()
03766 {
03767 Mat_aux::prefix_pp(*this);
03768 return *this;
03769 }
03770
03771
03772
03774 template<typename eT>
03775 arma_inline
03776 void
03777 Mat<eT>::operator++(int)
03778 {
03779 Mat_aux::postfix_pp(*this);
03780 }
03781
03782
03783
03785 template<typename eT>
03786 arma_inline
03787 const Mat<eT>&
03788 Mat<eT>::operator--()
03789 {
03790 Mat_aux::prefix_mm(*this);
03791 return *this;
03792 }
03793
03794
03795
03797 template<typename eT>
03798 arma_inline
03799 void
03800 Mat<eT>::operator--(int)
03801 {
03802 Mat_aux::postfix_mm(*this);
03803 }
03804
03805
03806
03808 template<typename eT>
03809 arma_inline
03810 arma_warn_unused
03811 bool
03812 Mat<eT>::is_empty() const
03813 {
03814 return (n_elem == 0);
03815 }
03816
03817
03818
03820 template<typename eT>
03821 arma_inline
03822 arma_warn_unused
03823 bool
03824 Mat<eT>::is_vec() const
03825 {
03826 return ( (n_rows == 1) || (n_cols == 1) );
03827 }
03828
03829
03830
03832 template<typename eT>
03833 arma_inline
03834 arma_warn_unused
03835 bool
03836 Mat<eT>::is_rowvec() const
03837 {
03838 return (n_rows == 1);
03839 }
03840
03841
03842
03844 template<typename eT>
03845 arma_inline
03846 arma_warn_unused
03847 bool
03848 Mat<eT>::is_colvec() const
03849 {
03850 return (n_cols == 1);
03851 }
03852
03853
03854
03856 template<typename eT>
03857 arma_inline
03858 arma_warn_unused
03859 bool
03860 Mat<eT>::is_square() const
03861 {
03862 return (n_rows == n_cols);
03863 }
03864
03865
03866
03868 template<typename eT>
03869 inline
03870 arma_warn_unused
03871 bool
03872 Mat<eT>::is_finite() const
03873 {
03874 return arrayops::is_finite( memptr(), n_elem );
03875 }
03876
03877
03878
03880 template<typename eT>
03881 arma_inline
03882 arma_warn_unused
03883 bool
03884 Mat<eT>::in_range(const uword i) const
03885 {
03886 return (i < n_elem);
03887 }
03888
03889
03890
03892 template<typename eT>
03893 arma_inline
03894 arma_warn_unused
03895 bool
03896 Mat<eT>::in_range(const span& x) const
03897 {
03898 arma_extra_debug_sigprint();
03899
03900 if(x.whole == true)
03901 {
03902 return true;
03903 }
03904 else
03905 {
03906 const uword a = x.a;
03907 const uword b = x.b;
03908
03909 return ( (a <= b) && (b < n_elem) );
03910 }
03911 }
03912
03913
03914
03916 template<typename eT>
03917 arma_inline
03918 arma_warn_unused
03919 bool
03920 Mat<eT>::in_range(const uword in_row, const uword in_col) const
03921 {
03922 return ( (in_row < n_rows) && (in_col < n_cols) );
03923 }
03924
03925
03926
03927 template<typename eT>
03928 arma_inline
03929 arma_warn_unused
03930 bool
03931 Mat<eT>::in_range(const span& row_span, const uword in_col) const
03932 {
03933 arma_extra_debug_sigprint();
03934
03935 if(row_span.whole == true)
03936 {
03937 return (in_col < n_cols);
03938 }
03939 else
03940 {
03941 const uword in_row1 = row_span.a;
03942 const uword in_row2 = row_span.b;
03943
03944 return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) );
03945 }
03946 }
03947
03948
03949
03950 template<typename eT>
03951 arma_inline
03952 arma_warn_unused
03953 bool
03954 Mat<eT>::in_range(const uword in_row, const span& col_span) const
03955 {
03956 arma_extra_debug_sigprint();
03957
03958 if(col_span.whole == true)
03959 {
03960 return (in_row < n_rows);
03961 }
03962 else
03963 {
03964 const uword in_col1 = col_span.a;
03965 const uword in_col2 = col_span.b;
03966
03967 return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) );
03968 }
03969 }
03970
03971
03972
03973 template<typename eT>
03974 arma_inline
03975 arma_warn_unused
03976 bool
03977 Mat<eT>::in_range(const span& row_span, const span& col_span) const
03978 {
03979 arma_extra_debug_sigprint();
03980
03981 const uword in_row1 = row_span.a;
03982 const uword in_row2 = row_span.b;
03983
03984 const uword in_col1 = col_span.a;
03985 const uword in_col2 = col_span.b;
03986
03987 const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) );
03988 const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) );
03989
03990 return ( (rows_ok == true) && (cols_ok == true) );
03991 }
03992
03993
03994
03996 template<typename eT>
03997 arma_inline
03998 arma_warn_unused
03999 eT*
04000 Mat<eT>::colptr(const uword in_col)
04001 {
04002 return & access::rw(mem[in_col*n_rows]);
04003 }
04004
04005
04006
04008 template<typename eT>
04009 arma_inline
04010 arma_warn_unused
04011 const eT*
04012 Mat<eT>::colptr(const uword in_col) const
04013 {
04014 return & mem[in_col*n_rows];
04015 }
04016
04017
04018
04020 template<typename eT>
04021 arma_inline
04022 arma_warn_unused
04023 eT*
04024 Mat<eT>::memptr()
04025 {
04026 return const_cast<eT*>(mem);
04027 }
04028
04029
04030
04032 template<typename eT>
04033 arma_inline
04034 arma_warn_unused
04035 const eT*
04036 Mat<eT>::memptr() const
04037 {
04038 return mem;
04039 }
04040
04041
04042
04047 template<typename eT>
04048 inline
04049 void
04050 Mat<eT>::impl_print(const std::string& extra_text) const
04051 {
04052 arma_extra_debug_sigprint();
04053
04054 if(extra_text.length() != 0)
04055 {
04056 const std::streamsize orig_width = cout.width();
04057
04058 cout << extra_text << '\n';
04059
04060 cout.width(orig_width);
04061 }
04062
04063 arma_ostream::print(cout, *this, true);
04064 }
04065
04066
04067
04072 template<typename eT>
04073 inline
04074 void
04075 Mat<eT>::impl_print(std::ostream& user_stream, const std::string& extra_text) const
04076 {
04077 arma_extra_debug_sigprint();
04078
04079 if(extra_text.length() != 0)
04080 {
04081 const std::streamsize orig_width = user_stream.width();
04082
04083 user_stream << extra_text << '\n';
04084
04085 user_stream.width(orig_width);
04086 }
04087
04088 arma_ostream::print(user_stream, *this, true);
04089 }
04090
04091
04092
04094 template<typename eT>
04095 inline
04096 void
04097 Mat<eT>::impl_print_trans(const std::string& extra_text) const
04098 {
04099 arma_extra_debug_sigprint();
04100
04101 Mat<eT> tmp;
04102 op_strans::apply_noalias(tmp, *this);
04103
04104 tmp.impl_print(extra_text);
04105 }
04106
04107
04108
04110 template<typename eT>
04111 inline
04112 void
04113 Mat<eT>::impl_print_trans(std::ostream& user_stream, const std::string& extra_text) const
04114 {
04115 arma_extra_debug_sigprint();
04116
04117 Mat<eT> tmp;
04118 op_strans::apply_noalias(tmp, *this);
04119
04120 tmp.impl_print(user_stream, extra_text);
04121 }
04122
04123
04124
04129 template<typename eT>
04130 inline
04131 void
04132 Mat<eT>::impl_raw_print(const std::string& extra_text) const
04133 {
04134 arma_extra_debug_sigprint();
04135
04136 if(extra_text.length() != 0)
04137 {
04138 const std::streamsize orig_width = cout.width();
04139
04140 cout << extra_text << '\n';
04141
04142 cout.width(orig_width);
04143 }
04144
04145 arma_ostream::print(cout, *this, false);
04146 }
04147
04148
04149
04154 template<typename eT>
04155 inline
04156 void
04157 Mat<eT>::impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const
04158 {
04159 arma_extra_debug_sigprint();
04160
04161 if(extra_text.length() != 0)
04162 {
04163 const std::streamsize orig_width = user_stream.width();
04164
04165 user_stream << extra_text << '\n';
04166
04167 user_stream.width(orig_width);
04168 }
04169
04170 arma_ostream::print(user_stream, *this, false);
04171 }
04172
04173
04174
04176 template<typename eT>
04177 inline
04178 void
04179 Mat<eT>::impl_raw_print_trans(const std::string& extra_text) const
04180 {
04181 arma_extra_debug_sigprint();
04182
04183 Mat<eT> tmp;
04184 op_strans::apply_noalias(tmp, *this);
04185
04186 tmp.impl_raw_print(extra_text);
04187 }
04188
04189
04190
04192 template<typename eT>
04193 inline
04194 void
04195 Mat<eT>::impl_raw_print_trans(std::ostream& user_stream, const std::string& extra_text) const
04196 {
04197 arma_extra_debug_sigprint();
04198
04199 Mat<eT> tmp;
04200 op_strans::apply_noalias(tmp, *this);
04201
04202 tmp.impl_raw_print(user_stream, extra_text);
04203 }
04204
04205
04206
04208 template<typename eT>
04209 inline
04210 void
04211 Mat<eT>::set_size(const uword in_elem)
04212 {
04213 arma_extra_debug_sigprint();
04214
04215 switch(vec_state)
04216 {
04217 case 0:
04218 case 1:
04219 init_warm(in_elem, 1);
04220 break;
04221
04222 case 2:
04223 init_warm(1, in_elem);
04224 break;
04225
04226 default:
04227 ;
04228 }
04229 }
04230
04231
04232
04234 template<typename eT>
04235 inline
04236 void
04237 Mat<eT>::set_size(const uword in_rows, const uword in_cols)
04238 {
04239 arma_extra_debug_sigprint();
04240
04241 init_warm(in_rows, in_cols);
04242 }
04243
04244
04245
04247 template<typename eT>
04248 inline
04249 void
04250 Mat<eT>::resize(const uword in_elem)
04251 {
04252 arma_extra_debug_sigprint();
04253
04254 switch(vec_state)
04255 {
04256 case 0:
04257 case 1:
04258 (*this).resize(in_elem, 1);
04259 break;
04260
04261 case 2:
04262 (*this).resize(1, in_elem);
04263 break;
04264
04265 default:
04266 ;
04267 }
04268 }
04269
04270
04271
04273 template<typename eT>
04274 inline
04275 void
04276 Mat<eT>::resize(const uword in_rows, const uword in_cols)
04277 {
04278 arma_extra_debug_sigprint();
04279
04280 *this = arma::resize(*this, in_rows, in_cols);
04281 }
04282
04283
04284
04286 template<typename eT>
04287 inline
04288 void
04289 Mat<eT>::reshape(const uword in_rows, const uword in_cols, const uword dim)
04290 {
04291 arma_extra_debug_sigprint();
04292
04293 *this = arma::reshape(*this, in_rows, in_cols, dim);
04294 }
04295
04296
04297
04299 template<typename eT>
04300 template<typename eT2>
04301 inline
04302 void
04303 Mat<eT>::copy_size(const Mat<eT2>& m)
04304 {
04305 arma_extra_debug_sigprint();
04306
04307 init_warm(m.n_rows, m.n_cols);
04308 }
04309
04310
04311
04313 template<typename eT>
04314 arma_hot
04315 inline
04316 const Mat<eT>&
04317 Mat<eT>::fill(const eT val)
04318 {
04319 arma_extra_debug_sigprint();
04320
04321 arrayops::inplace_set( memptr(), val, n_elem );
04322
04323 return *this;
04324 }
04325
04326
04327
04328 template<typename eT>
04329 inline
04330 const Mat<eT>&
04331 Mat<eT>::zeros()
04332 {
04333 arma_extra_debug_sigprint();
04334
04335 return fill(eT(0));
04336 }
04337
04338
04339
04340 template<typename eT>
04341 inline
04342 const Mat<eT>&
04343 Mat<eT>::zeros(const uword in_elem)
04344 {
04345 arma_extra_debug_sigprint();
04346
04347 set_size(in_elem);
04348
04349 return fill(eT(0));
04350 }
04351
04352
04353
04354 template<typename eT>
04355 inline
04356 const Mat<eT>&
04357 Mat<eT>::zeros(const uword in_rows, const uword in_cols)
04358 {
04359 arma_extra_debug_sigprint();
04360
04361 set_size(in_rows, in_cols);
04362
04363 return fill(eT(0));
04364 }
04365
04366
04367
04368 template<typename eT>
04369 inline
04370 const Mat<eT>&
04371 Mat<eT>::ones()
04372 {
04373 arma_extra_debug_sigprint();
04374
04375 return fill(eT(1));
04376 }
04377
04378
04379
04380 template<typename eT>
04381 inline
04382 const Mat<eT>&
04383 Mat<eT>::ones(const uword in_elem)
04384 {
04385 arma_extra_debug_sigprint();
04386
04387 set_size(in_elem);
04388
04389 return fill(eT(1));
04390 }
04391
04392
04393
04394 template<typename eT>
04395 inline
04396 const Mat<eT>&
04397 Mat<eT>::ones(const uword in_rows, const uword in_cols)
04398 {
04399 arma_extra_debug_sigprint();
04400
04401 set_size(in_rows, in_cols);
04402
04403 return fill(eT(1));
04404 }
04405
04406
04407
04408 template<typename eT>
04409 inline
04410 const Mat<eT>&
04411 Mat<eT>::randu()
04412 {
04413 arma_extra_debug_sigprint();
04414
04415 const uword N = n_elem;
04416 eT* ptr = memptr();
04417
04418 uword i,j;
04419
04420 for(i=0, j=1; j<N; i+=2, j+=2)
04421 {
04422 const eT tmp_i = eT(eop_aux_randu<eT>());
04423 const eT tmp_j = eT(eop_aux_randu<eT>());
04424
04425 ptr[i] = tmp_i;
04426 ptr[j] = tmp_j;
04427 }
04428
04429 if(i < N)
04430 {
04431 ptr[i] = eT(eop_aux_randu<eT>());
04432 }
04433
04434 return *this;
04435 }
04436
04437
04438
04439 template<typename eT>
04440 inline
04441 const Mat<eT>&
04442 Mat<eT>::randu(const uword in_elem)
04443 {
04444 arma_extra_debug_sigprint();
04445
04446 set_size(in_elem);
04447
04448 return (*this).randu();
04449 }
04450
04451
04452
04453 template<typename eT>
04454 inline
04455 const Mat<eT>&
04456 Mat<eT>::randu(const uword in_rows, const uword in_cols)
04457 {
04458 arma_extra_debug_sigprint();
04459
04460 set_size(in_rows, in_cols);
04461
04462 return (*this).randu();
04463 }
04464
04465
04466
04467 template<typename eT>
04468 inline
04469 const Mat<eT>&
04470 Mat<eT>::randn()
04471 {
04472 arma_extra_debug_sigprint();
04473
04474 const uword N = n_elem;
04475 eT* ptr = memptr();
04476
04477 for(uword i=0; i<N; ++i)
04478 {
04479 ptr[i] = eT(eop_aux_randn<eT>());
04480 }
04481
04482 return *this;
04483 }
04484
04485
04486
04487 template<typename eT>
04488 inline
04489 const Mat<eT>&
04490 Mat<eT>::randn(const uword in_elem)
04491 {
04492 arma_extra_debug_sigprint();
04493
04494 set_size(in_elem);
04495
04496 return (*this).randn();
04497 }
04498
04499
04500
04501 template<typename eT>
04502 inline
04503 const Mat<eT>&
04504 Mat<eT>::randn(const uword in_rows, const uword in_cols)
04505 {
04506 arma_extra_debug_sigprint();
04507
04508 set_size(in_rows, in_cols);
04509
04510 return (*this).randn();
04511 }
04512
04513
04514
04515 template<typename eT>
04516 inline
04517 const Mat<eT>&
04518 Mat<eT>::eye()
04519 {
04520 arma_extra_debug_sigprint();
04521
04522 fill(eT(0));
04523
04524 const uword N = (std::min)(n_rows, n_cols);
04525
04526 for(uword i=0; i<N; ++i)
04527 {
04528 at(i,i) = eT(1);
04529 }
04530
04531 return *this;
04532 }
04533
04534
04535
04536 template<typename eT>
04537 inline
04538 const Mat<eT>&
04539 Mat<eT>::eye(const uword in_rows, const uword in_cols)
04540 {
04541 arma_extra_debug_sigprint();
04542
04543 set_size(in_rows, in_cols);
04544
04545 return (*this).eye();
04546 }
04547
04548
04549
04550 template<typename eT>
04551 inline
04552 void
04553 Mat<eT>::reset()
04554 {
04555 arma_extra_debug_sigprint();
04556
04557 switch(vec_state)
04558 {
04559 default:
04560 init_warm(0, 0);
04561 break;
04562
04563 case 1:
04564 init_warm(0, 1);
04565 break;
04566
04567 case 2:
04568 init_warm(1, 0);
04569 break;
04570 }
04571 }
04572
04573
04574
04575 template<typename eT>
04576 template<typename T1>
04577 inline
04578 void
04579 Mat<eT>::set_real(const Base<typename Mat<eT>::pod_type,T1>& X)
04580 {
04581 arma_extra_debug_sigprint();
04582
04583 Mat_aux::set_real(*this, X);
04584 }
04585
04586
04587
04588 template<typename eT>
04589 template<typename T1>
04590 inline
04591 void
04592 Mat<eT>::set_imag(const Base<typename Mat<eT>::pod_type,T1>& X)
04593 {
04594 arma_extra_debug_sigprint();
04595
04596 Mat_aux::set_imag(*this, X);
04597 }
04598
04599
04600
04601 template<typename eT>
04602 inline
04603 arma_warn_unused
04604 eT
04605 Mat<eT>::min() const
04606 {
04607 arma_extra_debug_sigprint();
04608
04609 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
04610
04611 return op_min::direct_min(memptr(), n_elem);
04612 }
04613
04614
04615
04616 template<typename eT>
04617 inline
04618 arma_warn_unused
04619 eT
04620 Mat<eT>::max() const
04621 {
04622 arma_extra_debug_sigprint();
04623
04624 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
04625
04626 return op_max::direct_max(memptr(), n_elem);
04627 }
04628
04629
04630
04631 template<typename eT>
04632 inline
04633 eT
04634 Mat<eT>::min(uword& index_of_min_val) const
04635 {
04636 arma_extra_debug_sigprint();
04637
04638 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
04639
04640 return op_min::direct_min(memptr(), n_elem, index_of_min_val);
04641 }
04642
04643
04644
04645 template<typename eT>
04646 inline
04647 eT
04648 Mat<eT>::max(uword& index_of_max_val) const
04649 {
04650 arma_extra_debug_sigprint();
04651
04652 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
04653
04654 return op_max::direct_max(memptr(), n_elem, index_of_max_val);
04655 }
04656
04657
04658
04659 template<typename eT>
04660 inline
04661 eT
04662 Mat<eT>::min(uword& row_of_min_val, uword& col_of_min_val) const
04663 {
04664 arma_extra_debug_sigprint();
04665
04666 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
04667
04668 uword i;
04669
04670 eT val = op_min::direct_min(memptr(), n_elem, i);
04671
04672 row_of_min_val = i % n_rows;
04673 col_of_min_val = i / n_rows;
04674
04675 return val;
04676 }
04677
04678
04679
04680 template<typename eT>
04681 inline
04682 eT
04683 Mat<eT>::max(uword& row_of_max_val, uword& col_of_max_val) const
04684 {
04685 arma_extra_debug_sigprint();
04686
04687 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
04688
04689 uword i;
04690
04691 eT val = op_max::direct_max(memptr(), n_elem, i);
04692
04693 row_of_max_val = i % n_rows;
04694 col_of_max_val = i / n_rows;
04695
04696 return val;
04697 }
04698
04699
04700
04702 template<typename eT>
04703 inline
04704 bool
04705 Mat<eT>::save(const std::string name, const file_type type, const bool print_status) const
04706 {
04707 arma_extra_debug_sigprint();
04708
04709 bool save_okay;
04710
04711 switch(type)
04712 {
04713 case raw_ascii:
04714 save_okay = diskio::save_raw_ascii(*this, name);
04715 break;
04716
04717 case arma_ascii:
04718 save_okay = diskio::save_arma_ascii(*this, name);
04719 break;
04720
04721 case csv_ascii:
04722 save_okay = diskio::save_csv_ascii(*this, name);
04723 break;
04724
04725 case raw_binary:
04726 save_okay = diskio::save_raw_binary(*this, name);
04727 break;
04728
04729 case arma_binary:
04730 save_okay = diskio::save_arma_binary(*this, name);
04731 break;
04732
04733 case pgm_binary:
04734 save_okay = diskio::save_pgm_binary(*this, name);
04735 break;
04736
04737 default:
04738 arma_warn(print_status, "Mat::save(): unsupported file type");
04739 save_okay = false;
04740 }
04741
04742 arma_warn( (print_status && (save_okay == false)), "Mat::save(): couldn't write to ", name);
04743
04744 return save_okay;
04745 }
04746
04747
04748
04750 template<typename eT>
04751 inline
04752 bool
04753 Mat<eT>::save(std::ostream& os, const file_type type, const bool print_status) const
04754 {
04755 arma_extra_debug_sigprint();
04756
04757 bool save_okay;
04758
04759 switch(type)
04760 {
04761 case raw_ascii:
04762 save_okay = diskio::save_raw_ascii(*this, os);
04763 break;
04764
04765 case arma_ascii:
04766 save_okay = diskio::save_arma_ascii(*this, os);
04767 break;
04768
04769 case csv_ascii:
04770 save_okay = diskio::save_csv_ascii(*this, os);
04771 break;
04772
04773 case raw_binary:
04774 save_okay = diskio::save_raw_binary(*this, os);
04775 break;
04776
04777 case arma_binary:
04778 save_okay = diskio::save_arma_binary(*this, os);
04779 break;
04780
04781 case pgm_binary:
04782 save_okay = diskio::save_pgm_binary(*this, os);
04783 break;
04784
04785 default:
04786 arma_warn(print_status, "Mat::save(): unsupported file type");
04787 save_okay = false;
04788 }
04789
04790 arma_warn( (print_status && (save_okay == false)), "Mat::save(): couldn't write to the given stream");
04791
04792 return save_okay;
04793 }
04794
04795
04796
04798 template<typename eT>
04799 inline
04800 bool
04801 Mat<eT>::load(const std::string name, const file_type type, const bool print_status)
04802 {
04803 arma_extra_debug_sigprint();
04804
04805 bool load_okay;
04806 std::string err_msg;
04807
04808 switch(type)
04809 {
04810 case auto_detect:
04811 load_okay = diskio::load_auto_detect(*this, name, err_msg);
04812 break;
04813
04814 case raw_ascii:
04815 load_okay = diskio::load_raw_ascii(*this, name, err_msg);
04816 break;
04817
04818 case arma_ascii:
04819 load_okay = diskio::load_arma_ascii(*this, name, err_msg);
04820 break;
04821
04822 case csv_ascii:
04823 load_okay = diskio::load_csv_ascii(*this, name, err_msg);
04824 break;
04825
04826 case raw_binary:
04827 load_okay = diskio::load_raw_binary(*this, name, err_msg);
04828 break;
04829
04830 case arma_binary:
04831 load_okay = diskio::load_arma_binary(*this, name, err_msg);
04832 break;
04833
04834 case pgm_binary:
04835 load_okay = diskio::load_pgm_binary(*this, name, err_msg);
04836 break;
04837
04838 default:
04839 arma_warn(print_status, "Mat::load(): unsupported file type");
04840 load_okay = false;
04841 }
04842
04843 if( (print_status == true) && (load_okay == false) )
04844 {
04845 if(err_msg.length() > 0)
04846 {
04847 arma_warn(true, "Mat::load(): ", err_msg, name);
04848 }
04849 else
04850 {
04851 arma_warn(true, "Mat::load(): couldn't read ", name);
04852 }
04853 }
04854
04855 if(load_okay == false)
04856 {
04857 (*this).reset();
04858 }
04859
04860 return load_okay;
04861 }
04862
04863
04864
04866 template<typename eT>
04867 inline
04868 bool
04869 Mat<eT>::load(std::istream& is, const file_type type, const bool print_status)
04870 {
04871 arma_extra_debug_sigprint();
04872
04873 bool load_okay;
04874 std::string err_msg;
04875
04876 switch(type)
04877 {
04878 case auto_detect:
04879 load_okay = diskio::load_auto_detect(*this, is, err_msg);
04880 break;
04881
04882 case raw_ascii:
04883 load_okay = diskio::load_raw_ascii(*this, is, err_msg);
04884 break;
04885
04886 case arma_ascii:
04887 load_okay = diskio::load_arma_ascii(*this, is, err_msg);
04888 break;
04889
04890 case csv_ascii:
04891 load_okay = diskio::load_csv_ascii(*this, is, err_msg);
04892 break;
04893
04894 case raw_binary:
04895 load_okay = diskio::load_raw_binary(*this, is, err_msg);
04896 break;
04897
04898 case arma_binary:
04899 load_okay = diskio::load_arma_binary(*this, is, err_msg);
04900 break;
04901
04902 case pgm_binary:
04903 load_okay = diskio::load_pgm_binary(*this, is, err_msg);
04904 break;
04905
04906 default:
04907 arma_warn(print_status, "Mat::load(): unsupported file type");
04908 load_okay = false;
04909 }
04910
04911
04912 if( (print_status == true) && (load_okay == false) )
04913 {
04914 if(err_msg.length() > 0)
04915 {
04916 arma_warn(true, "Mat::load(): ", err_msg, "the given stream");
04917 }
04918 else
04919 {
04920 arma_warn(true, "Mat::load(): couldn't load from the given stream");
04921 }
04922 }
04923
04924 if(load_okay == false)
04925 {
04926 (*this).reset();
04927 }
04928
04929 return load_okay;
04930 }
04931
04932
04933
04935 template<typename eT>
04936 inline
04937 bool
04938 Mat<eT>::quiet_save(const std::string name, const file_type type) const
04939 {
04940 arma_extra_debug_sigprint();
04941
04942 return (*this).save(name, type, false);
04943 }
04944
04945
04946
04948 template<typename eT>
04949 inline
04950 bool
04951 Mat<eT>::quiet_save(std::ostream& os, const file_type type) const
04952 {
04953 arma_extra_debug_sigprint();
04954
04955 return (*this).save(os, type, false);
04956 }
04957
04958
04959
04961 template<typename eT>
04962 inline
04963 bool
04964 Mat<eT>::quiet_load(const std::string name, const file_type type)
04965 {
04966 arma_extra_debug_sigprint();
04967
04968 return (*this).load(name, type, false);
04969 }
04970
04971
04972
04974 template<typename eT>
04975 inline
04976 bool
04977 Mat<eT>::quiet_load(std::istream& is, const file_type type)
04978 {
04979 arma_extra_debug_sigprint();
04980
04981 return (*this).load(is, type, false);
04982 }
04983
04984
04985
04986 template<typename eT>
04987 inline
04988 Mat<eT>::row_iterator::row_iterator(Mat<eT>& in_M, const uword in_row)
04989 : M (in_M )
04990 , row(in_row)
04991 , col(0 )
04992 {
04993 arma_extra_debug_sigprint();
04994 }
04995
04996
04997
04998 template<typename eT>
04999 inline
05000 eT&
05001 Mat<eT>::row_iterator::operator*()
05002 {
05003 return M.at(row,col);
05004 }
05005
05006
05007
05008 template<typename eT>
05009 inline
05010 typename Mat<eT>::row_iterator&
05011 Mat<eT>::row_iterator::operator++()
05012 {
05013 ++col;
05014
05015 if(col >= M.n_cols)
05016 {
05017 col = 0;
05018 ++row;
05019 }
05020
05021 return *this;
05022 }
05023
05024
05025
05026 template<typename eT>
05027 inline
05028 void
05029 Mat<eT>::row_iterator::operator++(int)
05030 {
05031 operator++();
05032 }
05033
05034
05035
05036 template<typename eT>
05037 inline
05038 typename Mat<eT>::row_iterator&
05039 Mat<eT>::row_iterator::operator--()
05040 {
05041 if(col > 0)
05042 {
05043 --col;
05044 }
05045 else
05046 {
05047 if(row > 0)
05048 {
05049 col = M.n_cols - 1;
05050 --row;
05051 }
05052 }
05053
05054 return *this;
05055 }
05056
05057
05058
05059 template<typename eT>
05060 inline
05061 void
05062 Mat<eT>::row_iterator::operator--(int)
05063 {
05064 operator--();
05065 }
05066
05067
05068
05069 template<typename eT>
05070 inline
05071 bool
05072 Mat<eT>::row_iterator::operator!=(const typename Mat<eT>::row_iterator& X) const
05073 {
05074 return ( (row != X.row) || (col != X.col) ) ? true : false;
05075 }
05076
05077
05078
05079 template<typename eT>
05080 inline
05081 bool
05082 Mat<eT>::row_iterator::operator==(const typename Mat<eT>::row_iterator& X) const
05083 {
05084 return ( (row == X.row) && (col == X.col) ) ? true : false;
05085 }
05086
05087
05088
05089 template<typename eT>
05090 inline
05091 Mat<eT>::const_row_iterator::const_row_iterator(const Mat<eT>& in_M, const uword in_row)
05092 : M (in_M )
05093 , row(in_row)
05094 , col(0 )
05095 {
05096 arma_extra_debug_sigprint();
05097 }
05098
05099
05100
05101 template<typename eT>
05102 inline
05103 Mat<eT>::const_row_iterator::const_row_iterator(const typename Mat<eT>::row_iterator& X)
05104 : M (X.M)
05105 , row(X.row)
05106 , col(X.col)
05107 {
05108 arma_extra_debug_sigprint();
05109 }
05110
05111
05112
05113 template<typename eT>
05114 inline
05115 eT
05116 Mat<eT>::const_row_iterator::operator*() const
05117 {
05118 return M.at(row,col);
05119 }
05120
05121
05122
05123 template<typename eT>
05124 inline
05125 typename Mat<eT>::const_row_iterator&
05126 Mat<eT>::const_row_iterator::operator++()
05127 {
05128 ++col;
05129
05130 if(col >= M.n_cols)
05131 {
05132 col = 0;
05133 ++row;
05134 }
05135
05136 return *this;
05137 }
05138
05139
05140
05141 template<typename eT>
05142 inline
05143 void
05144 Mat<eT>::const_row_iterator::operator++(int)
05145 {
05146 operator++();
05147 }
05148
05149
05150
05151 template<typename eT>
05152 inline
05153 typename Mat<eT>::const_row_iterator&
05154 Mat<eT>::const_row_iterator::operator--()
05155 {
05156 if(col > 0)
05157 {
05158 --col;
05159 }
05160 else
05161 {
05162 if(row > 0)
05163 {
05164 col = M.n_cols - 1;
05165 --row;
05166 }
05167 }
05168
05169 return *this;
05170 }
05171
05172
05173
05174 template<typename eT>
05175 inline
05176 void
05177 Mat<eT>::const_row_iterator::operator--(int)
05178 {
05179 operator--();
05180 }
05181
05182
05183
05184 template<typename eT>
05185 inline
05186 bool
05187 Mat<eT>::const_row_iterator::operator!=(const typename Mat<eT>::const_row_iterator& X) const
05188 {
05189 return ( (row != X.row) || (col != X.col) ) ? true : false;
05190 }
05191
05192
05193
05194 template<typename eT>
05195 inline
05196 bool
05197 Mat<eT>::const_row_iterator::operator==(const typename Mat<eT>::const_row_iterator& X) const
05198 {
05199 return ( (row == X.row) && (col == X.col) ) ? true : false;
05200 }
05201
05202
05203
05204 template<typename eT>
05205 inline
05206 typename Mat<eT>::iterator
05207 Mat<eT>::begin()
05208 {
05209 arma_extra_debug_sigprint();
05210
05211 return memptr();
05212 }
05213
05214
05215
05216 template<typename eT>
05217 inline
05218 typename Mat<eT>::const_iterator
05219 Mat<eT>::begin() const
05220 {
05221 arma_extra_debug_sigprint();
05222
05223 return memptr();
05224 }
05225
05226
05227
05228 template<typename eT>
05229 inline
05230 typename Mat<eT>::iterator
05231 Mat<eT>::end()
05232 {
05233 arma_extra_debug_sigprint();
05234
05235 return memptr() + n_elem;
05236 }
05237
05238
05239
05240 template<typename eT>
05241 inline
05242 typename Mat<eT>::const_iterator
05243 Mat<eT>::end() const
05244 {
05245 arma_extra_debug_sigprint();
05246
05247 return memptr() + n_elem;
05248 }
05249
05250
05251
05252 template<typename eT>
05253 inline
05254 typename Mat<eT>::col_iterator
05255 Mat<eT>::begin_col(const uword col_num)
05256 {
05257 arma_extra_debug_sigprint();
05258
05259 arma_debug_check( (col_num >= n_cols), "begin_col(): index out of bounds");
05260
05261 return colptr(col_num);
05262 }
05263
05264
05265
05266 template<typename eT>
05267 inline
05268 typename Mat<eT>::const_col_iterator
05269 Mat<eT>::begin_col(const uword col_num) const
05270 {
05271 arma_extra_debug_sigprint();
05272
05273 arma_debug_check( (col_num >= n_cols), "begin_col(): index out of bounds");
05274
05275 return colptr(col_num);
05276 }
05277
05278
05279
05280 template<typename eT>
05281 inline
05282 typename Mat<eT>::col_iterator
05283 Mat<eT>::end_col(const uword col_num)
05284 {
05285 arma_extra_debug_sigprint();
05286
05287 arma_debug_check( (col_num >= n_cols), "end_col(): index out of bounds");
05288
05289 return colptr(col_num) + n_rows;
05290 }
05291
05292
05293
05294 template<typename eT>
05295 inline
05296 typename Mat<eT>::const_col_iterator
05297 Mat<eT>::end_col(const uword col_num) const
05298 {
05299 arma_extra_debug_sigprint();
05300
05301 arma_debug_check( (col_num >= n_cols), "end_col(): index out of bounds");
05302
05303 return colptr(col_num) + n_rows;
05304 }
05305
05306
05307
05308 template<typename eT>
05309 inline
05310 typename Mat<eT>::row_iterator
05311 Mat<eT>::begin_row(const uword row_num)
05312 {
05313 arma_extra_debug_sigprint();
05314
05315 arma_debug_check( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" );
05316
05317 return typename Mat<eT>::row_iterator(*this, row_num);
05318 }
05319
05320
05321
05322 template<typename eT>
05323 inline
05324 typename Mat<eT>::const_row_iterator
05325 Mat<eT>::begin_row(const uword row_num) const
05326 {
05327 arma_extra_debug_sigprint();
05328
05329 arma_debug_check( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" );
05330
05331 return typename Mat<eT>::const_row_iterator(*this, row_num);
05332 }
05333
05334
05335
05336 template<typename eT>
05337 inline
05338 typename Mat<eT>::row_iterator
05339 Mat<eT>::end_row(const uword row_num)
05340 {
05341 arma_extra_debug_sigprint();
05342
05343 arma_debug_check( (row_num >= n_rows), "Mat::end_row(): index out of bounds" );
05344
05345 return typename Mat<eT>::row_iterator(*this, row_num + 1);
05346 }
05347
05348
05349
05350 template<typename eT>
05351 inline
05352 typename Mat<eT>::const_row_iterator
05353 Mat<eT>::end_row(const uword row_num) const
05354 {
05355 arma_extra_debug_sigprint();
05356
05357 arma_debug_check( (row_num >= n_rows), "Mat::end_row(): index out of bounds" );
05358
05359 return typename Mat<eT>::const_row_iterator(*this, row_num + 1);
05360 }
05361
05362
05363
05365 template<typename eT>
05366 inline
05367 void
05368 Mat<eT>::clear()
05369 {
05370 reset();
05371 }
05372
05373
05374
05376 template<typename eT>
05377 inline
05378 bool
05379 Mat<eT>::empty() const
05380 {
05381 return (n_elem == 0);
05382 }
05383
05384
05385
05387 template<typename eT>
05388 inline
05389 uword
05390 Mat<eT>::size() const
05391 {
05392 return n_elem;
05393 }
05394
05395
05396
05397 template<typename eT>
05398 template<uword fixed_n_rows, uword fixed_n_cols>
05399 arma_inline
05400 void
05401 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::mem_setup()
05402 {
05403 arma_extra_debug_sigprint();
05404
05405 access::rw(Mat<eT>::n_rows) = fixed_n_rows;
05406 access::rw(Mat<eT>::n_cols) = fixed_n_cols;
05407 access::rw(Mat<eT>::n_elem) = fixed_n_elem;
05408 access::rw(Mat<eT>::vec_state) = 0;
05409 access::rw(Mat<eT>::mem_state) = 3;
05410 access::rw(Mat<eT>::mem) = (use_extra) ? mem_local_extra : mem_local;
05411 }
05412
05413
05414
05415 template<typename eT>
05416 template<uword fixed_n_rows, uword fixed_n_cols>
05417 arma_inline
05418 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed()
05419 {
05420 arma_extra_debug_sigprint_this(this);
05421
05422 mem_setup();
05423 }
05424
05425
05426
05427 template<typename eT>
05428 template<uword fixed_n_rows, uword fixed_n_cols>
05429 arma_inline
05430 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const fixed<fixed_n_rows, fixed_n_cols>& X)
05431 {
05432 arma_extra_debug_sigprint_this(this);
05433
05434 mem_setup();
05435
05436 eT* dest = (use_extra) ? mem_local_extra : mem_local;
05437
05438 arrayops::copy( dest, X.mem, fixed_n_elem );
05439 }
05440
05441
05442
05443 template<typename eT>
05444 template<uword fixed_n_rows, uword fixed_n_cols>
05445 template<typename T1>
05446 inline
05447 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<eT,T1>& A)
05448 {
05449 arma_extra_debug_sigprint_this(this);
05450
05451 mem_setup();
05452
05453 Mat<eT>::operator=(A.get_ref());
05454 }
05455
05456
05457
05458 template<typename eT>
05459 template<uword fixed_n_rows, uword fixed_n_cols>
05460 template<typename T1, typename T2>
05461 inline
05462 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)
05463 {
05464 arma_extra_debug_sigprint_this(this);
05465
05466 mem_setup();
05467
05468 Mat<eT>::init(A,B);
05469 }
05470
05471
05472
05473 template<typename eT>
05474 template<uword fixed_n_rows, uword fixed_n_cols>
05475 inline
05476 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(eT* aux_mem, const bool copy_aux_mem)
05477 {
05478 arma_extra_debug_sigprint_this(this);
05479
05480 access::rw(Mat<eT>::n_rows) = fixed_n_rows;
05481 access::rw(Mat<eT>::n_cols) = fixed_n_cols;
05482 access::rw(Mat<eT>::n_elem) = fixed_n_elem;
05483 access::rw(Mat<eT>::vec_state) = 0;
05484 access::rw(Mat<eT>::mem_state) = 3;
05485
05486 if(copy_aux_mem == true)
05487 {
05488 eT* dest = (use_extra) ? mem_local_extra : mem_local;
05489
05490 access::rw(Mat<eT>::mem) = dest;
05491
05492 arrayops::copy( dest, aux_mem, fixed_n_elem );
05493 }
05494 else
05495 {
05496 access::rw(Mat<eT>::mem) = aux_mem;
05497 }
05498 }
05499
05500
05501
05502 template<typename eT>
05503 template<uword fixed_n_rows, uword fixed_n_cols>
05504 inline
05505 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const eT* aux_mem)
05506 {
05507 arma_extra_debug_sigprint_this(this);
05508
05509 mem_setup();
05510
05511 arrayops::copy( const_cast<eT*>(Mat<eT>::mem), aux_mem, fixed_n_elem );
05512 }
05513
05514
05515
05516 template<typename eT>
05517 template<uword fixed_n_rows, uword fixed_n_cols>
05518 inline
05519 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const char* text)
05520 {
05521 arma_extra_debug_sigprint_this(this);
05522
05523 mem_setup();
05524
05525 Mat<eT>::operator=(text);
05526 }
05527
05528
05529
05530 template<typename eT>
05531 template<uword fixed_n_rows, uword fixed_n_cols>
05532 inline
05533 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::string& text)
05534 {
05535 arma_extra_debug_sigprint_this(this);
05536
05537 mem_setup();
05538
05539 Mat<eT>::operator=(text);
05540 }
05541
05542
05543
05544 template<typename eT>
05545 template<uword fixed_n_rows, uword fixed_n_cols>
05546 template<typename T1>
05547 inline
05548 const Mat<eT>&
05549 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const Base<eT,T1>& A)
05550 {
05551 Mat<eT>::operator=(A.get_ref());
05552
05553 return *this;
05554 }
05555
05556
05557
05558 template<typename eT>
05559 template<uword fixed_n_rows, uword fixed_n_cols>
05560 inline
05561 const Mat<eT>&
05562 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const eT val)
05563 {
05564 arma_extra_debug_sigprint();
05565
05566 Mat<eT>::operator=(val);
05567
05568 return *this;
05569 }
05570
05571
05572
05573 template<typename eT>
05574 template<uword fixed_n_rows, uword fixed_n_cols>
05575 inline
05576 const Mat<eT>&
05577 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const char* text)
05578 {
05579 arma_extra_debug_sigprint();
05580
05581 Mat<eT>::operator=(text);
05582
05583 return *this;
05584 }
05585
05586
05587
05588 template<typename eT>
05589 template<uword fixed_n_rows, uword fixed_n_cols>
05590 inline
05591 const Mat<eT>&
05592 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const std::string& text)
05593 {
05594 arma_extra_debug_sigprint();
05595
05596 Mat<eT>::operator=(text);
05597
05598 return *this;
05599 }
05600
05601
05602
05603 template<typename eT>
05604 template<uword fixed_n_rows, uword fixed_n_cols>
05605 inline
05606 subview_row<eT>
05607 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator()(const uword row_num, const span& col_span)
05608 {
05609 arma_extra_debug_sigprint();
05610
05611 return Mat<eT>::operator()(row_num, col_span);
05612 }
05613
05614
05615
05616 template<typename eT>
05617 template<uword fixed_n_rows, uword fixed_n_cols>
05618 inline
05619 const subview_row<eT>
05620 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator()(const uword row_num, const span& col_span) const
05621 {
05622 arma_extra_debug_sigprint();
05623
05624 return Mat<eT>::operator()(row_num, col_span);
05625 }
05626
05627
05628
05629 template<typename eT>
05630 template<uword fixed_n_rows, uword fixed_n_cols>
05631 inline
05632 subview_col<eT>
05633 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator()(const span& row_span, const uword col_num)
05634 {
05635 arma_extra_debug_sigprint();
05636
05637 return Mat<eT>::operator()(row_span, col_num);
05638 }
05639
05640
05641
05642 template<typename eT>
05643 template<uword fixed_n_rows, uword fixed_n_cols>
05644 inline
05645 const subview_col<eT>
05646 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator()(const span& row_span, const uword col_num) const
05647 {
05648 arma_extra_debug_sigprint();
05649
05650 return Mat<eT>::operator()(row_span, col_num);
05651 }
05652
05653
05654
05655 template<typename eT>
05656 template<uword fixed_n_rows, uword fixed_n_cols>
05657 inline
05658 subview<eT>
05659 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator()(const span& row_span, const span& col_span)
05660 {
05661 arma_extra_debug_sigprint();
05662
05663 return Mat<eT>::operator()(row_span, col_span);
05664 }
05665
05666
05667
05668 template<typename eT>
05669 template<uword fixed_n_rows, uword fixed_n_cols>
05670 inline
05671 const subview<eT>
05672 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator()(const span& row_span, const span& col_span) const
05673 {
05674 arma_extra_debug_sigprint();
05675
05676 return Mat<eT>::operator()(row_span, col_span);
05677 }
05678
05679
05680
05681 template<typename eT>
05682 template<uword fixed_n_rows, uword fixed_n_cols>
05683 arma_inline
05684 arma_warn_unused
05685 eT&
05686 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword i)
05687 {
05688 return access::rw( Mat<eT>::mem[i] );
05689 }
05690
05691
05692
05693 template<typename eT>
05694 template<uword fixed_n_rows, uword fixed_n_cols>
05695 arma_inline
05696 arma_warn_unused
05697 eT
05698 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword i) const
05699 {
05700 return ( Mat<eT>::mem[i] );
05701 }
05702
05703
05704
05705 template<typename eT>
05706 template<uword fixed_n_rows, uword fixed_n_cols>
05707 arma_inline
05708 arma_warn_unused
05709 eT&
05710 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword i)
05711 {
05712 return access::rw( Mat<eT>::mem[i] );
05713 }
05714
05715
05716
05717 template<typename eT>
05718 template<uword fixed_n_rows, uword fixed_n_cols>
05719 arma_inline
05720 arma_warn_unused
05721 eT
05722 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword i) const
05723 {
05724 return ( Mat<eT>::mem[i] );
05725 }
05726
05727
05728
05729 template<typename eT>
05730 template<uword fixed_n_rows, uword fixed_n_cols>
05731 arma_inline
05732 arma_warn_unused
05733 eT&
05734 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword i)
05735 {
05736 arma_debug_check( (i >= fixed_n_elem), "Mat::fixed::operator(): out of bounds");
05737
05738 return access::rw( Mat<eT>::mem[i] );
05739 }
05740
05741
05742
05743 template<typename eT>
05744 template<uword fixed_n_rows, uword fixed_n_cols>
05745 arma_inline
05746 arma_warn_unused
05747 eT
05748 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword i) const
05749 {
05750 arma_debug_check( (i >= fixed_n_elem), "Mat::fixed::operator(): out of bounds");
05751
05752 return ( Mat<eT>::mem[i] );
05753 }
05754
05755
05756
05757 template<typename eT>
05758 template<uword fixed_n_rows, uword fixed_n_cols>
05759 arma_inline
05760 arma_warn_unused
05761 eT&
05762 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col)
05763 {
05764 const uword i = in_row + in_col*fixed_n_rows;
05765
05766 return access::rw( Mat<eT>::mem[i] );
05767 }
05768
05769
05770
05771 template<typename eT>
05772 template<uword fixed_n_rows, uword fixed_n_cols>
05773 arma_inline
05774 arma_warn_unused
05775 eT
05776 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col) const
05777 {
05778 const uword i = in_row + in_col*fixed_n_rows;
05779
05780 return ( Mat<eT>::mem[i] );
05781 }
05782
05783
05784
05785 template<typename eT>
05786 template<uword fixed_n_rows, uword fixed_n_cols>
05787 arma_inline
05788 arma_warn_unused
05789 eT&
05790 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col)
05791 {
05792 arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::fixed::operator(): out of bounds");
05793
05794 const uword i = in_row + in_col*fixed_n_rows;
05795
05796 return access::rw( Mat<eT>::mem[i] );
05797 }
05798
05799
05800
05801 template<typename eT>
05802 template<uword fixed_n_rows, uword fixed_n_cols>
05803 arma_inline
05804 arma_warn_unused
05805 eT
05806 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col) const
05807 {
05808 arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::fixed::operator(): out of bounds");
05809
05810 const uword i = in_row + in_col*fixed_n_rows;
05811
05812 return ( Mat<eT>::mem[i] );
05813 }
05814
05815
05816
05817 template<typename eT>
05818 template<uword fixed_n_rows, uword fixed_n_cols>
05819 arma_hot
05820 inline
05821 const Mat<eT>&
05822 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fill(const eT val)
05823 {
05824 arma_extra_debug_sigprint();
05825
05826 arrayops::inplace_set( const_cast<eT*>(Mat<eT>::mem), val, fixed_n_elem );
05827
05828 return *this;
05829 }
05830
05831
05832
05833 template<typename eT>
05834 template<uword fixed_n_rows, uword fixed_n_cols>
05835 arma_hot
05836 inline
05837 const Mat<eT>&
05838 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::zeros()
05839 {
05840 arma_extra_debug_sigprint();
05841
05842 arrayops::inplace_set( const_cast<eT*>(Mat<eT>::mem), eT(0), fixed_n_elem );
05843
05844 return *this;
05845 }
05846
05847
05848
05849 template<typename eT>
05850 template<uword fixed_n_rows, uword fixed_n_cols>
05851 arma_hot
05852 inline
05853 const Mat<eT>&
05854 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ones()
05855 {
05856 arma_extra_debug_sigprint();
05857
05858 arrayops::inplace_set( const_cast<eT*>(Mat<eT>::mem), eT(1), fixed_n_elem );
05859
05860 return *this;
05861 }
05862
05863
05864
05866 template<typename eT>
05867 arma_inline
05868 void
05869 Mat_aux::prefix_pp(Mat<eT>& x)
05870 {
05871 eT* memptr = x.memptr();
05872 const uword n_elem = x.n_elem;
05873
05874 uword i,j;
05875
05876 for(i=0, j=1; j<n_elem; i+=2, j+=2)
05877 {
05878 ++(memptr[i]);
05879 ++(memptr[j]);
05880 }
05881
05882 if(i < n_elem)
05883 {
05884 ++(memptr[i]);
05885 }
05886 }
05887
05888
05889
05891 template<typename T>
05892 arma_inline
05893 void
05894 Mat_aux::prefix_pp(Mat< std::complex<T> >& x)
05895 {
05896 x += T(1);
05897 }
05898
05899
05900
05902 template<typename eT>
05903 arma_inline
05904 void
05905 Mat_aux::postfix_pp(Mat<eT>& x)
05906 {
05907 eT* memptr = x.memptr();
05908 const uword n_elem = x.n_elem;
05909
05910 uword i,j;
05911
05912 for(i=0, j=1; j<n_elem; i+=2, j+=2)
05913 {
05914 (memptr[i])++;
05915 (memptr[j])++;
05916 }
05917
05918 if(i < n_elem)
05919 {
05920 (memptr[i])++;
05921 }
05922 }
05923
05924
05925
05927 template<typename T>
05928 arma_inline
05929 void
05930 Mat_aux::postfix_pp(Mat< std::complex<T> >& x)
05931 {
05932 x += T(1);
05933 }
05934
05935
05936
05938 template<typename eT>
05939 arma_inline
05940 void
05941 Mat_aux::prefix_mm(Mat<eT>& x)
05942 {
05943 eT* memptr = x.memptr();
05944 const uword n_elem = x.n_elem;
05945
05946 uword i,j;
05947
05948 for(i=0, j=1; j<n_elem; i+=2, j+=2)
05949 {
05950 --(memptr[i]);
05951 --(memptr[j]);
05952 }
05953
05954 if(i < n_elem)
05955 {
05956 --(memptr[i]);
05957 }
05958 }
05959
05960
05961
05963 template<typename T>
05964 arma_inline
05965 void
05966 Mat_aux::prefix_mm(Mat< std::complex<T> >& x)
05967 {
05968 x -= T(1);
05969 }
05970
05971
05972
05974 template<typename eT>
05975 arma_inline
05976 void
05977 Mat_aux::postfix_mm(Mat<eT>& x)
05978 {
05979 eT* memptr = x.memptr();
05980 const uword n_elem = x.n_elem;
05981
05982 uword i,j;
05983
05984 for(i=0, j=1; j<n_elem; i+=2, j+=2)
05985 {
05986 (memptr[i])--;
05987 (memptr[j])--;
05988 }
05989
05990 if(i < n_elem)
05991 {
05992 (memptr[i])--;
05993 }
05994 }
05995
05996
05997
05999 template<typename T>
06000 arma_inline
06001 void
06002 Mat_aux::postfix_mm(Mat< std::complex<T> >& x)
06003 {
06004 x -= T(1);
06005 }
06006
06007
06008
06009 template<typename eT, typename T1>
06010 inline
06011 void
06012 Mat_aux::set_real(Mat<eT>& out, const Base<eT,T1>& X)
06013 {
06014 arma_extra_debug_sigprint();
06015
06016 const unwrap<T1> tmp(X.get_ref());
06017 const Mat<eT>& A = tmp.M;
06018
06019 arma_debug_assert_same_size( out, A, "Mat::set_real()" );
06020
06021 out = A;
06022 }
06023
06024
06025
06026 template<typename eT, typename T1>
06027 inline
06028 void
06029 Mat_aux::set_imag(Mat<eT>& out, const Base<eT,T1>& X)
06030 {
06031 arma_extra_debug_sigprint();
06032 }
06033
06034
06035
06036 template<typename T, typename T1>
06037 inline
06038 void
06039 Mat_aux::set_real(Mat< std::complex<T> >& out, const Base<T,T1>& X)
06040 {
06041 arma_extra_debug_sigprint();
06042
06043 typedef typename std::complex<T> eT;
06044 typedef typename Proxy<T1>::ea_type ea_type;
06045
06046 const Proxy<T1> A(X.get_ref());
06047
06048 arma_debug_assert_same_size( out, A, "Mat::set_real()" );
06049
06050 const uword n_elem = out.n_elem;
06051 eT* out_mem = out.memptr();
06052 ea_type PA = A.get_ea();
06053
06054 for(uword i=0; i<n_elem; ++i)
06055 {
06056
06057 out_mem[i] = std::complex<T>( PA[i], out_mem[i].imag() );
06058 }
06059 }
06060
06061
06062
06063 template<typename T, typename T1>
06064 inline
06065 void
06066 Mat_aux::set_imag(Mat< std::complex<T> >& out, const Base<T,T1>& X)
06067 {
06068 arma_extra_debug_sigprint();
06069
06070 typedef typename std::complex<T> eT;
06071 typedef typename Proxy<T1>::ea_type ea_type;
06072
06073 const Proxy<T1> A(X.get_ref());
06074
06075 arma_debug_assert_same_size( out, A, "Mat::set_imag()" );
06076
06077 const uword n_elem = out.n_elem;
06078 eT* out_mem = out.memptr();
06079 ea_type PA = A.get_ea();
06080
06081 for(uword i=0; i<n_elem; ++i)
06082 {
06083
06084 out_mem[i] = std::complex<T>( out_mem[i].real(), PA[i] );
06085 }
06086 }
06087
06088
06089
06090 #ifdef ARMA_EXTRA_MAT_MEAT
06091 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_MEAT)
06092 #endif
06093
06094
06095