annotate armadillo-3.900.4/include/armadillo_bits/subview_cube_meat.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2008-2013 Conrad Sanderson
Chris@49 3 //
Chris@49 4 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 5 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 7
Chris@49 8
Chris@49 9 //! \addtogroup subview_cube
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 template<typename eT>
Chris@49 14 inline
Chris@49 15 subview_cube<eT>::~subview_cube()
Chris@49 16 {
Chris@49 17 arma_extra_debug_sigprint();
Chris@49 18 }
Chris@49 19
Chris@49 20
Chris@49 21
Chris@49 22 template<typename eT>
Chris@49 23 arma_inline
Chris@49 24 subview_cube<eT>::subview_cube
Chris@49 25 (
Chris@49 26 const Cube<eT>& in_m,
Chris@49 27 const uword in_row1,
Chris@49 28 const uword in_col1,
Chris@49 29 const uword in_slice1,
Chris@49 30 const uword in_n_rows,
Chris@49 31 const uword in_n_cols,
Chris@49 32 const uword in_n_slices
Chris@49 33 )
Chris@49 34 : m (in_m)
Chris@49 35 , aux_row1 (in_row1)
Chris@49 36 , aux_col1 (in_col1)
Chris@49 37 , aux_slice1 (in_slice1)
Chris@49 38 , n_rows (in_n_rows)
Chris@49 39 , n_cols (in_n_cols)
Chris@49 40 , n_elem_slice(in_n_rows * in_n_cols)
Chris@49 41 , n_slices (in_n_slices)
Chris@49 42 , n_elem (n_elem_slice * in_n_slices)
Chris@49 43 {
Chris@49 44 arma_extra_debug_sigprint();
Chris@49 45 }
Chris@49 46
Chris@49 47
Chris@49 48
Chris@49 49 template<typename eT>
Chris@49 50 inline
Chris@49 51 void
Chris@49 52 subview_cube<eT>::operator+= (const eT val)
Chris@49 53 {
Chris@49 54 arma_extra_debug_sigprint();
Chris@49 55
Chris@49 56 const uword local_n_rows = n_rows;
Chris@49 57 const uword local_n_cols = n_cols;
Chris@49 58 const uword local_n_slices = n_slices;
Chris@49 59
Chris@49 60 for(uword slice = 0; slice < local_n_slices; ++slice)
Chris@49 61 {
Chris@49 62 for(uword col = 0; col < local_n_cols; ++col)
Chris@49 63 {
Chris@49 64 arrayops::inplace_plus( slice_colptr(slice,col), val, local_n_rows );
Chris@49 65 }
Chris@49 66 }
Chris@49 67 }
Chris@49 68
Chris@49 69
Chris@49 70
Chris@49 71 template<typename eT>
Chris@49 72 inline
Chris@49 73 void
Chris@49 74 subview_cube<eT>::operator-= (const eT val)
Chris@49 75 {
Chris@49 76 arma_extra_debug_sigprint();
Chris@49 77
Chris@49 78 const uword local_n_rows = n_rows;
Chris@49 79 const uword local_n_cols = n_cols;
Chris@49 80 const uword local_n_slices = n_slices;
Chris@49 81
Chris@49 82 for(uword slice = 0; slice < local_n_slices; ++slice)
Chris@49 83 {
Chris@49 84 for(uword col = 0; col < local_n_cols; ++col)
Chris@49 85 {
Chris@49 86 arrayops::inplace_minus( slice_colptr(slice,col), val, local_n_rows );
Chris@49 87 }
Chris@49 88 }
Chris@49 89 }
Chris@49 90
Chris@49 91
Chris@49 92
Chris@49 93 template<typename eT>
Chris@49 94 inline
Chris@49 95 void
Chris@49 96 subview_cube<eT>::operator*= (const eT val)
Chris@49 97 {
Chris@49 98 arma_extra_debug_sigprint();
Chris@49 99
Chris@49 100 const uword local_n_rows = n_rows;
Chris@49 101 const uword local_n_cols = n_cols;
Chris@49 102 const uword local_n_slices = n_slices;
Chris@49 103
Chris@49 104 for(uword slice = 0; slice < local_n_slices; ++slice)
Chris@49 105 {
Chris@49 106 for(uword col = 0; col < local_n_cols; ++col)
Chris@49 107 {
Chris@49 108 arrayops::inplace_mul( slice_colptr(slice,col), val, local_n_rows );
Chris@49 109 }
Chris@49 110 }
Chris@49 111 }
Chris@49 112
Chris@49 113
Chris@49 114
Chris@49 115 template<typename eT>
Chris@49 116 inline
Chris@49 117 void
Chris@49 118 subview_cube<eT>::operator/= (const eT val)
Chris@49 119 {
Chris@49 120 arma_extra_debug_sigprint();
Chris@49 121
Chris@49 122 const uword local_n_rows = n_rows;
Chris@49 123 const uword local_n_cols = n_cols;
Chris@49 124 const uword local_n_slices = n_slices;
Chris@49 125
Chris@49 126 for(uword slice = 0; slice < local_n_slices; ++slice)
Chris@49 127 {
Chris@49 128 for(uword col = 0; col < local_n_cols; ++col)
Chris@49 129 {
Chris@49 130 arrayops::inplace_div( slice_colptr(slice,col), val, local_n_rows );
Chris@49 131 }
Chris@49 132 }
Chris@49 133 }
Chris@49 134
Chris@49 135
Chris@49 136
Chris@49 137 template<typename eT>
Chris@49 138 template<typename T1>
Chris@49 139 inline
Chris@49 140 void
Chris@49 141 subview_cube<eT>::operator= (const BaseCube<eT,T1>& in)
Chris@49 142 {
Chris@49 143 arma_extra_debug_sigprint();
Chris@49 144
Chris@49 145 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 146
Chris@49 147 const Cube<eT>& x = tmp.M;
Chris@49 148 subview_cube<eT>& t = *this;
Chris@49 149
Chris@49 150 arma_debug_assert_same_size(t, x, "copy into subcube");
Chris@49 151
Chris@49 152 const uword t_n_rows = t.n_rows;
Chris@49 153 const uword t_n_cols = t.n_cols;
Chris@49 154 const uword t_n_slices = t.n_slices;
Chris@49 155
Chris@49 156 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 157 {
Chris@49 158 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 159 {
Chris@49 160 arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 161 }
Chris@49 162 }
Chris@49 163 }
Chris@49 164
Chris@49 165
Chris@49 166
Chris@49 167 template<typename eT>
Chris@49 168 template<typename T1>
Chris@49 169 inline
Chris@49 170 void
Chris@49 171 subview_cube<eT>::operator+= (const BaseCube<eT,T1>& in)
Chris@49 172 {
Chris@49 173 arma_extra_debug_sigprint();
Chris@49 174
Chris@49 175 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 176
Chris@49 177 const Cube<eT>& x = tmp.M;
Chris@49 178 subview_cube<eT>& t = *this;
Chris@49 179
Chris@49 180 arma_debug_assert_same_size(t, x, "addition");
Chris@49 181
Chris@49 182 const uword t_n_rows = t.n_rows;
Chris@49 183 const uword t_n_cols = t.n_cols;
Chris@49 184 const uword t_n_slices = t.n_slices;
Chris@49 185
Chris@49 186 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 187 {
Chris@49 188 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 189 {
Chris@49 190 arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 191 }
Chris@49 192 }
Chris@49 193 }
Chris@49 194
Chris@49 195
Chris@49 196
Chris@49 197 template<typename eT>
Chris@49 198 template<typename T1>
Chris@49 199 inline
Chris@49 200 void
Chris@49 201 subview_cube<eT>::operator-= (const BaseCube<eT,T1>& in)
Chris@49 202 {
Chris@49 203 arma_extra_debug_sigprint();
Chris@49 204
Chris@49 205 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 206
Chris@49 207 const Cube<eT>& x = tmp.M;
Chris@49 208 subview_cube<eT>& t = *this;
Chris@49 209
Chris@49 210 arma_debug_assert_same_size(t, x, "subtraction");
Chris@49 211
Chris@49 212 const uword t_n_rows = t.n_rows;
Chris@49 213 const uword t_n_cols = t.n_cols;
Chris@49 214 const uword t_n_slices = t.n_slices;
Chris@49 215
Chris@49 216 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 217 {
Chris@49 218 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 219 {
Chris@49 220 arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 221 }
Chris@49 222 }
Chris@49 223 }
Chris@49 224
Chris@49 225
Chris@49 226
Chris@49 227 template<typename eT>
Chris@49 228 template<typename T1>
Chris@49 229 inline
Chris@49 230 void
Chris@49 231 subview_cube<eT>::operator%= (const BaseCube<eT,T1>& in)
Chris@49 232 {
Chris@49 233 arma_extra_debug_sigprint();
Chris@49 234
Chris@49 235 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 236
Chris@49 237 const Cube<eT>& x = tmp.M;
Chris@49 238 subview_cube<eT>& t = *this;
Chris@49 239
Chris@49 240 arma_debug_assert_same_size(t, x, "element-wise multiplication");
Chris@49 241
Chris@49 242 const uword t_n_rows = t.n_rows;
Chris@49 243 const uword t_n_cols = t.n_cols;
Chris@49 244 const uword t_n_slices = t.n_slices;
Chris@49 245
Chris@49 246 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 247 {
Chris@49 248 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 249 {
Chris@49 250 arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 251 }
Chris@49 252 }
Chris@49 253 }
Chris@49 254
Chris@49 255
Chris@49 256
Chris@49 257 template<typename eT>
Chris@49 258 template<typename T1>
Chris@49 259 inline
Chris@49 260 void
Chris@49 261 subview_cube<eT>::operator/= (const BaseCube<eT,T1>& in)
Chris@49 262 {
Chris@49 263 arma_extra_debug_sigprint();
Chris@49 264
Chris@49 265 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 266
Chris@49 267 const Cube<eT>& x = tmp.M;
Chris@49 268 subview_cube<eT>& t = *this;
Chris@49 269
Chris@49 270 arma_debug_assert_same_size(t, x, "element-wise division");
Chris@49 271
Chris@49 272 const uword t_n_rows = t.n_rows;
Chris@49 273 const uword t_n_cols = t.n_cols;
Chris@49 274 const uword t_n_slices = t.n_slices;
Chris@49 275
Chris@49 276 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 277 {
Chris@49 278 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 279 {
Chris@49 280 arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 281 }
Chris@49 282 }
Chris@49 283 }
Chris@49 284
Chris@49 285
Chris@49 286
Chris@49 287 //! x.subcube(...) = y.subcube(...)
Chris@49 288 template<typename eT>
Chris@49 289 inline
Chris@49 290 void
Chris@49 291 subview_cube<eT>::operator= (const subview_cube<eT>& x_in)
Chris@49 292 {
Chris@49 293 arma_extra_debug_sigprint();
Chris@49 294
Chris@49 295 const bool overlap = check_overlap(x_in);
Chris@49 296
Chris@49 297 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
Chris@49 298 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;
Chris@49 299 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
Chris@49 300
Chris@49 301 subview_cube<eT>& t = *this;
Chris@49 302
Chris@49 303 arma_debug_assert_same_size(t, x, "copy into subcube");
Chris@49 304
Chris@49 305 const uword t_n_rows = t.n_rows;
Chris@49 306 const uword t_n_cols = t.n_cols;
Chris@49 307 const uword t_n_slices = t.n_slices;
Chris@49 308
Chris@49 309 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 310 {
Chris@49 311 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 312 {
Chris@49 313 arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 314 }
Chris@49 315 }
Chris@49 316
Chris@49 317 if(overlap)
Chris@49 318 {
Chris@49 319 delete tmp_subview_cube;
Chris@49 320 delete tmp_cube;
Chris@49 321 }
Chris@49 322
Chris@49 323 }
Chris@49 324
Chris@49 325
Chris@49 326
Chris@49 327 template<typename eT>
Chris@49 328 inline
Chris@49 329 void
Chris@49 330 subview_cube<eT>::operator+= (const subview_cube<eT>& x_in)
Chris@49 331 {
Chris@49 332 arma_extra_debug_sigprint();
Chris@49 333
Chris@49 334 const bool overlap = check_overlap(x_in);
Chris@49 335
Chris@49 336 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
Chris@49 337 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;
Chris@49 338 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
Chris@49 339
Chris@49 340 subview_cube<eT>& t = *this;
Chris@49 341
Chris@49 342 arma_debug_assert_same_size(t, x, "addition");
Chris@49 343
Chris@49 344 const uword t_n_rows = t.n_rows;
Chris@49 345 const uword t_n_cols = t.n_cols;
Chris@49 346 const uword t_n_slices = t.n_slices;
Chris@49 347
Chris@49 348 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 349 {
Chris@49 350 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 351 {
Chris@49 352 arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 353 }
Chris@49 354 }
Chris@49 355
Chris@49 356 if(overlap)
Chris@49 357 {
Chris@49 358 delete tmp_subview_cube;
Chris@49 359 delete tmp_cube;
Chris@49 360 }
Chris@49 361
Chris@49 362 }
Chris@49 363
Chris@49 364
Chris@49 365
Chris@49 366 template<typename eT>
Chris@49 367 inline
Chris@49 368 void
Chris@49 369 subview_cube<eT>::operator-= (const subview_cube<eT>& x_in)
Chris@49 370 {
Chris@49 371 arma_extra_debug_sigprint();
Chris@49 372
Chris@49 373 const bool overlap = check_overlap(x_in);
Chris@49 374
Chris@49 375 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
Chris@49 376 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;
Chris@49 377 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
Chris@49 378
Chris@49 379 subview_cube<eT>& t = *this;
Chris@49 380
Chris@49 381 arma_debug_assert_same_size(t, x, "subtraction");
Chris@49 382
Chris@49 383 const uword t_n_rows = t.n_rows;
Chris@49 384 const uword t_n_cols = t.n_cols;
Chris@49 385 const uword t_n_slices = t.n_slices;
Chris@49 386
Chris@49 387 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 388 {
Chris@49 389 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 390 {
Chris@49 391 arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 392 }
Chris@49 393 }
Chris@49 394
Chris@49 395 if(overlap)
Chris@49 396 {
Chris@49 397 delete tmp_subview_cube;
Chris@49 398 delete tmp_cube;
Chris@49 399 }
Chris@49 400
Chris@49 401 }
Chris@49 402
Chris@49 403
Chris@49 404
Chris@49 405 template<typename eT>
Chris@49 406 inline
Chris@49 407 void
Chris@49 408 subview_cube<eT>::operator%= (const subview_cube<eT>& x_in)
Chris@49 409 {
Chris@49 410 arma_extra_debug_sigprint();
Chris@49 411
Chris@49 412 const bool overlap = check_overlap(x_in);
Chris@49 413
Chris@49 414 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
Chris@49 415 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;
Chris@49 416 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
Chris@49 417
Chris@49 418 subview_cube<eT>& t = *this;
Chris@49 419
Chris@49 420 arma_debug_assert_same_size(t, x, "element-wise multiplication");
Chris@49 421
Chris@49 422 const uword t_n_rows = t.n_rows;
Chris@49 423 const uword t_n_cols = t.n_cols;
Chris@49 424 const uword t_n_slices = t.n_slices;
Chris@49 425
Chris@49 426 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 427 {
Chris@49 428 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 429 {
Chris@49 430 arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 431 }
Chris@49 432 }
Chris@49 433
Chris@49 434 if(overlap)
Chris@49 435 {
Chris@49 436 delete tmp_subview_cube;
Chris@49 437 delete tmp_cube;
Chris@49 438 }
Chris@49 439
Chris@49 440 }
Chris@49 441
Chris@49 442
Chris@49 443
Chris@49 444 template<typename eT>
Chris@49 445 inline
Chris@49 446 void
Chris@49 447 subview_cube<eT>::operator/= (const subview_cube<eT>& x_in)
Chris@49 448 {
Chris@49 449 arma_extra_debug_sigprint();
Chris@49 450
Chris@49 451 const bool overlap = check_overlap(x_in);
Chris@49 452
Chris@49 453 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
Chris@49 454 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;
Chris@49 455 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
Chris@49 456
Chris@49 457 subview_cube<eT>& t = *this;
Chris@49 458
Chris@49 459 arma_debug_assert_same_size(t, x, "element-wise division");
Chris@49 460
Chris@49 461 const uword t_n_rows = t.n_rows;
Chris@49 462 const uword t_n_cols = t.n_cols;
Chris@49 463 const uword t_n_slices = t.n_slices;
Chris@49 464
Chris@49 465 for(uword slice = 0; slice < t_n_slices; ++slice)
Chris@49 466 {
Chris@49 467 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 468 {
Chris@49 469 arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
Chris@49 470 }
Chris@49 471 }
Chris@49 472
Chris@49 473 if(overlap)
Chris@49 474 {
Chris@49 475 delete tmp_subview_cube;
Chris@49 476 delete tmp_cube;
Chris@49 477 }
Chris@49 478
Chris@49 479 }
Chris@49 480
Chris@49 481
Chris@49 482
Chris@49 483 template<typename eT>
Chris@49 484 template<typename T1>
Chris@49 485 inline
Chris@49 486 void
Chris@49 487 subview_cube<eT>::operator= (const Base<eT,T1>& in)
Chris@49 488 {
Chris@49 489 arma_extra_debug_sigprint();
Chris@49 490
Chris@49 491 const unwrap<T1> tmp(in.get_ref());
Chris@49 492
Chris@49 493 const Mat<eT>& x = tmp.M;
Chris@49 494 subview_cube<eT>& t = *this;
Chris@49 495
Chris@49 496 const uword t_n_rows = t.n_rows;
Chris@49 497 const uword t_n_cols = t.n_cols;
Chris@49 498 const uword t_n_slices = t.n_slices;
Chris@49 499
Chris@49 500 const uword x_n_rows = x.n_rows;
Chris@49 501 const uword x_n_cols = x.n_cols;
Chris@49 502
Chris@49 503 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
Chris@49 504 {
Chris@49 505 // interpret the matrix as a cube with one slice
Chris@49 506
Chris@49 507 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 508 {
Chris@49 509 arrayops::copy( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
Chris@49 510 }
Chris@49 511 }
Chris@49 512 else
Chris@49 513 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
Chris@49 514 {
Chris@49 515 for(uword i=0; i < t_n_slices; ++i)
Chris@49 516 {
Chris@49 517 arrayops::copy( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
Chris@49 518 }
Chris@49 519 }
Chris@49 520 else
Chris@49 521 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
Chris@49 522 {
Chris@49 523 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
Chris@49 524
Chris@49 525 const uword t_aux_row1 = t.aux_row1;
Chris@49 526 const uword t_aux_col1 = t.aux_col1;
Chris@49 527 const uword t_aux_slice1 = t.aux_slice1;
Chris@49 528
Chris@49 529 for(uword slice=0; slice < t_n_slices; ++slice)
Chris@49 530 {
Chris@49 531 const uword mod_slice = t_aux_slice1 + slice;
Chris@49 532
Chris@49 533 const eT* x_colptr = x.colptr(slice);
Chris@49 534
Chris@49 535 uword i,j;
Chris@49 536 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
Chris@49 537 {
Chris@49 538 const eT tmp_i = x_colptr[i];
Chris@49 539 const eT tmp_j = x_colptr[j];
Chris@49 540
Chris@49 541 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = tmp_i;
Chris@49 542 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) = tmp_j;
Chris@49 543 }
Chris@49 544
Chris@49 545 if(i < t_n_cols)
Chris@49 546 {
Chris@49 547 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = x_colptr[i];
Chris@49 548 }
Chris@49 549 }
Chris@49 550 }
Chris@49 551 else
Chris@49 552 {
Chris@49 553 if(arma_config::debug == true)
Chris@49 554 {
Chris@49 555 arma_stop( arma_incompat_size_string(t, x, "copy into subcube") );
Chris@49 556 }
Chris@49 557 }
Chris@49 558 }
Chris@49 559
Chris@49 560
Chris@49 561
Chris@49 562 template<typename eT>
Chris@49 563 template<typename T1>
Chris@49 564 inline
Chris@49 565 void
Chris@49 566 subview_cube<eT>::operator+= (const Base<eT,T1>& in)
Chris@49 567 {
Chris@49 568 arma_extra_debug_sigprint();
Chris@49 569
Chris@49 570 const unwrap<T1> tmp(in.get_ref());
Chris@49 571
Chris@49 572 const Mat<eT>& x = tmp.M;
Chris@49 573 subview_cube<eT>& t = *this;
Chris@49 574
Chris@49 575 const uword t_n_rows = t.n_rows;
Chris@49 576 const uword t_n_cols = t.n_cols;
Chris@49 577 const uword t_n_slices = t.n_slices;
Chris@49 578
Chris@49 579 const uword x_n_rows = x.n_rows;
Chris@49 580 const uword x_n_cols = x.n_cols;
Chris@49 581
Chris@49 582 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
Chris@49 583 {
Chris@49 584 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 585 {
Chris@49 586 arrayops::inplace_plus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
Chris@49 587 }
Chris@49 588 }
Chris@49 589 else
Chris@49 590 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
Chris@49 591 {
Chris@49 592 for(uword i=0; i < t_n_slices; ++i)
Chris@49 593 {
Chris@49 594 arrayops::inplace_plus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
Chris@49 595 }
Chris@49 596 }
Chris@49 597 else
Chris@49 598 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
Chris@49 599 {
Chris@49 600 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
Chris@49 601
Chris@49 602 const uword t_aux_row1 = t.aux_row1;
Chris@49 603 const uword t_aux_col1 = t.aux_col1;
Chris@49 604 const uword t_aux_slice1 = t.aux_slice1;
Chris@49 605
Chris@49 606 for(uword slice=0; slice < t_n_slices; ++slice)
Chris@49 607 {
Chris@49 608 const uword mod_slice = t_aux_slice1 + slice;
Chris@49 609
Chris@49 610 const eT* x_colptr = x.colptr(slice);
Chris@49 611
Chris@49 612 uword i,j;
Chris@49 613 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
Chris@49 614 {
Chris@49 615 const eT tmp_i = x_colptr[i];
Chris@49 616 const eT tmp_j = x_colptr[j];
Chris@49 617
Chris@49 618 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += tmp_i;
Chris@49 619 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) += tmp_j;
Chris@49 620 }
Chris@49 621
Chris@49 622 if(i < t_n_cols)
Chris@49 623 {
Chris@49 624 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += x_colptr[i];
Chris@49 625 }
Chris@49 626 }
Chris@49 627 }
Chris@49 628 else
Chris@49 629 {
Chris@49 630 if(arma_config::debug == true)
Chris@49 631 {
Chris@49 632 arma_stop( arma_incompat_size_string(t, x, "addition") );
Chris@49 633 }
Chris@49 634 }
Chris@49 635 }
Chris@49 636
Chris@49 637
Chris@49 638
Chris@49 639 template<typename eT>
Chris@49 640 template<typename T1>
Chris@49 641 inline
Chris@49 642 void
Chris@49 643 subview_cube<eT>::operator-= (const Base<eT,T1>& in)
Chris@49 644 {
Chris@49 645 arma_extra_debug_sigprint();
Chris@49 646
Chris@49 647 const unwrap<T1> tmp(in.get_ref());
Chris@49 648
Chris@49 649 const Mat<eT>& x = tmp.M;
Chris@49 650 subview_cube<eT>& t = *this;
Chris@49 651
Chris@49 652 const uword t_n_rows = t.n_rows;
Chris@49 653 const uword t_n_cols = t.n_cols;
Chris@49 654 const uword t_n_slices = t.n_slices;
Chris@49 655
Chris@49 656 const uword x_n_rows = x.n_rows;
Chris@49 657 const uword x_n_cols = x.n_cols;
Chris@49 658
Chris@49 659 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
Chris@49 660 {
Chris@49 661 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 662 {
Chris@49 663 arrayops::inplace_minus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
Chris@49 664 }
Chris@49 665 }
Chris@49 666 else
Chris@49 667 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
Chris@49 668 {
Chris@49 669 for(uword i=0; i < t_n_slices; ++i)
Chris@49 670 {
Chris@49 671 arrayops::inplace_minus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
Chris@49 672 }
Chris@49 673 }
Chris@49 674 else
Chris@49 675 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
Chris@49 676 {
Chris@49 677 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
Chris@49 678
Chris@49 679 const uword t_aux_row1 = t.aux_row1;
Chris@49 680 const uword t_aux_col1 = t.aux_col1;
Chris@49 681 const uword t_aux_slice1 = t.aux_slice1;
Chris@49 682
Chris@49 683 for(uword slice=0; slice < t_n_slices; ++slice)
Chris@49 684 {
Chris@49 685 const uword mod_slice = t_aux_slice1 + slice;
Chris@49 686
Chris@49 687 const eT* x_colptr = x.colptr(slice);
Chris@49 688
Chris@49 689 uword i,j;
Chris@49 690 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
Chris@49 691 {
Chris@49 692 const eT tmp_i = x_colptr[i];
Chris@49 693 const eT tmp_j = x_colptr[j];
Chris@49 694
Chris@49 695 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= tmp_i;
Chris@49 696 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) -= tmp_j;
Chris@49 697 }
Chris@49 698
Chris@49 699 if(i < t_n_cols)
Chris@49 700 {
Chris@49 701 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= x_colptr[i];
Chris@49 702 }
Chris@49 703 }
Chris@49 704 }
Chris@49 705 else
Chris@49 706 {
Chris@49 707 if(arma_config::debug == true)
Chris@49 708 {
Chris@49 709 arma_stop( arma_incompat_size_string(t, x, "subtraction") );
Chris@49 710 }
Chris@49 711 }
Chris@49 712 }
Chris@49 713
Chris@49 714
Chris@49 715
Chris@49 716 template<typename eT>
Chris@49 717 template<typename T1>
Chris@49 718 inline
Chris@49 719 void
Chris@49 720 subview_cube<eT>::operator%= (const Base<eT,T1>& in)
Chris@49 721 {
Chris@49 722 arma_extra_debug_sigprint();
Chris@49 723
Chris@49 724 const unwrap<T1> tmp(in.get_ref());
Chris@49 725
Chris@49 726 const Mat<eT>& x = tmp.M;
Chris@49 727 subview_cube<eT>& t = *this;
Chris@49 728
Chris@49 729 const uword t_n_rows = t.n_rows;
Chris@49 730 const uword t_n_cols = t.n_cols;
Chris@49 731 const uword t_n_slices = t.n_slices;
Chris@49 732
Chris@49 733 const uword x_n_rows = x.n_rows;
Chris@49 734 const uword x_n_cols = x.n_cols;
Chris@49 735
Chris@49 736 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
Chris@49 737 {
Chris@49 738 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 739 {
Chris@49 740 arrayops::inplace_mul( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
Chris@49 741 }
Chris@49 742 }
Chris@49 743 else
Chris@49 744 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
Chris@49 745 {
Chris@49 746 for(uword i=0; i < t_n_slices; ++i)
Chris@49 747 {
Chris@49 748 arrayops::inplace_mul( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
Chris@49 749 }
Chris@49 750 }
Chris@49 751 else
Chris@49 752 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
Chris@49 753 {
Chris@49 754 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
Chris@49 755
Chris@49 756 const uword t_aux_row1 = t.aux_row1;
Chris@49 757 const uword t_aux_col1 = t.aux_col1;
Chris@49 758 const uword t_aux_slice1 = t.aux_slice1;
Chris@49 759
Chris@49 760 for(uword slice=0; slice < t_n_slices; ++slice)
Chris@49 761 {
Chris@49 762 const uword mod_slice = t_aux_slice1 + slice;
Chris@49 763
Chris@49 764 const eT* x_colptr = x.colptr(slice);
Chris@49 765
Chris@49 766 uword i,j;
Chris@49 767 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
Chris@49 768 {
Chris@49 769 const eT tmp_i = x_colptr[i];
Chris@49 770 const eT tmp_j = x_colptr[j];
Chris@49 771
Chris@49 772 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= tmp_i;
Chris@49 773 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) *= tmp_j;
Chris@49 774 }
Chris@49 775
Chris@49 776 if(i < t_n_cols)
Chris@49 777 {
Chris@49 778 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= x_colptr[i];
Chris@49 779 }
Chris@49 780 }
Chris@49 781 }
Chris@49 782 else
Chris@49 783 {
Chris@49 784 if(arma_config::debug == true)
Chris@49 785 {
Chris@49 786 arma_stop( arma_incompat_size_string(t, x, "element-wise multiplication") );
Chris@49 787 }
Chris@49 788 }
Chris@49 789 }
Chris@49 790
Chris@49 791
Chris@49 792
Chris@49 793 template<typename eT>
Chris@49 794 template<typename T1>
Chris@49 795 inline
Chris@49 796 void
Chris@49 797 subview_cube<eT>::operator/= (const Base<eT,T1>& in)
Chris@49 798 {
Chris@49 799 arma_extra_debug_sigprint();
Chris@49 800
Chris@49 801 const unwrap<T1> tmp(in.get_ref());
Chris@49 802
Chris@49 803 const Mat<eT>& x = tmp.M;
Chris@49 804 subview_cube<eT>& t = *this;
Chris@49 805
Chris@49 806 const uword t_n_rows = t.n_rows;
Chris@49 807 const uword t_n_cols = t.n_cols;
Chris@49 808 const uword t_n_slices = t.n_slices;
Chris@49 809
Chris@49 810 const uword x_n_rows = x.n_rows;
Chris@49 811 const uword x_n_cols = x.n_cols;
Chris@49 812
Chris@49 813 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
Chris@49 814 {
Chris@49 815 for(uword col = 0; col < t_n_cols; ++col)
Chris@49 816 {
Chris@49 817 arrayops::inplace_div( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
Chris@49 818 }
Chris@49 819 }
Chris@49 820 else
Chris@49 821 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
Chris@49 822 {
Chris@49 823 for(uword i=0; i < t_n_slices; ++i)
Chris@49 824 {
Chris@49 825 arrayops::inplace_div( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
Chris@49 826 }
Chris@49 827 }
Chris@49 828 else
Chris@49 829 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
Chris@49 830 {
Chris@49 831 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
Chris@49 832
Chris@49 833 const uword t_aux_row1 = t.aux_row1;
Chris@49 834 const uword t_aux_col1 = t.aux_col1;
Chris@49 835 const uword t_aux_slice1 = t.aux_slice1;
Chris@49 836
Chris@49 837 for(uword slice=0; slice < t_n_slices; ++slice)
Chris@49 838 {
Chris@49 839 const uword mod_slice = t_aux_slice1 + slice;
Chris@49 840
Chris@49 841 const eT* x_colptr = x.colptr(slice);
Chris@49 842
Chris@49 843 uword i,j;
Chris@49 844 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
Chris@49 845 {
Chris@49 846 const eT tmp_i = x_colptr[i];
Chris@49 847 const eT tmp_j = x_colptr[j];
Chris@49 848
Chris@49 849 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= tmp_i;
Chris@49 850 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) /= tmp_j;
Chris@49 851 }
Chris@49 852
Chris@49 853 if(i < t_n_cols)
Chris@49 854 {
Chris@49 855 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= x_colptr[i];
Chris@49 856 }
Chris@49 857 }
Chris@49 858 }
Chris@49 859 else
Chris@49 860 {
Chris@49 861 if(arma_config::debug == true)
Chris@49 862 {
Chris@49 863 arma_stop( arma_incompat_size_string(t, x, "element-wise division") );
Chris@49 864 }
Chris@49 865 }
Chris@49 866 }
Chris@49 867
Chris@49 868
Chris@49 869
Chris@49 870 //! transform each element in the subview using a functor
Chris@49 871 template<typename eT>
Chris@49 872 template<typename functor>
Chris@49 873 inline
Chris@49 874 void
Chris@49 875 subview_cube<eT>::transform(functor F)
Chris@49 876 {
Chris@49 877 arma_extra_debug_sigprint();
Chris@49 878
Chris@49 879 Cube<eT>& Q = const_cast< Cube<eT>& >(m);
Chris@49 880
Chris@49 881 const uword start_col = aux_col1;
Chris@49 882 const uword start_row = aux_row1;
Chris@49 883 const uword start_slice = aux_slice1;
Chris@49 884
Chris@49 885 const uword end_col_plus1 = start_col + n_cols;
Chris@49 886 const uword end_row_plus1 = start_row + n_rows;
Chris@49 887 const uword end_slice_plus1 = start_slice + n_slices;
Chris@49 888
Chris@49 889 for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice)
Chris@49 890 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol )
Chris@49 891 for(uword urow = start_row; urow < end_row_plus1; ++urow )
Chris@49 892 {
Chris@49 893 Q.at(urow, ucol, uslice) = eT( F( Q.at(urow, ucol, uslice) ) );
Chris@49 894 }
Chris@49 895 }
Chris@49 896
Chris@49 897
Chris@49 898
Chris@49 899 //! imbue (fill) the subview with values provided by a functor
Chris@49 900 template<typename eT>
Chris@49 901 template<typename functor>
Chris@49 902 inline
Chris@49 903 void
Chris@49 904 subview_cube<eT>::imbue(functor F)
Chris@49 905 {
Chris@49 906 arma_extra_debug_sigprint();
Chris@49 907
Chris@49 908 Cube<eT>& Q = const_cast< Cube<eT>& >(m);
Chris@49 909
Chris@49 910 const uword start_col = aux_col1;
Chris@49 911 const uword start_row = aux_row1;
Chris@49 912 const uword start_slice = aux_slice1;
Chris@49 913
Chris@49 914 const uword end_col_plus1 = start_col + n_cols;
Chris@49 915 const uword end_row_plus1 = start_row + n_rows;
Chris@49 916 const uword end_slice_plus1 = start_slice + n_slices;
Chris@49 917
Chris@49 918 for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice)
Chris@49 919 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol )
Chris@49 920 for(uword urow = start_row; urow < end_row_plus1; ++urow )
Chris@49 921 {
Chris@49 922 Q.at(urow, ucol, uslice) = eT( F() );
Chris@49 923 }
Chris@49 924 }
Chris@49 925
Chris@49 926
Chris@49 927
Chris@49 928 template<typename eT>
Chris@49 929 inline
Chris@49 930 void
Chris@49 931 subview_cube<eT>::fill(const eT val)
Chris@49 932 {
Chris@49 933 arma_extra_debug_sigprint();
Chris@49 934
Chris@49 935 const uword local_n_rows = n_rows;
Chris@49 936 const uword local_n_cols = n_cols;
Chris@49 937 const uword local_n_slices = n_slices;
Chris@49 938
Chris@49 939 for(uword slice = 0; slice < local_n_slices; ++slice)
Chris@49 940 {
Chris@49 941 for(uword col = 0; col < local_n_cols; ++col)
Chris@49 942 {
Chris@49 943 arrayops::inplace_set( slice_colptr(slice,col), val, local_n_rows );
Chris@49 944 }
Chris@49 945 }
Chris@49 946
Chris@49 947 }
Chris@49 948
Chris@49 949
Chris@49 950
Chris@49 951 template<typename eT>
Chris@49 952 inline
Chris@49 953 void
Chris@49 954 subview_cube<eT>::zeros()
Chris@49 955 {
Chris@49 956 arma_extra_debug_sigprint();
Chris@49 957
Chris@49 958 fill(eT(0));
Chris@49 959 }
Chris@49 960
Chris@49 961
Chris@49 962
Chris@49 963 template<typename eT>
Chris@49 964 inline
Chris@49 965 void
Chris@49 966 subview_cube<eT>::ones()
Chris@49 967 {
Chris@49 968 arma_extra_debug_sigprint();
Chris@49 969
Chris@49 970 fill(eT(1));
Chris@49 971 }
Chris@49 972
Chris@49 973
Chris@49 974
Chris@49 975 template<typename eT>
Chris@49 976 inline
Chris@49 977 eT
Chris@49 978 subview_cube<eT>::at_alt(const uword i) const
Chris@49 979 {
Chris@49 980 return operator[](i);
Chris@49 981 }
Chris@49 982
Chris@49 983
Chris@49 984
Chris@49 985 template<typename eT>
Chris@49 986 inline
Chris@49 987 eT&
Chris@49 988 subview_cube<eT>::operator[](const uword i)
Chris@49 989 {
Chris@49 990 const uword in_slice = i / n_elem_slice;
Chris@49 991 const uword offset = in_slice * n_elem_slice;
Chris@49 992 const uword j = i - offset;
Chris@49 993
Chris@49 994 const uword in_col = j / n_rows;
Chris@49 995 const uword in_row = j % n_rows;
Chris@49 996
Chris@49 997 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 998
Chris@49 999 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
Chris@49 1000 }
Chris@49 1001
Chris@49 1002
Chris@49 1003
Chris@49 1004 template<typename eT>
Chris@49 1005 inline
Chris@49 1006 eT
Chris@49 1007 subview_cube<eT>::operator[](const uword i) const
Chris@49 1008 {
Chris@49 1009 const uword in_slice = i / n_elem_slice;
Chris@49 1010 const uword offset = in_slice * n_elem_slice;
Chris@49 1011 const uword j = i - offset;
Chris@49 1012
Chris@49 1013 const uword in_col = j / n_rows;
Chris@49 1014 const uword in_row = j % n_rows;
Chris@49 1015
Chris@49 1016 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1017
Chris@49 1018 return m.mem[index];
Chris@49 1019 }
Chris@49 1020
Chris@49 1021
Chris@49 1022
Chris@49 1023 template<typename eT>
Chris@49 1024 inline
Chris@49 1025 eT&
Chris@49 1026 subview_cube<eT>::operator()(const uword i)
Chris@49 1027 {
Chris@49 1028 arma_debug_check( (i >= n_elem), "subview_cube::operator(): index out of bounds");
Chris@49 1029
Chris@49 1030 const uword in_slice = i / n_elem_slice;
Chris@49 1031 const uword offset = in_slice * n_elem_slice;
Chris@49 1032 const uword j = i - offset;
Chris@49 1033
Chris@49 1034 const uword in_col = j / n_rows;
Chris@49 1035 const uword in_row = j % n_rows;
Chris@49 1036
Chris@49 1037 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1038
Chris@49 1039 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
Chris@49 1040 }
Chris@49 1041
Chris@49 1042
Chris@49 1043
Chris@49 1044 template<typename eT>
Chris@49 1045 inline
Chris@49 1046 eT
Chris@49 1047 subview_cube<eT>::operator()(const uword i) const
Chris@49 1048 {
Chris@49 1049 arma_debug_check( (i >= n_elem), "subview_cube::operator(): index out of bounds");
Chris@49 1050
Chris@49 1051 const uword in_slice = i / n_elem_slice;
Chris@49 1052 const uword offset = in_slice * n_elem_slice;
Chris@49 1053 const uword j = i - offset;
Chris@49 1054
Chris@49 1055 const uword in_col = j / n_rows;
Chris@49 1056 const uword in_row = j % n_rows;
Chris@49 1057
Chris@49 1058 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1059
Chris@49 1060 return m.mem[index];
Chris@49 1061 }
Chris@49 1062
Chris@49 1063
Chris@49 1064
Chris@49 1065 template<typename eT>
Chris@49 1066 arma_inline
Chris@49 1067 eT&
Chris@49 1068 subview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice)
Chris@49 1069 {
Chris@49 1070 arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds");
Chris@49 1071
Chris@49 1072 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1073
Chris@49 1074 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
Chris@49 1075 }
Chris@49 1076
Chris@49 1077
Chris@49 1078
Chris@49 1079 template<typename eT>
Chris@49 1080 arma_inline
Chris@49 1081 eT
Chris@49 1082 subview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice) const
Chris@49 1083 {
Chris@49 1084 arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds");
Chris@49 1085
Chris@49 1086 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1087
Chris@49 1088 return m.mem[index];
Chris@49 1089 }
Chris@49 1090
Chris@49 1091
Chris@49 1092
Chris@49 1093 template<typename eT>
Chris@49 1094 arma_inline
Chris@49 1095 eT&
Chris@49 1096 subview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice)
Chris@49 1097 {
Chris@49 1098 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1099
Chris@49 1100 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
Chris@49 1101 }
Chris@49 1102
Chris@49 1103
Chris@49 1104
Chris@49 1105 template<typename eT>
Chris@49 1106 arma_inline
Chris@49 1107 eT
Chris@49 1108 subview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice) const
Chris@49 1109 {
Chris@49 1110 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
Chris@49 1111
Chris@49 1112 return m.mem[index];
Chris@49 1113 }
Chris@49 1114
Chris@49 1115
Chris@49 1116
Chris@49 1117 template<typename eT>
Chris@49 1118 arma_inline
Chris@49 1119 eT*
Chris@49 1120 subview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col)
Chris@49 1121 {
Chris@49 1122 return & access::rw((const_cast< Cube<eT>& >(m)).mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ]);
Chris@49 1123 }
Chris@49 1124
Chris@49 1125
Chris@49 1126
Chris@49 1127 template<typename eT>
Chris@49 1128 arma_inline
Chris@49 1129 const eT*
Chris@49 1130 subview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col) const
Chris@49 1131 {
Chris@49 1132 return & m.mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ];
Chris@49 1133 }
Chris@49 1134
Chris@49 1135
Chris@49 1136
Chris@49 1137 template<typename eT>
Chris@49 1138 inline
Chris@49 1139 bool
Chris@49 1140 subview_cube<eT>::check_overlap(const subview_cube<eT>& x) const
Chris@49 1141 {
Chris@49 1142 const subview_cube<eT>& t = *this;
Chris@49 1143
Chris@49 1144 if(&t.m != &x.m)
Chris@49 1145 {
Chris@49 1146 return false;
Chris@49 1147 }
Chris@49 1148 else
Chris@49 1149 {
Chris@49 1150 if( (t.n_elem == 0) || (x.n_elem == 0) )
Chris@49 1151 {
Chris@49 1152 return false;
Chris@49 1153 }
Chris@49 1154 else
Chris@49 1155 {
Chris@49 1156 const uword t_row_start = t.aux_row1;
Chris@49 1157 const uword t_row_end_p1 = t_row_start + t.n_rows;
Chris@49 1158
Chris@49 1159 const uword t_col_start = t.aux_col1;
Chris@49 1160 const uword t_col_end_p1 = t_col_start + t.n_cols;
Chris@49 1161
Chris@49 1162 const uword t_slice_start = t.aux_slice1;
Chris@49 1163 const uword t_slice_end_p1 = t_slice_start + t.n_slices;
Chris@49 1164
Chris@49 1165
Chris@49 1166 const uword x_row_start = x.aux_row1;
Chris@49 1167 const uword x_row_end_p1 = x_row_start + x.n_rows;
Chris@49 1168
Chris@49 1169 const uword x_col_start = x.aux_col1;
Chris@49 1170 const uword x_col_end_p1 = x_col_start + x.n_cols;
Chris@49 1171
Chris@49 1172 const uword x_slice_start = x.aux_slice1;
Chris@49 1173 const uword x_slice_end_p1 = x_slice_start + x.n_slices;
Chris@49 1174
Chris@49 1175
Chris@49 1176 const bool outside_rows = ( (x_row_start >= t_row_end_p1 ) || (t_row_start >= x_row_end_p1 ) );
Chris@49 1177 const bool outside_cols = ( (x_col_start >= t_col_end_p1 ) || (t_col_start >= x_col_end_p1 ) );
Chris@49 1178 const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) );
Chris@49 1179
Chris@49 1180 return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) );
Chris@49 1181 }
Chris@49 1182 }
Chris@49 1183 }
Chris@49 1184
Chris@49 1185
Chris@49 1186
Chris@49 1187 template<typename eT>
Chris@49 1188 inline
Chris@49 1189 bool
Chris@49 1190 subview_cube<eT>::check_overlap(const Mat<eT>& x) const
Chris@49 1191 {
Chris@49 1192 const subview_cube<eT>& t = *this;
Chris@49 1193
Chris@49 1194 const uword t_aux_slice1 = t.aux_slice1;
Chris@49 1195 const uword t_aux_slice2_plus_1 = t_aux_slice1 + t.n_slices;
Chris@49 1196
Chris@49 1197 for(uword slice = t_aux_slice1; slice < t_aux_slice2_plus_1; ++slice)
Chris@49 1198 {
Chris@49 1199 const Mat<eT>& y = *(t.m.mat_ptrs[slice]);
Chris@49 1200
Chris@49 1201 if( x.memptr() == y.memptr() )
Chris@49 1202 {
Chris@49 1203 return true;
Chris@49 1204 }
Chris@49 1205 }
Chris@49 1206
Chris@49 1207 return false;
Chris@49 1208 }
Chris@49 1209
Chris@49 1210
Chris@49 1211
Chris@49 1212 //! cube X = Y.subcube(...)
Chris@49 1213 template<typename eT>
Chris@49 1214 inline
Chris@49 1215 void
Chris@49 1216 subview_cube<eT>::extract(Cube<eT>& out, const subview_cube<eT>& in)
Chris@49 1217 {
Chris@49 1218 arma_extra_debug_sigprint();
Chris@49 1219
Chris@49 1220 // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing;
Chris@49 1221 // size setting and alias checking is done by either the Cube contructor or operator=()
Chris@49 1222
Chris@49 1223 const uword n_rows = in.n_rows;
Chris@49 1224 const uword n_cols = in.n_cols;
Chris@49 1225 const uword n_slices = in.n_slices;
Chris@49 1226
Chris@49 1227 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);
Chris@49 1228
Chris@49 1229
Chris@49 1230 for(uword slice = 0; slice < n_slices; ++slice)
Chris@49 1231 {
Chris@49 1232 for(uword col = 0; col < n_cols; ++col)
Chris@49 1233 {
Chris@49 1234 arrayops::copy( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
Chris@49 1235 }
Chris@49 1236 }
Chris@49 1237 }
Chris@49 1238
Chris@49 1239
Chris@49 1240
Chris@49 1241 //! cube X += Y.subcube(...)
Chris@49 1242 template<typename eT>
Chris@49 1243 inline
Chris@49 1244 void
Chris@49 1245 subview_cube<eT>::plus_inplace(Cube<eT>& out, const subview_cube<eT>& in)
Chris@49 1246 {
Chris@49 1247 arma_extra_debug_sigprint();
Chris@49 1248
Chris@49 1249 arma_debug_assert_same_size(out, in, "addition");
Chris@49 1250
Chris@49 1251 const uword n_rows = out.n_rows;
Chris@49 1252 const uword n_cols = out.n_cols;
Chris@49 1253 const uword n_slices = out.n_slices;
Chris@49 1254
Chris@49 1255 for(uword slice = 0; slice<n_slices; ++slice)
Chris@49 1256 {
Chris@49 1257 for(uword col = 0; col<n_cols; ++col)
Chris@49 1258 {
Chris@49 1259 arrayops::inplace_plus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
Chris@49 1260 }
Chris@49 1261 }
Chris@49 1262 }
Chris@49 1263
Chris@49 1264
Chris@49 1265
Chris@49 1266 //! cube X -= Y.subcube(...)
Chris@49 1267 template<typename eT>
Chris@49 1268 inline
Chris@49 1269 void
Chris@49 1270 subview_cube<eT>::minus_inplace(Cube<eT>& out, const subview_cube<eT>& in)
Chris@49 1271 {
Chris@49 1272 arma_extra_debug_sigprint();
Chris@49 1273
Chris@49 1274 arma_debug_assert_same_size(out, in, "subtraction");
Chris@49 1275
Chris@49 1276 const uword n_rows = out.n_rows;
Chris@49 1277 const uword n_cols = out.n_cols;
Chris@49 1278 const uword n_slices = out.n_slices;
Chris@49 1279
Chris@49 1280 for(uword slice = 0; slice<n_slices; ++slice)
Chris@49 1281 {
Chris@49 1282 for(uword col = 0; col<n_cols; ++col)
Chris@49 1283 {
Chris@49 1284 arrayops::inplace_minus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
Chris@49 1285 }
Chris@49 1286 }
Chris@49 1287 }
Chris@49 1288
Chris@49 1289
Chris@49 1290
Chris@49 1291 //! cube X %= Y.subcube(...)
Chris@49 1292 template<typename eT>
Chris@49 1293 inline
Chris@49 1294 void
Chris@49 1295 subview_cube<eT>::schur_inplace(Cube<eT>& out, const subview_cube<eT>& in)
Chris@49 1296 {
Chris@49 1297 arma_extra_debug_sigprint();
Chris@49 1298
Chris@49 1299 arma_debug_assert_same_size(out, in, "element-wise multiplication");
Chris@49 1300
Chris@49 1301 const uword n_rows = out.n_rows;
Chris@49 1302 const uword n_cols = out.n_cols;
Chris@49 1303 const uword n_slices = out.n_slices;
Chris@49 1304
Chris@49 1305 for(uword slice = 0; slice<n_slices; ++slice)
Chris@49 1306 {
Chris@49 1307 for(uword col = 0; col<n_cols; ++col)
Chris@49 1308 {
Chris@49 1309 arrayops::inplace_mul( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
Chris@49 1310 }
Chris@49 1311 }
Chris@49 1312 }
Chris@49 1313
Chris@49 1314
Chris@49 1315
Chris@49 1316 //! cube X /= Y.subcube(...)
Chris@49 1317 template<typename eT>
Chris@49 1318 inline
Chris@49 1319 void
Chris@49 1320 subview_cube<eT>::div_inplace(Cube<eT>& out, const subview_cube<eT>& in)
Chris@49 1321 {
Chris@49 1322 arma_extra_debug_sigprint();
Chris@49 1323
Chris@49 1324 arma_debug_assert_same_size(out, in, "element-wise division");
Chris@49 1325
Chris@49 1326 const uword n_rows = out.n_rows;
Chris@49 1327 const uword n_cols = out.n_cols;
Chris@49 1328 const uword n_slices = out.n_slices;
Chris@49 1329
Chris@49 1330 for(uword slice = 0; slice<n_slices; ++slice)
Chris@49 1331 {
Chris@49 1332 for(uword col = 0; col<n_cols; ++col)
Chris@49 1333 {
Chris@49 1334 arrayops::inplace_div( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
Chris@49 1335 }
Chris@49 1336 }
Chris@49 1337 }
Chris@49 1338
Chris@49 1339
Chris@49 1340
Chris@49 1341 //! mat X = Y.subcube(...)
Chris@49 1342 template<typename eT>
Chris@49 1343 inline
Chris@49 1344 void
Chris@49 1345 subview_cube<eT>::extract(Mat<eT>& out, const subview_cube<eT>& in)
Chris@49 1346 {
Chris@49 1347 arma_extra_debug_sigprint();
Chris@49 1348
Chris@49 1349 arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false);
Chris@49 1350
Chris@49 1351 const uword in_n_rows = in.n_rows;
Chris@49 1352 const uword in_n_cols = in.n_cols;
Chris@49 1353 const uword in_n_slices = in.n_slices;
Chris@49 1354
Chris@49 1355 const uword out_vec_state = out.vec_state;
Chris@49 1356
Chris@49 1357 if(in_n_slices == 1)
Chris@49 1358 {
Chris@49 1359 out.set_size(in_n_rows, in_n_cols);
Chris@49 1360
Chris@49 1361 for(uword col=0; col < in_n_cols; ++col)
Chris@49 1362 {
Chris@49 1363 arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
Chris@49 1364 }
Chris@49 1365 }
Chris@49 1366 else
Chris@49 1367 {
Chris@49 1368 if(out_vec_state == 0)
Chris@49 1369 {
Chris@49 1370 if(in_n_cols == 1)
Chris@49 1371 {
Chris@49 1372 out.set_size(in_n_rows, in_n_slices);
Chris@49 1373
Chris@49 1374 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1375 {
Chris@49 1376 arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1377 }
Chris@49 1378 }
Chris@49 1379 else
Chris@49 1380 if(in_n_rows == 1)
Chris@49 1381 {
Chris@49 1382 const Cube<eT>& Q = in.m;
Chris@49 1383
Chris@49 1384 const uword in_aux_row1 = in.aux_row1;
Chris@49 1385 const uword in_aux_col1 = in.aux_col1;
Chris@49 1386 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1387
Chris@49 1388 out.set_size(in_n_cols, in_n_slices);
Chris@49 1389
Chris@49 1390 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1391 {
Chris@49 1392 const uword mod_slice = in_aux_slice1 + slice;
Chris@49 1393
Chris@49 1394 eT* out_colptr = out.colptr(slice);
Chris@49 1395
Chris@49 1396 uword i,j;
Chris@49 1397 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1398 {
Chris@49 1399 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1400 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
Chris@49 1401
Chris@49 1402 out_colptr[i] = tmp_i;
Chris@49 1403 out_colptr[j] = tmp_j;
Chris@49 1404 }
Chris@49 1405
Chris@49 1406 if(i < in_n_cols)
Chris@49 1407 {
Chris@49 1408 out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1409 }
Chris@49 1410 }
Chris@49 1411 }
Chris@49 1412 }
Chris@49 1413 else
Chris@49 1414 {
Chris@49 1415 out.set_size(in_n_slices);
Chris@49 1416
Chris@49 1417 eT* out_mem = out.memptr();
Chris@49 1418
Chris@49 1419 const Cube<eT>& Q = in.m;
Chris@49 1420
Chris@49 1421 const uword in_aux_row1 = in.aux_row1;
Chris@49 1422 const uword in_aux_col1 = in.aux_col1;
Chris@49 1423 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1424
Chris@49 1425 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1426 {
Chris@49 1427 out_mem[i] = Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
Chris@49 1428 }
Chris@49 1429 }
Chris@49 1430 }
Chris@49 1431 }
Chris@49 1432
Chris@49 1433
Chris@49 1434
Chris@49 1435 //! mat X += Y.subcube(...)
Chris@49 1436 template<typename eT>
Chris@49 1437 inline
Chris@49 1438 void
Chris@49 1439 subview_cube<eT>::plus_inplace(Mat<eT>& out, const subview_cube<eT>& in)
Chris@49 1440 {
Chris@49 1441 arma_extra_debug_sigprint();
Chris@49 1442
Chris@49 1443 arma_debug_assert_cube_as_mat(out, in, "addition", true);
Chris@49 1444
Chris@49 1445 const uword in_n_rows = in.n_rows;
Chris@49 1446 const uword in_n_cols = in.n_cols;
Chris@49 1447 const uword in_n_slices = in.n_slices;
Chris@49 1448
Chris@49 1449 const uword out_n_rows = out.n_rows;
Chris@49 1450 const uword out_n_cols = out.n_cols;
Chris@49 1451 const uword out_vec_state = out.vec_state;
Chris@49 1452
Chris@49 1453 if(in_n_slices == 1)
Chris@49 1454 {
Chris@49 1455 for(uword col=0; col < in_n_cols; ++col)
Chris@49 1456 {
Chris@49 1457 arrayops::inplace_plus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
Chris@49 1458 }
Chris@49 1459 }
Chris@49 1460 else
Chris@49 1461 {
Chris@49 1462 if(out_vec_state == 0)
Chris@49 1463 {
Chris@49 1464 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1465 {
Chris@49 1466 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1467 {
Chris@49 1468 arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1469 }
Chris@49 1470 }
Chris@49 1471 else
Chris@49 1472 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1473 {
Chris@49 1474 const Cube<eT>& Q = in.m;
Chris@49 1475
Chris@49 1476 const uword in_aux_row1 = in.aux_row1;
Chris@49 1477 const uword in_aux_col1 = in.aux_col1;
Chris@49 1478 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1479
Chris@49 1480 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1481 {
Chris@49 1482 const uword mod_slice = in_aux_slice1 + slice;
Chris@49 1483
Chris@49 1484 eT* out_colptr = out.colptr(slice);
Chris@49 1485
Chris@49 1486 uword i,j;
Chris@49 1487 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1488 {
Chris@49 1489 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1490 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
Chris@49 1491
Chris@49 1492 out_colptr[i] += tmp_i;
Chris@49 1493 out_colptr[j] += tmp_j;
Chris@49 1494 }
Chris@49 1495
Chris@49 1496 if(i < in_n_cols)
Chris@49 1497 {
Chris@49 1498 out_colptr[i] += Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1499 }
Chris@49 1500 }
Chris@49 1501 }
Chris@49 1502 }
Chris@49 1503 else
Chris@49 1504 {
Chris@49 1505 eT* out_mem = out.memptr();
Chris@49 1506
Chris@49 1507 const Cube<eT>& Q = in.m;
Chris@49 1508
Chris@49 1509 const uword in_aux_row1 = in.aux_row1;
Chris@49 1510 const uword in_aux_col1 = in.aux_col1;
Chris@49 1511 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1512
Chris@49 1513 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1514 {
Chris@49 1515 out_mem[i] += Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
Chris@49 1516 }
Chris@49 1517 }
Chris@49 1518 }
Chris@49 1519 }
Chris@49 1520
Chris@49 1521
Chris@49 1522
Chris@49 1523 //! mat X -= Y.subcube(...)
Chris@49 1524 template<typename eT>
Chris@49 1525 inline
Chris@49 1526 void
Chris@49 1527 subview_cube<eT>::minus_inplace(Mat<eT>& out, const subview_cube<eT>& in)
Chris@49 1528 {
Chris@49 1529 arma_extra_debug_sigprint();
Chris@49 1530
Chris@49 1531 arma_debug_assert_cube_as_mat(out, in, "subtraction", true);
Chris@49 1532
Chris@49 1533 const uword in_n_rows = in.n_rows;
Chris@49 1534 const uword in_n_cols = in.n_cols;
Chris@49 1535 const uword in_n_slices = in.n_slices;
Chris@49 1536
Chris@49 1537 const uword out_n_rows = out.n_rows;
Chris@49 1538 const uword out_n_cols = out.n_cols;
Chris@49 1539 const uword out_vec_state = out.vec_state;
Chris@49 1540
Chris@49 1541 if(in_n_slices == 1)
Chris@49 1542 {
Chris@49 1543 for(uword col=0; col < in_n_cols; ++col)
Chris@49 1544 {
Chris@49 1545 arrayops::inplace_minus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
Chris@49 1546 }
Chris@49 1547 }
Chris@49 1548 else
Chris@49 1549 {
Chris@49 1550 if(out_vec_state == 0)
Chris@49 1551 {
Chris@49 1552 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1553 {
Chris@49 1554 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1555 {
Chris@49 1556 arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1557 }
Chris@49 1558 }
Chris@49 1559 else
Chris@49 1560 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1561 {
Chris@49 1562 const Cube<eT>& Q = in.m;
Chris@49 1563
Chris@49 1564 const uword in_aux_row1 = in.aux_row1;
Chris@49 1565 const uword in_aux_col1 = in.aux_col1;
Chris@49 1566 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1567
Chris@49 1568 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1569 {
Chris@49 1570 const uword mod_slice = in_aux_slice1 + slice;
Chris@49 1571
Chris@49 1572 eT* out_colptr = out.colptr(slice);
Chris@49 1573
Chris@49 1574 uword i,j;
Chris@49 1575 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1576 {
Chris@49 1577 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1578 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
Chris@49 1579
Chris@49 1580 out_colptr[i] -= tmp_i;
Chris@49 1581 out_colptr[j] -= tmp_j;
Chris@49 1582 }
Chris@49 1583
Chris@49 1584 if(i < in_n_cols)
Chris@49 1585 {
Chris@49 1586 out_colptr[i] -= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1587 }
Chris@49 1588 }
Chris@49 1589 }
Chris@49 1590 }
Chris@49 1591 else
Chris@49 1592 {
Chris@49 1593 eT* out_mem = out.memptr();
Chris@49 1594
Chris@49 1595 const Cube<eT>& Q = in.m;
Chris@49 1596
Chris@49 1597 const uword in_aux_row1 = in.aux_row1;
Chris@49 1598 const uword in_aux_col1 = in.aux_col1;
Chris@49 1599 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1600
Chris@49 1601 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1602 {
Chris@49 1603 out_mem[i] -= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
Chris@49 1604 }
Chris@49 1605 }
Chris@49 1606 }
Chris@49 1607 }
Chris@49 1608
Chris@49 1609
Chris@49 1610
Chris@49 1611 //! mat X %= Y.subcube(...)
Chris@49 1612 template<typename eT>
Chris@49 1613 inline
Chris@49 1614 void
Chris@49 1615 subview_cube<eT>::schur_inplace(Mat<eT>& out, const subview_cube<eT>& in)
Chris@49 1616 {
Chris@49 1617 arma_extra_debug_sigprint();
Chris@49 1618
Chris@49 1619 arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true);
Chris@49 1620
Chris@49 1621 const uword in_n_rows = in.n_rows;
Chris@49 1622 const uword in_n_cols = in.n_cols;
Chris@49 1623 const uword in_n_slices = in.n_slices;
Chris@49 1624
Chris@49 1625 const uword out_n_rows = out.n_rows;
Chris@49 1626 const uword out_n_cols = out.n_cols;
Chris@49 1627 const uword out_vec_state = out.vec_state;
Chris@49 1628
Chris@49 1629 if(in_n_slices == 1)
Chris@49 1630 {
Chris@49 1631 for(uword col=0; col < in_n_cols; ++col)
Chris@49 1632 {
Chris@49 1633 arrayops::inplace_mul( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
Chris@49 1634 }
Chris@49 1635 }
Chris@49 1636 else
Chris@49 1637 {
Chris@49 1638 if(out_vec_state == 0)
Chris@49 1639 {
Chris@49 1640 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1641 {
Chris@49 1642 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1643 {
Chris@49 1644 arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1645 }
Chris@49 1646 }
Chris@49 1647 else
Chris@49 1648 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1649 {
Chris@49 1650 const Cube<eT>& Q = in.m;
Chris@49 1651
Chris@49 1652 const uword in_aux_row1 = in.aux_row1;
Chris@49 1653 const uword in_aux_col1 = in.aux_col1;
Chris@49 1654 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1655
Chris@49 1656 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1657 {
Chris@49 1658 const uword mod_slice = in_aux_slice1 + slice;
Chris@49 1659
Chris@49 1660 eT* out_colptr = out.colptr(slice);
Chris@49 1661
Chris@49 1662 uword i,j;
Chris@49 1663 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1664 {
Chris@49 1665 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1666 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
Chris@49 1667
Chris@49 1668 out_colptr[i] *= tmp_i;
Chris@49 1669 out_colptr[j] *= tmp_j;
Chris@49 1670 }
Chris@49 1671
Chris@49 1672 if(i < in_n_cols)
Chris@49 1673 {
Chris@49 1674 out_colptr[i] *= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1675 }
Chris@49 1676 }
Chris@49 1677 }
Chris@49 1678 }
Chris@49 1679 else
Chris@49 1680 {
Chris@49 1681 eT* out_mem = out.memptr();
Chris@49 1682
Chris@49 1683 const Cube<eT>& Q = in.m;
Chris@49 1684
Chris@49 1685 const uword in_aux_row1 = in.aux_row1;
Chris@49 1686 const uword in_aux_col1 = in.aux_col1;
Chris@49 1687 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1688
Chris@49 1689 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1690 {
Chris@49 1691 out_mem[i] *= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
Chris@49 1692 }
Chris@49 1693 }
Chris@49 1694 }
Chris@49 1695 }
Chris@49 1696
Chris@49 1697
Chris@49 1698
Chris@49 1699 //! mat X /= Y.subcube(...)
Chris@49 1700 template<typename eT>
Chris@49 1701 inline
Chris@49 1702 void
Chris@49 1703 subview_cube<eT>::div_inplace(Mat<eT>& out, const subview_cube<eT>& in)
Chris@49 1704 {
Chris@49 1705 arma_extra_debug_sigprint();
Chris@49 1706
Chris@49 1707 arma_debug_assert_cube_as_mat(out, in, "element-wise division", true);
Chris@49 1708
Chris@49 1709 const uword in_n_rows = in.n_rows;
Chris@49 1710 const uword in_n_cols = in.n_cols;
Chris@49 1711 const uword in_n_slices = in.n_slices;
Chris@49 1712
Chris@49 1713 const uword out_n_rows = out.n_rows;
Chris@49 1714 const uword out_n_cols = out.n_cols;
Chris@49 1715 const uword out_vec_state = out.vec_state;
Chris@49 1716
Chris@49 1717 if(in_n_slices == 1)
Chris@49 1718 {
Chris@49 1719 for(uword col=0; col < in_n_cols; ++col)
Chris@49 1720 {
Chris@49 1721 arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
Chris@49 1722 }
Chris@49 1723 }
Chris@49 1724 else
Chris@49 1725 {
Chris@49 1726 if(out_vec_state == 0)
Chris@49 1727 {
Chris@49 1728 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
Chris@49 1729 {
Chris@49 1730 for(uword i=0; i < in_n_slices; ++i)
Chris@49 1731 {
Chris@49 1732 arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
Chris@49 1733 }
Chris@49 1734 }
Chris@49 1735 else
Chris@49 1736 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
Chris@49 1737 {
Chris@49 1738 const Cube<eT>& Q = in.m;
Chris@49 1739
Chris@49 1740 const uword in_aux_row1 = in.aux_row1;
Chris@49 1741 const uword in_aux_col1 = in.aux_col1;
Chris@49 1742 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1743
Chris@49 1744 for(uword slice=0; slice < in_n_slices; ++slice)
Chris@49 1745 {
Chris@49 1746 const uword mod_slice = in_aux_slice1 + slice;
Chris@49 1747
Chris@49 1748 eT* out_colptr = out.colptr(slice);
Chris@49 1749
Chris@49 1750 uword i,j;
Chris@49 1751 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
Chris@49 1752 {
Chris@49 1753 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1754 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
Chris@49 1755
Chris@49 1756 out_colptr[i] /= tmp_i;
Chris@49 1757 out_colptr[j] /= tmp_j;
Chris@49 1758 }
Chris@49 1759
Chris@49 1760 if(i < in_n_cols)
Chris@49 1761 {
Chris@49 1762 out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
Chris@49 1763 }
Chris@49 1764 }
Chris@49 1765 }
Chris@49 1766 }
Chris@49 1767 else
Chris@49 1768 {
Chris@49 1769 eT* out_mem = out.memptr();
Chris@49 1770
Chris@49 1771 const Cube<eT>& Q = in.m;
Chris@49 1772
Chris@49 1773 const uword in_aux_row1 = in.aux_row1;
Chris@49 1774 const uword in_aux_col1 = in.aux_col1;
Chris@49 1775 const uword in_aux_slice1 = in.aux_slice1;
Chris@49 1776
Chris@49 1777 for(uword i=0; i<in_n_slices; ++i)
Chris@49 1778 {
Chris@49 1779 out_mem[i] /= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
Chris@49 1780 }
Chris@49 1781 }
Chris@49 1782 }
Chris@49 1783 }
Chris@49 1784
Chris@49 1785
Chris@49 1786
Chris@49 1787 //! @}