00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00016
00017
00018 template<typename eT>
00019 inline
00020 subview_cube<eT>::~subview_cube()
00021 {
00022 arma_extra_debug_sigprint();
00023 }
00024
00025
00026
00027 template<typename eT>
00028 arma_inline
00029 subview_cube<eT>::subview_cube
00030 (
00031 const Cube<eT>& in_m,
00032 const uword in_row1,
00033 const uword in_col1,
00034 const uword in_slice1,
00035 const uword in_n_rows,
00036 const uword in_n_cols,
00037 const uword in_n_slices
00038 )
00039 : m (in_m)
00040 , m_ptr (0)
00041 , aux_row1 (in_row1)
00042 , aux_col1 (in_col1)
00043 , aux_slice1 (in_slice1)
00044 , n_rows (in_n_rows)
00045 , n_cols (in_n_cols)
00046 , n_elem_slice(in_n_rows * in_n_cols)
00047 , n_slices (in_n_slices)
00048 , n_elem (n_elem_slice * in_n_slices)
00049 {
00050 arma_extra_debug_sigprint();
00051 }
00052
00053
00054
00055 template<typename eT>
00056 arma_inline
00057 subview_cube<eT>::subview_cube
00058 (
00059 Cube<eT>& in_m,
00060 const uword in_row1,
00061 const uword in_col1,
00062 const uword in_slice1,
00063 const uword in_n_rows,
00064 const uword in_n_cols,
00065 const uword in_n_slices
00066 )
00067 : m (in_m)
00068 , m_ptr (&in_m)
00069 , aux_row1 (in_row1)
00070 , aux_col1 (in_col1)
00071 , aux_slice1 (in_slice1)
00072 , n_rows (in_n_rows)
00073 , n_cols (in_n_cols)
00074 , n_elem_slice(in_n_rows * in_n_cols)
00075 , n_slices (in_n_slices)
00076 , n_elem (n_elem_slice * in_n_slices)
00077 {
00078 arma_extra_debug_sigprint();
00079 }
00080
00081
00082
00083 template<typename eT>
00084 inline
00085 void
00086 subview_cube<eT>::operator+= (const eT val)
00087 {
00088 arma_extra_debug_sigprint();
00089
00090 const uword local_n_rows = n_rows;
00091 const uword local_n_cols = n_cols;
00092 const uword local_n_slices = n_slices;
00093
00094 for(uword slice = 0; slice < local_n_slices; ++slice)
00095 {
00096 for(uword col = 0; col < local_n_cols; ++col)
00097 {
00098 arrayops::inplace_plus( slice_colptr(slice,col), val, local_n_rows );
00099 }
00100 }
00101 }
00102
00103
00104
00105 template<typename eT>
00106 inline
00107 void
00108 subview_cube<eT>::operator-= (const eT val)
00109 {
00110 arma_extra_debug_sigprint();
00111
00112 const uword local_n_rows = n_rows;
00113 const uword local_n_cols = n_cols;
00114 const uword local_n_slices = n_slices;
00115
00116 for(uword slice = 0; slice < local_n_slices; ++slice)
00117 {
00118 for(uword col = 0; col < local_n_cols; ++col)
00119 {
00120 arrayops::inplace_minus( slice_colptr(slice,col), val, local_n_rows );
00121 }
00122 }
00123 }
00124
00125
00126
00127 template<typename eT>
00128 inline
00129 void
00130 subview_cube<eT>::operator*= (const eT val)
00131 {
00132 arma_extra_debug_sigprint();
00133
00134 const uword local_n_rows = n_rows;
00135 const uword local_n_cols = n_cols;
00136 const uword local_n_slices = n_slices;
00137
00138 for(uword slice = 0; slice < local_n_slices; ++slice)
00139 {
00140 for(uword col = 0; col < local_n_cols; ++col)
00141 {
00142 arrayops::inplace_mul( slice_colptr(slice,col), val, local_n_rows );
00143 }
00144 }
00145 }
00146
00147
00148
00149 template<typename eT>
00150 inline
00151 void
00152 subview_cube<eT>::operator/= (const eT val)
00153 {
00154 arma_extra_debug_sigprint();
00155
00156 const uword local_n_rows = n_rows;
00157 const uword local_n_cols = n_cols;
00158 const uword local_n_slices = n_slices;
00159
00160 for(uword slice = 0; slice < local_n_slices; ++slice)
00161 {
00162 for(uword col = 0; col < local_n_cols; ++col)
00163 {
00164 arrayops::inplace_div( slice_colptr(slice,col), val, local_n_rows );
00165 }
00166 }
00167 }
00168
00169
00170
00171 template<typename eT>
00172 template<typename T1>
00173 inline
00174 void
00175 subview_cube<eT>::operator= (const BaseCube<eT,T1>& in)
00176 {
00177 arma_extra_debug_sigprint();
00178
00179 const unwrap_cube<T1> tmp(in.get_ref());
00180
00181 const Cube<eT>& x = tmp.M;
00182 subview_cube<eT>& t = *this;
00183
00184 arma_debug_assert_same_size(t, x, "copy into subcube");
00185
00186 const uword t_n_rows = t.n_rows;
00187 const uword t_n_cols = t.n_cols;
00188 const uword t_n_slices = t.n_slices;
00189
00190 for(uword slice = 0; slice < t_n_slices; ++slice)
00191 {
00192 for(uword col = 0; col < t_n_cols; ++col)
00193 {
00194 arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00195 }
00196 }
00197 }
00198
00199
00200
00201 template<typename eT>
00202 template<typename T1>
00203 inline
00204 void
00205 subview_cube<eT>::operator+= (const BaseCube<eT,T1>& in)
00206 {
00207 arma_extra_debug_sigprint();
00208
00209 const unwrap_cube<T1> tmp(in.get_ref());
00210
00211 const Cube<eT>& x = tmp.M;
00212 subview_cube<eT>& t = *this;
00213
00214 arma_debug_assert_same_size(t, x, "addition");
00215
00216 const uword t_n_rows = t.n_rows;
00217 const uword t_n_cols = t.n_cols;
00218 const uword t_n_slices = t.n_slices;
00219
00220 for(uword slice = 0; slice < t_n_slices; ++slice)
00221 {
00222 for(uword col = 0; col < t_n_cols; ++col)
00223 {
00224 arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00225 }
00226 }
00227 }
00228
00229
00230
00231 template<typename eT>
00232 template<typename T1>
00233 inline
00234 void
00235 subview_cube<eT>::operator-= (const BaseCube<eT,T1>& in)
00236 {
00237 arma_extra_debug_sigprint();
00238
00239 const unwrap_cube<T1> tmp(in.get_ref());
00240
00241 const Cube<eT>& x = tmp.M;
00242 subview_cube<eT>& t = *this;
00243
00244 arma_debug_assert_same_size(t, x, "subtraction");
00245
00246 const uword t_n_rows = t.n_rows;
00247 const uword t_n_cols = t.n_cols;
00248 const uword t_n_slices = t.n_slices;
00249
00250 for(uword slice = 0; slice < t_n_slices; ++slice)
00251 {
00252 for(uword col = 0; col < t_n_cols; ++col)
00253 {
00254 arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00255 }
00256 }
00257 }
00258
00259
00260
00261 template<typename eT>
00262 template<typename T1>
00263 inline
00264 void
00265 subview_cube<eT>::operator%= (const BaseCube<eT,T1>& in)
00266 {
00267 arma_extra_debug_sigprint();
00268
00269 const unwrap_cube<T1> tmp(in.get_ref());
00270
00271 const Cube<eT>& x = tmp.M;
00272 subview_cube<eT>& t = *this;
00273
00274 arma_debug_assert_same_size(t, x, "element-wise multiplication");
00275
00276 const uword t_n_rows = t.n_rows;
00277 const uword t_n_cols = t.n_cols;
00278 const uword t_n_slices = t.n_slices;
00279
00280 for(uword slice = 0; slice < t_n_slices; ++slice)
00281 {
00282 for(uword col = 0; col < t_n_cols; ++col)
00283 {
00284 arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00285 }
00286 }
00287 }
00288
00289
00290
00291 template<typename eT>
00292 template<typename T1>
00293 inline
00294 void
00295 subview_cube<eT>::operator/= (const BaseCube<eT,T1>& in)
00296 {
00297 arma_extra_debug_sigprint();
00298
00299 const unwrap_cube<T1> tmp(in.get_ref());
00300
00301 const Cube<eT>& x = tmp.M;
00302 subview_cube<eT>& t = *this;
00303
00304 arma_debug_assert_same_size(t, x, "element-wise division");
00305
00306 const uword t_n_rows = t.n_rows;
00307 const uword t_n_cols = t.n_cols;
00308 const uword t_n_slices = t.n_slices;
00309
00310 for(uword slice = 0; slice < t_n_slices; ++slice)
00311 {
00312 for(uword col = 0; col < t_n_cols; ++col)
00313 {
00314 arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00315 }
00316 }
00317 }
00318
00319
00320
00322 template<typename eT>
00323 inline
00324 void
00325 subview_cube<eT>::operator= (const subview_cube<eT>& x_in)
00326 {
00327 arma_extra_debug_sigprint();
00328
00329 const bool overlap = check_overlap(x_in);
00330
00331 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
00332 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
00333 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
00334
00335 subview_cube<eT>& t = *this;
00336
00337 arma_debug_assert_same_size(t, x, "copy into subcube");
00338
00339 const uword t_n_rows = t.n_rows;
00340 const uword t_n_cols = t.n_cols;
00341 const uword t_n_slices = t.n_slices;
00342
00343 for(uword slice = 0; slice < t_n_slices; ++slice)
00344 {
00345 for(uword col = 0; col < t_n_cols; ++col)
00346 {
00347 arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00348 }
00349 }
00350
00351 if(overlap)
00352 {
00353 delete tmp_subview_cube;
00354 delete tmp_cube;
00355 }
00356
00357 }
00358
00359
00360
00361 template<typename eT>
00362 inline
00363 void
00364 subview_cube<eT>::operator+= (const subview_cube<eT>& x_in)
00365 {
00366 arma_extra_debug_sigprint();
00367
00368 const bool overlap = check_overlap(x_in);
00369
00370 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
00371 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
00372 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
00373
00374 subview_cube<eT>& t = *this;
00375
00376 arma_debug_assert_same_size(t, x, "addition");
00377
00378 const uword t_n_rows = t.n_rows;
00379 const uword t_n_cols = t.n_cols;
00380 const uword t_n_slices = t.n_slices;
00381
00382 for(uword slice = 0; slice < t_n_slices; ++slice)
00383 {
00384 for(uword col = 0; col < t_n_cols; ++col)
00385 {
00386 arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00387 }
00388 }
00389
00390 if(overlap)
00391 {
00392 delete tmp_subview_cube;
00393 delete tmp_cube;
00394 }
00395
00396 }
00397
00398
00399
00400 template<typename eT>
00401 inline
00402 void
00403 subview_cube<eT>::operator-= (const subview_cube<eT>& x_in)
00404 {
00405 arma_extra_debug_sigprint();
00406
00407 const bool overlap = check_overlap(x_in);
00408
00409 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
00410 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
00411 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
00412
00413 subview_cube<eT>& t = *this;
00414
00415 arma_debug_assert_same_size(t, x, "subtraction");
00416
00417 const uword t_n_rows = t.n_rows;
00418 const uword t_n_cols = t.n_cols;
00419 const uword t_n_slices = t.n_slices;
00420
00421 for(uword slice = 0; slice < t_n_slices; ++slice)
00422 {
00423 for(uword col = 0; col < t_n_cols; ++col)
00424 {
00425 arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00426 }
00427 }
00428
00429 if(overlap)
00430 {
00431 delete tmp_subview_cube;
00432 delete tmp_cube;
00433 }
00434
00435 }
00436
00437
00438
00439 template<typename eT>
00440 inline
00441 void
00442 subview_cube<eT>::operator%= (const subview_cube<eT>& x_in)
00443 {
00444 arma_extra_debug_sigprint();
00445
00446 const bool overlap = check_overlap(x_in);
00447
00448 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
00449 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
00450 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
00451
00452 subview_cube<eT>& t = *this;
00453
00454 arma_debug_assert_same_size(t, x, "element-wise multiplication");
00455
00456 const uword t_n_rows = t.n_rows;
00457 const uword t_n_cols = t.n_cols;
00458 const uword t_n_slices = t.n_slices;
00459
00460 for(uword slice = 0; slice < t_n_slices; ++slice)
00461 {
00462 for(uword col = 0; col < t_n_cols; ++col)
00463 {
00464 arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00465 }
00466 }
00467
00468 if(overlap)
00469 {
00470 delete tmp_subview_cube;
00471 delete tmp_cube;
00472 }
00473
00474 }
00475
00476
00477
00478 template<typename eT>
00479 inline
00480 void
00481 subview_cube<eT>::operator/= (const subview_cube<eT>& x_in)
00482 {
00483 arma_extra_debug_sigprint();
00484
00485 const bool overlap = check_overlap(x_in);
00486
00487 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
00488 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
00489 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
00490
00491 subview_cube<eT>& t = *this;
00492
00493 arma_debug_assert_same_size(t, x, "element-wise division");
00494
00495 const uword t_n_rows = t.n_rows;
00496 const uword t_n_cols = t.n_cols;
00497 const uword t_n_slices = t.n_slices;
00498
00499 for(uword slice = 0; slice < t_n_slices; ++slice)
00500 {
00501 for(uword col = 0; col < t_n_cols; ++col)
00502 {
00503 arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
00504 }
00505 }
00506
00507 if(overlap)
00508 {
00509 delete tmp_subview_cube;
00510 delete tmp_cube;
00511 }
00512
00513 }
00514
00515
00516
00517 template<typename eT>
00518 template<typename T1>
00519 inline
00520 void
00521 subview_cube<eT>::operator= (const Base<eT,T1>& in)
00522 {
00523 arma_extra_debug_sigprint();
00524
00525 const unwrap<T1> tmp(in.get_ref());
00526
00527 const Mat<eT>& x = tmp.M;
00528 subview_cube<eT>& t = *this;
00529
00530 const uword t_n_rows = t.n_rows;
00531 const uword t_n_cols = t.n_cols;
00532 const uword t_n_slices = t.n_slices;
00533
00534 const uword x_n_rows = x.n_rows;
00535 const uword x_n_cols = x.n_cols;
00536
00537 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
00538 {
00539
00540
00541 for(uword col = 0; col < t_n_cols; ++col)
00542 {
00543 arrayops::copy( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
00544 }
00545 }
00546 else
00547 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
00548 {
00549 for(uword i=0; i < t_n_slices; ++i)
00550 {
00551 arrayops::copy( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
00552 }
00553 }
00554 else
00555 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
00556 {
00557 Cube<eT>& Q = *(t.m_ptr);
00558
00559 const uword t_aux_row1 = t.aux_row1;
00560 const uword t_aux_col1 = t.aux_col1;
00561 const uword t_aux_slice1 = t.aux_slice1;
00562
00563 for(uword slice=0; slice < t_n_slices; ++slice)
00564 {
00565 const uword mod_slice = t_aux_slice1 + slice;
00566
00567 const eT* x_colptr = x.colptr(slice);
00568
00569 uword i,j;
00570 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
00571 {
00572 const eT tmp_i = x_colptr[i];
00573 const eT tmp_j = x_colptr[j];
00574
00575 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = tmp_i;
00576 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) = tmp_j;
00577 }
00578
00579 if(i < t_n_cols)
00580 {
00581 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = x_colptr[i];
00582 }
00583 }
00584 }
00585 else
00586 {
00587 if(arma_config::debug == true)
00588 {
00589 arma_stop( arma_incompat_size_string(t, x, "copy into subcube") );
00590 }
00591 }
00592 }
00593
00594
00595
00596 template<typename eT>
00597 template<typename T1>
00598 inline
00599 void
00600 subview_cube<eT>::operator+= (const Base<eT,T1>& in)
00601 {
00602 arma_extra_debug_sigprint();
00603
00604 const unwrap<T1> tmp(in.get_ref());
00605
00606 const Mat<eT>& x = tmp.M;
00607 subview_cube<eT>& t = *this;
00608
00609 const uword t_n_rows = t.n_rows;
00610 const uword t_n_cols = t.n_cols;
00611 const uword t_n_slices = t.n_slices;
00612
00613 const uword x_n_rows = x.n_rows;
00614 const uword x_n_cols = x.n_cols;
00615
00616 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
00617 {
00618 for(uword col = 0; col < t_n_cols; ++col)
00619 {
00620 arrayops::inplace_plus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
00621 }
00622 }
00623 else
00624 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
00625 {
00626 for(uword i=0; i < t_n_slices; ++i)
00627 {
00628 arrayops::inplace_plus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
00629 }
00630 }
00631 else
00632 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
00633 {
00634 Cube<eT>& Q = *(t.m_ptr);
00635
00636 const uword t_aux_row1 = t.aux_row1;
00637 const uword t_aux_col1 = t.aux_col1;
00638 const uword t_aux_slice1 = t.aux_slice1;
00639
00640 for(uword slice=0; slice < t_n_slices; ++slice)
00641 {
00642 const uword mod_slice = t_aux_slice1 + slice;
00643
00644 const eT* x_colptr = x.colptr(slice);
00645
00646 uword i,j;
00647 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
00648 {
00649 const eT tmp_i = x_colptr[i];
00650 const eT tmp_j = x_colptr[j];
00651
00652 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += tmp_i;
00653 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) += tmp_j;
00654 }
00655
00656 if(i < t_n_cols)
00657 {
00658 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += x_colptr[i];
00659 }
00660 }
00661 }
00662 else
00663 {
00664 if(arma_config::debug == true)
00665 {
00666 arma_stop( arma_incompat_size_string(t, x, "addition") );
00667 }
00668 }
00669 }
00670
00671
00672
00673 template<typename eT>
00674 template<typename T1>
00675 inline
00676 void
00677 subview_cube<eT>::operator-= (const Base<eT,T1>& in)
00678 {
00679 arma_extra_debug_sigprint();
00680
00681 const unwrap<T1> tmp(in.get_ref());
00682
00683 const Mat<eT>& x = tmp.M;
00684 subview_cube<eT>& t = *this;
00685
00686 const uword t_n_rows = t.n_rows;
00687 const uword t_n_cols = t.n_cols;
00688 const uword t_n_slices = t.n_slices;
00689
00690 const uword x_n_rows = x.n_rows;
00691 const uword x_n_cols = x.n_cols;
00692
00693 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
00694 {
00695 for(uword col = 0; col < t_n_cols; ++col)
00696 {
00697 arrayops::inplace_minus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
00698 }
00699 }
00700 else
00701 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
00702 {
00703 for(uword i=0; i < t_n_slices; ++i)
00704 {
00705 arrayops::inplace_minus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
00706 }
00707 }
00708 else
00709 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
00710 {
00711 Cube<eT>& Q = *(t.m_ptr);
00712
00713 const uword t_aux_row1 = t.aux_row1;
00714 const uword t_aux_col1 = t.aux_col1;
00715 const uword t_aux_slice1 = t.aux_slice1;
00716
00717 for(uword slice=0; slice < t_n_slices; ++slice)
00718 {
00719 const uword mod_slice = t_aux_slice1 + slice;
00720
00721 const eT* x_colptr = x.colptr(slice);
00722
00723 uword i,j;
00724 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
00725 {
00726 const eT tmp_i = x_colptr[i];
00727 const eT tmp_j = x_colptr[j];
00728
00729 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= tmp_i;
00730 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) -= tmp_j;
00731 }
00732
00733 if(i < t_n_cols)
00734 {
00735 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= x_colptr[i];
00736 }
00737 }
00738 }
00739 else
00740 {
00741 if(arma_config::debug == true)
00742 {
00743 arma_stop( arma_incompat_size_string(t, x, "subtraction") );
00744 }
00745 }
00746 }
00747
00748
00749
00750 template<typename eT>
00751 template<typename T1>
00752 inline
00753 void
00754 subview_cube<eT>::operator%= (const Base<eT,T1>& in)
00755 {
00756 arma_extra_debug_sigprint();
00757
00758 const unwrap<T1> tmp(in.get_ref());
00759
00760 const Mat<eT>& x = tmp.M;
00761 subview_cube<eT>& t = *this;
00762
00763 const uword t_n_rows = t.n_rows;
00764 const uword t_n_cols = t.n_cols;
00765 const uword t_n_slices = t.n_slices;
00766
00767 const uword x_n_rows = x.n_rows;
00768 const uword x_n_cols = x.n_cols;
00769
00770 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
00771 {
00772 for(uword col = 0; col < t_n_cols; ++col)
00773 {
00774 arrayops::inplace_mul( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
00775 }
00776 }
00777 else
00778 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
00779 {
00780 for(uword i=0; i < t_n_slices; ++i)
00781 {
00782 arrayops::inplace_mul( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
00783 }
00784 }
00785 else
00786 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
00787 {
00788 Cube<eT>& Q = *(t.m_ptr);
00789
00790 const uword t_aux_row1 = t.aux_row1;
00791 const uword t_aux_col1 = t.aux_col1;
00792 const uword t_aux_slice1 = t.aux_slice1;
00793
00794 for(uword slice=0; slice < t_n_slices; ++slice)
00795 {
00796 const uword mod_slice = t_aux_slice1 + slice;
00797
00798 const eT* x_colptr = x.colptr(slice);
00799
00800 uword i,j;
00801 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
00802 {
00803 const eT tmp_i = x_colptr[i];
00804 const eT tmp_j = x_colptr[j];
00805
00806 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= tmp_i;
00807 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) *= tmp_j;
00808 }
00809
00810 if(i < t_n_cols)
00811 {
00812 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= x_colptr[i];
00813 }
00814 }
00815 }
00816 else
00817 {
00818 if(arma_config::debug == true)
00819 {
00820 arma_stop( arma_incompat_size_string(t, x, "element-wise multiplication") );
00821 }
00822 }
00823 }
00824
00825
00826
00827 template<typename eT>
00828 template<typename T1>
00829 inline
00830 void
00831 subview_cube<eT>::operator/= (const Base<eT,T1>& in)
00832 {
00833 arma_extra_debug_sigprint();
00834
00835 const unwrap<T1> tmp(in.get_ref());
00836
00837 const Mat<eT>& x = tmp.M;
00838 subview_cube<eT>& t = *this;
00839
00840 const uword t_n_rows = t.n_rows;
00841 const uword t_n_cols = t.n_cols;
00842 const uword t_n_slices = t.n_slices;
00843
00844 const uword x_n_rows = x.n_rows;
00845 const uword x_n_cols = x.n_cols;
00846
00847 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
00848 {
00849 for(uword col = 0; col < t_n_cols; ++col)
00850 {
00851 arrayops::inplace_div( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
00852 }
00853 }
00854 else
00855 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
00856 {
00857 for(uword i=0; i < t_n_slices; ++i)
00858 {
00859 arrayops::inplace_div( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
00860 }
00861 }
00862 else
00863 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
00864 {
00865 Cube<eT>& Q = *(t.m_ptr);
00866
00867 const uword t_aux_row1 = t.aux_row1;
00868 const uword t_aux_col1 = t.aux_col1;
00869 const uword t_aux_slice1 = t.aux_slice1;
00870
00871 for(uword slice=0; slice < t_n_slices; ++slice)
00872 {
00873 const uword mod_slice = t_aux_slice1 + slice;
00874
00875 const eT* x_colptr = x.colptr(slice);
00876
00877 uword i,j;
00878 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
00879 {
00880 const eT tmp_i = x_colptr[i];
00881 const eT tmp_j = x_colptr[j];
00882
00883 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= tmp_i;
00884 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) /= tmp_j;
00885 }
00886
00887 if(i < t_n_cols)
00888 {
00889 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= x_colptr[i];
00890 }
00891 }
00892 }
00893 else
00894 {
00895 if(arma_config::debug == true)
00896 {
00897 arma_stop( arma_incompat_size_string(t, x, "element-wise division") );
00898 }
00899 }
00900 }
00901
00902
00903
00904 template<typename eT>
00905 inline
00906 void
00907 subview_cube<eT>::fill(const eT val)
00908 {
00909 arma_extra_debug_sigprint();
00910
00911 const uword local_n_rows = n_rows;
00912 const uword local_n_cols = n_cols;
00913 const uword local_n_slices = n_slices;
00914
00915 for(uword slice = 0; slice < local_n_slices; ++slice)
00916 {
00917 for(uword col = 0; col < local_n_cols; ++col)
00918 {
00919 arrayops::inplace_set( slice_colptr(slice,col), val, local_n_rows );
00920 }
00921 }
00922
00923 }
00924
00925
00926
00927 template<typename eT>
00928 inline
00929 void
00930 subview_cube<eT>::zeros()
00931 {
00932 arma_extra_debug_sigprint();
00933
00934 fill(eT(0));
00935 }
00936
00937
00938
00939 template<typename eT>
00940 inline
00941 void
00942 subview_cube<eT>::ones()
00943 {
00944 arma_extra_debug_sigprint();
00945
00946 fill(eT(1));
00947 }
00948
00949
00950
00951 template<typename eT>
00952 inline
00953 eT&
00954 subview_cube<eT>::operator[](const uword i)
00955 {
00956 const uword in_slice = i / n_elem_slice;
00957 const uword offset = in_slice * n_elem_slice;
00958 const uword j = i - offset;
00959
00960 const uword in_col = j / n_rows;
00961 const uword in_row = j % n_rows;
00962
00963 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
00964 return access::rw( (*m_ptr).mem[index] );
00965 }
00966
00967
00968
00969 template<typename eT>
00970 inline
00971 eT
00972 subview_cube<eT>::operator[](const uword i) const
00973 {
00974 const uword in_slice = i / n_elem_slice;
00975 const uword offset = in_slice * n_elem_slice;
00976 const uword j = i - offset;
00977
00978 const uword in_col = j / n_rows;
00979 const uword in_row = j % n_rows;
00980
00981 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
00982 return m.mem[index];
00983 }
00984
00985
00986
00987 template<typename eT>
00988 inline
00989 eT&
00990 subview_cube<eT>::operator()(const uword i)
00991 {
00992 arma_debug_check( (i >= n_elem), "subview_cube::operator(): index out of bounds");
00993
00994 const uword in_slice = i / n_elem_slice;
00995 const uword offset = in_slice * n_elem_slice;
00996 const uword j = i - offset;
00997
00998 const uword in_col = j / n_rows;
00999 const uword in_row = j % n_rows;
01000
01001 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
01002 return access::rw( (*m_ptr).mem[index] );
01003 }
01004
01005
01006
01007 template<typename eT>
01008 inline
01009 eT
01010 subview_cube<eT>::operator()(const uword i) const
01011 {
01012 arma_debug_check( (i >= n_elem), "subview_cube::operator(): index out of bounds");
01013
01014 const uword in_slice = i / n_elem_slice;
01015 const uword offset = in_slice * n_elem_slice;
01016 const uword j = i - offset;
01017
01018 const uword in_col = j / n_rows;
01019 const uword in_row = j % n_rows;
01020
01021 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
01022 return m.mem[index];
01023 }
01024
01025
01026
01027 template<typename eT>
01028 arma_inline
01029 eT&
01030 subview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice)
01031 {
01032 arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds");
01033
01034 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
01035 return access::rw( (*m_ptr).mem[index] );
01036 }
01037
01038
01039
01040 template<typename eT>
01041 arma_inline
01042 eT
01043 subview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice) const
01044 {
01045 arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds");
01046
01047 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
01048 return m.mem[index];
01049 }
01050
01051
01052
01053 template<typename eT>
01054 arma_inline
01055 eT&
01056 subview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice)
01057 {
01058 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
01059 return access::rw( (*m_ptr).mem[index] );
01060 }
01061
01062
01063
01064 template<typename eT>
01065 arma_inline
01066 eT
01067 subview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice) const
01068 {
01069 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
01070 return m.mem[index];
01071 }
01072
01073
01074
01075 template<typename eT>
01076 arma_inline
01077 eT*
01078 subview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col)
01079 {
01080 return & access::rw((*m_ptr).mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ]);
01081 }
01082
01083
01084
01085 template<typename eT>
01086 arma_inline
01087 const eT*
01088 subview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col) const
01089 {
01090 return & m.mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ];
01091 }
01092
01093
01094
01095 template<typename eT>
01096 inline
01097 bool
01098 subview_cube<eT>::check_overlap(const subview_cube<eT>& x) const
01099 {
01100 const subview_cube<eT>& t = *this;
01101
01102 if(&t.m != &x.m)
01103 {
01104 return false;
01105 }
01106 else
01107 {
01108 if( (t.n_elem == 0) || (x.n_elem == 0) )
01109 {
01110 return false;
01111 }
01112 else
01113 {
01114 const uword t_row_start = t.aux_row1;
01115 const uword t_row_end_p1 = t_row_start + t.n_rows;
01116
01117 const uword t_col_start = t.aux_col1;
01118 const uword t_col_end_p1 = t_col_start + t.n_cols;
01119
01120 const uword t_slice_start = t.aux_slice1;
01121 const uword t_slice_end_p1 = t_slice_start + t.n_slices;
01122
01123
01124 const uword x_row_start = x.aux_row1;
01125 const uword x_row_end_p1 = x_row_start + x.n_rows;
01126
01127 const uword x_col_start = x.aux_col1;
01128 const uword x_col_end_p1 = x_col_start + x.n_cols;
01129
01130 const uword x_slice_start = x.aux_slice1;
01131 const uword x_slice_end_p1 = x_slice_start + x.n_slices;
01132
01133
01134 const bool outside_rows = ( (x_row_start >= t_row_end_p1 ) || (t_row_start >= x_row_end_p1 ) );
01135 const bool outside_cols = ( (x_col_start >= t_col_end_p1 ) || (t_col_start >= x_col_end_p1 ) );
01136 const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) );
01137
01138 return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) );
01139 }
01140 }
01141 }
01142
01143
01144
01145 template<typename eT>
01146 inline
01147 bool
01148 subview_cube<eT>::check_overlap(const Mat<eT>& x) const
01149 {
01150 const subview_cube<eT>& t = *this;
01151
01152 const uword t_aux_slice1 = t.aux_slice1;
01153 const uword t_aux_slice2_plus_1 = t_aux_slice1 + t.n_slices;
01154
01155 for(uword slice = t_aux_slice1; slice < t_aux_slice2_plus_1; ++slice)
01156 {
01157 const Mat<eT>& y = *(t.m.mat_ptrs[slice]);
01158
01159 if( x.memptr() == y.memptr() )
01160 {
01161 return true;
01162 }
01163 }
01164
01165 return false;
01166 }
01167
01168
01169
01171 template<typename eT>
01172 inline
01173 void
01174 subview_cube<eT>::extract(Cube<eT>& out, const subview_cube<eT>& in)
01175 {
01176 arma_extra_debug_sigprint();
01177
01178
01179
01180
01181 const uword n_rows = in.n_rows;
01182 const uword n_cols = in.n_cols;
01183 const uword n_slices = in.n_slices;
01184
01185 arma_extra_debug_print(arma_boost::format("out.n_rows = %d out.n_cols = %d out.n_slices = %d in.m.n_rows = %d in.m.n_cols = %d in.m.n_slices = %d") % out.n_rows % out.n_cols % out.n_slices % in.m.n_rows % in.m.n_cols % in.m.n_slices);
01186
01187
01188 for(uword slice = 0; slice < n_slices; ++slice)
01189 {
01190 for(uword col = 0; col < n_cols; ++col)
01191 {
01192 arrayops::copy( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
01193 }
01194 }
01195 }
01196
01197
01198
01200 template<typename eT>
01201 inline
01202 void
01203 subview_cube<eT>::plus_inplace(Cube<eT>& out, const subview_cube<eT>& in)
01204 {
01205 arma_extra_debug_sigprint();
01206
01207 arma_debug_assert_same_size(out, in, "addition");
01208
01209 const uword n_rows = out.n_rows;
01210 const uword n_cols = out.n_cols;
01211 const uword n_slices = out.n_slices;
01212
01213 for(uword slice = 0; slice<n_slices; ++slice)
01214 {
01215 for(uword col = 0; col<n_cols; ++col)
01216 {
01217 arrayops::inplace_plus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
01218 }
01219 }
01220 }
01221
01222
01223
01225 template<typename eT>
01226 inline
01227 void
01228 subview_cube<eT>::minus_inplace(Cube<eT>& out, const subview_cube<eT>& in)
01229 {
01230 arma_extra_debug_sigprint();
01231
01232 arma_debug_assert_same_size(out, in, "subtraction");
01233
01234 const uword n_rows = out.n_rows;
01235 const uword n_cols = out.n_cols;
01236 const uword n_slices = out.n_slices;
01237
01238 for(uword slice = 0; slice<n_slices; ++slice)
01239 {
01240 for(uword col = 0; col<n_cols; ++col)
01241 {
01242 arrayops::inplace_minus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
01243 }
01244 }
01245 }
01246
01247
01248
01250 template<typename eT>
01251 inline
01252 void
01253 subview_cube<eT>::schur_inplace(Cube<eT>& out, const subview_cube<eT>& in)
01254 {
01255 arma_extra_debug_sigprint();
01256
01257 arma_debug_assert_same_size(out, in, "element-wise multiplication");
01258
01259 const uword n_rows = out.n_rows;
01260 const uword n_cols = out.n_cols;
01261 const uword n_slices = out.n_slices;
01262
01263 for(uword slice = 0; slice<n_slices; ++slice)
01264 {
01265 for(uword col = 0; col<n_cols; ++col)
01266 {
01267 arrayops::inplace_mul( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
01268 }
01269 }
01270 }
01271
01272
01273
01275 template<typename eT>
01276 inline
01277 void
01278 subview_cube<eT>::div_inplace(Cube<eT>& out, const subview_cube<eT>& in)
01279 {
01280 arma_extra_debug_sigprint();
01281
01282 arma_debug_assert_same_size(out, in, "element-wise division");
01283
01284 const uword n_rows = out.n_rows;
01285 const uword n_cols = out.n_cols;
01286 const uword n_slices = out.n_slices;
01287
01288 for(uword slice = 0; slice<n_slices; ++slice)
01289 {
01290 for(uword col = 0; col<n_cols; ++col)
01291 {
01292 arrayops::inplace_div( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
01293 }
01294 }
01295 }
01296
01297
01298
01300 template<typename eT>
01301 inline
01302 void
01303 subview_cube<eT>::extract(Mat<eT>& out, const subview_cube<eT>& in)
01304 {
01305 arma_extra_debug_sigprint();
01306
01307 arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false);
01308
01309 const uword in_n_rows = in.n_rows;
01310 const uword in_n_cols = in.n_cols;
01311 const uword in_n_slices = in.n_slices;
01312
01313 const uword out_vec_state = out.vec_state;
01314
01315 if(in_n_slices == 1)
01316 {
01317 out.set_size(in_n_rows, in_n_cols);
01318
01319 for(uword col=0; col < in_n_cols; ++col)
01320 {
01321 arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01322 }
01323 }
01324 else
01325 {
01326 if(out_vec_state == 0)
01327 {
01328 if(in_n_cols == 1)
01329 {
01330 out.set_size(in_n_rows, in_n_slices);
01331
01332 for(uword i=0; i < in_n_slices; ++i)
01333 {
01334 arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01335 }
01336 }
01337 else
01338 if(in_n_rows == 1)
01339 {
01340 const Cube<eT>& Q = in.m;
01341
01342 const uword in_aux_row1 = in.aux_row1;
01343 const uword in_aux_col1 = in.aux_col1;
01344 const uword in_aux_slice1 = in.aux_slice1;
01345
01346 out.set_size(in_n_cols, in_n_slices);
01347
01348 for(uword slice=0; slice < in_n_slices; ++slice)
01349 {
01350 const uword mod_slice = in_aux_slice1 + slice;
01351
01352 eT* out_colptr = out.colptr(slice);
01353
01354 uword i,j;
01355 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01356 {
01357 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01358 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
01359
01360 out_colptr[i] = tmp_i;
01361 out_colptr[j] = tmp_j;
01362 }
01363
01364 if(i < in_n_cols)
01365 {
01366 out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01367 }
01368 }
01369 }
01370 }
01371 else
01372 {
01373 out.set_size(in_n_slices);
01374
01375 eT* out_mem = out.memptr();
01376
01377 const Cube<eT>& Q = in.m;
01378
01379 const uword in_aux_row1 = in.aux_row1;
01380 const uword in_aux_col1 = in.aux_col1;
01381 const uword in_aux_slice1 = in.aux_slice1;
01382
01383 for(uword i=0; i<in_n_slices; ++i)
01384 {
01385 out_mem[i] = Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
01386 }
01387 }
01388 }
01389 }
01390
01391
01392
01394 template<typename eT>
01395 inline
01396 void
01397 subview_cube<eT>::plus_inplace(Mat<eT>& out, const subview_cube<eT>& in)
01398 {
01399 arma_extra_debug_sigprint();
01400
01401 arma_debug_assert_cube_as_mat(out, in, "addition", true);
01402
01403 const uword in_n_rows = in.n_rows;
01404 const uword in_n_cols = in.n_cols;
01405 const uword in_n_slices = in.n_slices;
01406
01407 const uword out_n_rows = out.n_rows;
01408 const uword out_n_cols = out.n_cols;
01409 const uword out_vec_state = out.vec_state;
01410
01411 if(in_n_slices == 1)
01412 {
01413 for(uword col=0; col < in_n_cols; ++col)
01414 {
01415 arrayops::inplace_plus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01416 }
01417 }
01418 else
01419 {
01420 if(out_vec_state == 0)
01421 {
01422 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01423 {
01424 for(uword i=0; i < in_n_slices; ++i)
01425 {
01426 arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01427 }
01428 }
01429 else
01430 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01431 {
01432 const Cube<eT>& Q = in.m;
01433
01434 const uword in_aux_row1 = in.aux_row1;
01435 const uword in_aux_col1 = in.aux_col1;
01436 const uword in_aux_slice1 = in.aux_slice1;
01437
01438 for(uword slice=0; slice < in_n_slices; ++slice)
01439 {
01440 const uword mod_slice = in_aux_slice1 + slice;
01441
01442 eT* out_colptr = out.colptr(slice);
01443
01444 uword i,j;
01445 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01446 {
01447 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01448 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
01449
01450 out_colptr[i] += tmp_i;
01451 out_colptr[j] += tmp_j;
01452 }
01453
01454 if(i < in_n_cols)
01455 {
01456 out_colptr[i] += Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01457 }
01458 }
01459 }
01460 }
01461 else
01462 {
01463 eT* out_mem = out.memptr();
01464
01465 const Cube<eT>& Q = in.m;
01466
01467 const uword in_aux_row1 = in.aux_row1;
01468 const uword in_aux_col1 = in.aux_col1;
01469 const uword in_aux_slice1 = in.aux_slice1;
01470
01471 for(uword i=0; i<in_n_slices; ++i)
01472 {
01473 out_mem[i] += Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
01474 }
01475 }
01476 }
01477 }
01478
01479
01480
01482 template<typename eT>
01483 inline
01484 void
01485 subview_cube<eT>::minus_inplace(Mat<eT>& out, const subview_cube<eT>& in)
01486 {
01487 arma_extra_debug_sigprint();
01488
01489 arma_debug_assert_cube_as_mat(out, in, "subtraction", true);
01490
01491 const uword in_n_rows = in.n_rows;
01492 const uword in_n_cols = in.n_cols;
01493 const uword in_n_slices = in.n_slices;
01494
01495 const uword out_n_rows = out.n_rows;
01496 const uword out_n_cols = out.n_cols;
01497 const uword out_vec_state = out.vec_state;
01498
01499 if(in_n_slices == 1)
01500 {
01501 for(uword col=0; col < in_n_cols; ++col)
01502 {
01503 arrayops::inplace_minus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01504 }
01505 }
01506 else
01507 {
01508 if(out_vec_state == 0)
01509 {
01510 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01511 {
01512 for(uword i=0; i < in_n_slices; ++i)
01513 {
01514 arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01515 }
01516 }
01517 else
01518 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01519 {
01520 const Cube<eT>& Q = in.m;
01521
01522 const uword in_aux_row1 = in.aux_row1;
01523 const uword in_aux_col1 = in.aux_col1;
01524 const uword in_aux_slice1 = in.aux_slice1;
01525
01526 for(uword slice=0; slice < in_n_slices; ++slice)
01527 {
01528 const uword mod_slice = in_aux_slice1 + slice;
01529
01530 eT* out_colptr = out.colptr(slice);
01531
01532 uword i,j;
01533 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01534 {
01535 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01536 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
01537
01538 out_colptr[i] -= tmp_i;
01539 out_colptr[j] -= tmp_j;
01540 }
01541
01542 if(i < in_n_cols)
01543 {
01544 out_colptr[i] -= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01545 }
01546 }
01547 }
01548 }
01549 else
01550 {
01551 eT* out_mem = out.memptr();
01552
01553 const Cube<eT>& Q = in.m;
01554
01555 const uword in_aux_row1 = in.aux_row1;
01556 const uword in_aux_col1 = in.aux_col1;
01557 const uword in_aux_slice1 = in.aux_slice1;
01558
01559 for(uword i=0; i<in_n_slices; ++i)
01560 {
01561 out_mem[i] -= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
01562 }
01563 }
01564 }
01565 }
01566
01567
01568
01570 template<typename eT>
01571 inline
01572 void
01573 subview_cube<eT>::schur_inplace(Mat<eT>& out, const subview_cube<eT>& in)
01574 {
01575 arma_extra_debug_sigprint();
01576
01577 arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true);
01578
01579 const uword in_n_rows = in.n_rows;
01580 const uword in_n_cols = in.n_cols;
01581 const uword in_n_slices = in.n_slices;
01582
01583 const uword out_n_rows = out.n_rows;
01584 const uword out_n_cols = out.n_cols;
01585 const uword out_vec_state = out.vec_state;
01586
01587 if(in_n_slices == 1)
01588 {
01589 for(uword col=0; col < in_n_cols; ++col)
01590 {
01591 arrayops::inplace_mul( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01592 }
01593 }
01594 else
01595 {
01596 if(out_vec_state == 0)
01597 {
01598 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01599 {
01600 for(uword i=0; i < in_n_slices; ++i)
01601 {
01602 arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01603 }
01604 }
01605 else
01606 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01607 {
01608 const Cube<eT>& Q = in.m;
01609
01610 const uword in_aux_row1 = in.aux_row1;
01611 const uword in_aux_col1 = in.aux_col1;
01612 const uword in_aux_slice1 = in.aux_slice1;
01613
01614 for(uword slice=0; slice < in_n_slices; ++slice)
01615 {
01616 const uword mod_slice = in_aux_slice1 + slice;
01617
01618 eT* out_colptr = out.colptr(slice);
01619
01620 uword i,j;
01621 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01622 {
01623 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01624 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
01625
01626 out_colptr[i] *= tmp_i;
01627 out_colptr[j] *= tmp_j;
01628 }
01629
01630 if(i < in_n_cols)
01631 {
01632 out_colptr[i] *= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01633 }
01634 }
01635 }
01636 }
01637 else
01638 {
01639 eT* out_mem = out.memptr();
01640
01641 const Cube<eT>& Q = in.m;
01642
01643 const uword in_aux_row1 = in.aux_row1;
01644 const uword in_aux_col1 = in.aux_col1;
01645 const uword in_aux_slice1 = in.aux_slice1;
01646
01647 for(uword i=0; i<in_n_slices; ++i)
01648 {
01649 out_mem[i] *= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
01650 }
01651 }
01652 }
01653 }
01654
01655
01656
01658 template<typename eT>
01659 inline
01660 void
01661 subview_cube<eT>::div_inplace(Mat<eT>& out, const subview_cube<eT>& in)
01662 {
01663 arma_extra_debug_sigprint();
01664
01665 arma_debug_assert_cube_as_mat(out, in, "element-wise division", true);
01666
01667 const uword in_n_rows = in.n_rows;
01668 const uword in_n_cols = in.n_cols;
01669 const uword in_n_slices = in.n_slices;
01670
01671 const uword out_n_rows = out.n_rows;
01672 const uword out_n_cols = out.n_cols;
01673 const uword out_vec_state = out.vec_state;
01674
01675 if(in_n_slices == 1)
01676 {
01677 for(uword col=0; col < in_n_cols; ++col)
01678 {
01679 arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
01680 }
01681 }
01682 else
01683 {
01684 if(out_vec_state == 0)
01685 {
01686 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
01687 {
01688 for(uword i=0; i < in_n_slices; ++i)
01689 {
01690 arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
01691 }
01692 }
01693 else
01694 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
01695 {
01696 const Cube<eT>& Q = in.m;
01697
01698 const uword in_aux_row1 = in.aux_row1;
01699 const uword in_aux_col1 = in.aux_col1;
01700 const uword in_aux_slice1 = in.aux_slice1;
01701
01702 for(uword slice=0; slice < in_n_slices; ++slice)
01703 {
01704 const uword mod_slice = in_aux_slice1 + slice;
01705
01706 eT* out_colptr = out.colptr(slice);
01707
01708 uword i,j;
01709 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
01710 {
01711 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01712 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
01713
01714 out_colptr[i] /= tmp_i;
01715 out_colptr[j] /= tmp_j;
01716 }
01717
01718 if(i < in_n_cols)
01719 {
01720 out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
01721 }
01722 }
01723 }
01724 }
01725 else
01726 {
01727 eT* out_mem = out.memptr();
01728
01729 const Cube<eT>& Q = in.m;
01730
01731 const uword in_aux_row1 = in.aux_row1;
01732 const uword in_aux_col1 = in.aux_col1;
01733 const uword in_aux_slice1 = in.aux_slice1;
01734
01735 for(uword i=0; i<in_n_slices; ++i)
01736 {
01737 out_mem[i] /= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
01738 }
01739 }
01740 }
01741 }
01742
01743
01744