annotate armadillo-3.900.4/include/armadillo_bits/injector_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) 2010 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2010 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 injector
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13
Chris@49 14 template<typename eT>
Chris@49 15 inline
Chris@49 16 mat_injector_row<eT>::mat_injector_row()
Chris@49 17 : n_cols(0)
Chris@49 18 {
Chris@49 19 arma_extra_debug_sigprint();
Chris@49 20
Chris@49 21 A.set_size( podarray_prealloc_n_elem::val );
Chris@49 22 }
Chris@49 23
Chris@49 24
Chris@49 25
Chris@49 26 template<typename eT>
Chris@49 27 inline
Chris@49 28 void
Chris@49 29 mat_injector_row<eT>::insert(const eT val) const
Chris@49 30 {
Chris@49 31 arma_extra_debug_sigprint();
Chris@49 32
Chris@49 33 if(n_cols < A.n_elem)
Chris@49 34 {
Chris@49 35 A[n_cols] = val;
Chris@49 36 ++n_cols;
Chris@49 37 }
Chris@49 38 else
Chris@49 39 {
Chris@49 40 B.set_size(2 * A.n_elem);
Chris@49 41
Chris@49 42 arrayops::copy(B.memptr(), A.memptr(), n_cols);
Chris@49 43
Chris@49 44 B[n_cols] = val;
Chris@49 45 ++n_cols;
Chris@49 46
Chris@49 47 std::swap( access::rw(A.mem), access::rw(B.mem) );
Chris@49 48 std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );
Chris@49 49 }
Chris@49 50 }
Chris@49 51
Chris@49 52
Chris@49 53
Chris@49 54 //
Chris@49 55 //
Chris@49 56 //
Chris@49 57
Chris@49 58
Chris@49 59
Chris@49 60 template<typename T1>
Chris@49 61 inline
Chris@49 62 mat_injector<T1>::mat_injector(T1& in_X, const typename mat_injector<T1>::elem_type val)
Chris@49 63 : X(in_X)
Chris@49 64 , n_rows(1)
Chris@49 65 {
Chris@49 66 arma_extra_debug_sigprint();
Chris@49 67
Chris@49 68 typedef typename mat_injector<T1>::elem_type eT;
Chris@49 69
Chris@49 70 AA = new podarray< mat_injector_row<eT>* >;
Chris@49 71 BB = new podarray< mat_injector_row<eT>* >;
Chris@49 72
Chris@49 73 podarray< mat_injector_row<eT>* >& A = *AA;
Chris@49 74
Chris@49 75 A.set_size(n_rows);
Chris@49 76
Chris@49 77 for(uword row=0; row<n_rows; ++row)
Chris@49 78 {
Chris@49 79 A[row] = new mat_injector_row<eT>;
Chris@49 80 }
Chris@49 81
Chris@49 82 (*(A[0])).insert(val);
Chris@49 83 }
Chris@49 84
Chris@49 85
Chris@49 86
Chris@49 87 template<typename T1>
Chris@49 88 inline
Chris@49 89 mat_injector<T1>::mat_injector(T1& in_X, const injector_end_of_row<>& x)
Chris@49 90 : X(in_X)
Chris@49 91 , n_rows(1)
Chris@49 92 {
Chris@49 93 arma_extra_debug_sigprint();
Chris@49 94 arma_ignore(x);
Chris@49 95
Chris@49 96 typedef typename mat_injector<T1>::elem_type eT;
Chris@49 97
Chris@49 98 AA = new podarray< mat_injector_row<eT>* >;
Chris@49 99 BB = new podarray< mat_injector_row<eT>* >;
Chris@49 100
Chris@49 101 podarray< mat_injector_row<eT>* >& A = *AA;
Chris@49 102
Chris@49 103 A.set_size(n_rows);
Chris@49 104
Chris@49 105 for(uword row=0; row<n_rows; ++row)
Chris@49 106 {
Chris@49 107 A[row] = new mat_injector_row<eT>;
Chris@49 108 }
Chris@49 109
Chris@49 110 (*this).end_of_row();
Chris@49 111 }
Chris@49 112
Chris@49 113
Chris@49 114
Chris@49 115 template<typename T1>
Chris@49 116 inline
Chris@49 117 mat_injector<T1>::~mat_injector()
Chris@49 118 {
Chris@49 119 arma_extra_debug_sigprint();
Chris@49 120
Chris@49 121 typedef typename mat_injector<T1>::elem_type eT;
Chris@49 122
Chris@49 123 podarray< mat_injector_row<eT>* >& A = *AA;
Chris@49 124
Chris@49 125 if(n_rows > 0)
Chris@49 126 {
Chris@49 127 uword max_n_cols = (*(A[0])).n_cols;
Chris@49 128
Chris@49 129 for(uword row=1; row<n_rows; ++row)
Chris@49 130 {
Chris@49 131 const uword n_cols = (*(A[row])).n_cols;
Chris@49 132
Chris@49 133 if(max_n_cols < n_cols)
Chris@49 134 {
Chris@49 135 max_n_cols = n_cols;
Chris@49 136 }
Chris@49 137 }
Chris@49 138
Chris@49 139 const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;
Chris@49 140
Chris@49 141 if(is_Mat_only<T1>::value == true)
Chris@49 142 {
Chris@49 143 X.set_size(max_n_rows, max_n_cols);
Chris@49 144
Chris@49 145 for(uword row=0; row<max_n_rows; ++row)
Chris@49 146 {
Chris@49 147 const uword n_cols = (*(A[row])).n_cols;
Chris@49 148
Chris@49 149 for(uword col=0; col<n_cols; ++col)
Chris@49 150 {
Chris@49 151 X.at(row,col) = (*(A[row])).A[col];
Chris@49 152 }
Chris@49 153
Chris@49 154 for(uword col=n_cols; col<max_n_cols; ++col)
Chris@49 155 {
Chris@49 156 X.at(row,col) = eT(0);
Chris@49 157 }
Chris@49 158 }
Chris@49 159 }
Chris@49 160 else
Chris@49 161 if(is_Row<T1>::value == true)
Chris@49 162 {
Chris@49 163 arma_debug_check( (max_n_rows > 1), "matrix initialisation: incompatible dimensions" );
Chris@49 164
Chris@49 165 const uword n_cols = (*(A[0])).n_cols;
Chris@49 166
Chris@49 167 X.set_size(1, n_cols);
Chris@49 168
Chris@49 169 arrayops::copy( X.memptr(), (*(A[0])).A.memptr(), n_cols );
Chris@49 170 }
Chris@49 171 else
Chris@49 172 if(is_Col<T1>::value == true)
Chris@49 173 {
Chris@49 174 const bool is_vec = ( (max_n_rows == 1) || (max_n_cols == 1) );
Chris@49 175
Chris@49 176 arma_debug_check( (is_vec == false), "matrix initialisation: incompatible dimensions" );
Chris@49 177
Chris@49 178 const uword n_elem = (std::max)(max_n_rows, max_n_cols);
Chris@49 179
Chris@49 180 X.set_size(n_elem, 1);
Chris@49 181
Chris@49 182 uword i = 0;
Chris@49 183 for(uword row=0; row<max_n_rows; ++row)
Chris@49 184 {
Chris@49 185 const uword n_cols = (*(A[0])).n_cols;
Chris@49 186
Chris@49 187 for(uword col=0; col<n_cols; ++col)
Chris@49 188 {
Chris@49 189 X[i] = (*(A[row])).A[col];
Chris@49 190 ++i;
Chris@49 191 }
Chris@49 192
Chris@49 193 for(uword col=n_cols; col<max_n_cols; ++col)
Chris@49 194 {
Chris@49 195 X[i] = eT(0);
Chris@49 196 ++i;
Chris@49 197 }
Chris@49 198 }
Chris@49 199 }
Chris@49 200 }
Chris@49 201
Chris@49 202 for(uword row=0; row<n_rows; ++row)
Chris@49 203 {
Chris@49 204 delete A[row];
Chris@49 205 }
Chris@49 206
Chris@49 207 delete AA;
Chris@49 208 delete BB;
Chris@49 209 }
Chris@49 210
Chris@49 211
Chris@49 212
Chris@49 213 template<typename T1>
Chris@49 214 inline
Chris@49 215 void
Chris@49 216 mat_injector<T1>::insert(const typename mat_injector<T1>::elem_type val) const
Chris@49 217 {
Chris@49 218 arma_extra_debug_sigprint();
Chris@49 219
Chris@49 220 typedef typename mat_injector<T1>::elem_type eT;
Chris@49 221
Chris@49 222 podarray< mat_injector_row<eT>* >& A = *AA;
Chris@49 223
Chris@49 224 (*(A[n_rows-1])).insert(val);
Chris@49 225 }
Chris@49 226
Chris@49 227
Chris@49 228
Chris@49 229
Chris@49 230 template<typename T1>
Chris@49 231 inline
Chris@49 232 void
Chris@49 233 mat_injector<T1>::end_of_row() const
Chris@49 234 {
Chris@49 235 arma_extra_debug_sigprint();
Chris@49 236
Chris@49 237 typedef typename mat_injector<T1>::elem_type eT;
Chris@49 238
Chris@49 239 podarray< mat_injector_row<eT>* >& A = *AA;
Chris@49 240 podarray< mat_injector_row<eT>* >& B = *BB;
Chris@49 241
Chris@49 242 B.set_size( n_rows+1 );
Chris@49 243
Chris@49 244 arrayops::copy(B.memptr(), A.memptr(), n_rows);
Chris@49 245
Chris@49 246 for(uword row=n_rows; row<(n_rows+1); ++row)
Chris@49 247 {
Chris@49 248 B[row] = new mat_injector_row<eT>;
Chris@49 249 }
Chris@49 250
Chris@49 251 std::swap(AA, BB);
Chris@49 252
Chris@49 253 n_rows += 1;
Chris@49 254 }
Chris@49 255
Chris@49 256
Chris@49 257
Chris@49 258 template<typename T1>
Chris@49 259 arma_inline
Chris@49 260 const mat_injector<T1>&
Chris@49 261 operator<<(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)
Chris@49 262 {
Chris@49 263 arma_extra_debug_sigprint();
Chris@49 264
Chris@49 265 ref.insert(val);
Chris@49 266
Chris@49 267 return ref;
Chris@49 268 }
Chris@49 269
Chris@49 270
Chris@49 271
Chris@49 272 template<typename T1>
Chris@49 273 arma_inline
Chris@49 274 const mat_injector<T1>&
Chris@49 275 operator<<(const mat_injector<T1>& ref, const injector_end_of_row<>& x)
Chris@49 276 {
Chris@49 277 arma_extra_debug_sigprint();
Chris@49 278 arma_ignore(x);
Chris@49 279
Chris@49 280 ref.end_of_row();
Chris@49 281
Chris@49 282 return ref;
Chris@49 283 }
Chris@49 284
Chris@49 285
Chris@49 286
Chris@49 287 //// using a mixture of operator << and , doesn't work yet
Chris@49 288 //// e.g. A << 1, 2, 3 << endr
Chris@49 289 //// in the above "3 << endr" requires special handling.
Chris@49 290 //// similarly, special handling is necessary for "endr << 3"
Chris@49 291 ////
Chris@49 292 // template<typename T1>
Chris@49 293 // arma_inline
Chris@49 294 // const mat_injector<T1>&
Chris@49 295 // operator,(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)
Chris@49 296 // {
Chris@49 297 // arma_extra_debug_sigprint();
Chris@49 298 //
Chris@49 299 // ref.insert(val);
Chris@49 300 //
Chris@49 301 // return ref;
Chris@49 302 // }
Chris@49 303
Chris@49 304
Chris@49 305
Chris@49 306 // template<typename T1>
Chris@49 307 // arma_inline
Chris@49 308 // const mat_injector<T1>&
Chris@49 309 // operator,(const mat_injector<T1>& ref, const injector_end_of_row<>& x)
Chris@49 310 // {
Chris@49 311 // arma_extra_debug_sigprint();
Chris@49 312 // arma_ignore(x);
Chris@49 313 //
Chris@49 314 // ref.end_of_row();
Chris@49 315 //
Chris@49 316 // return ref;
Chris@49 317 // }
Chris@49 318
Chris@49 319
Chris@49 320
Chris@49 321
Chris@49 322 //
Chris@49 323 //
Chris@49 324 //
Chris@49 325
Chris@49 326
Chris@49 327
Chris@49 328 template<typename oT>
Chris@49 329 inline
Chris@49 330 field_injector_row<oT>::field_injector_row()
Chris@49 331 : n_cols(0)
Chris@49 332 {
Chris@49 333 arma_extra_debug_sigprint();
Chris@49 334
Chris@49 335 AA = new field<oT>;
Chris@49 336 BB = new field<oT>;
Chris@49 337
Chris@49 338 field<oT>& A = *AA;
Chris@49 339
Chris@49 340 A.set_size( field_prealloc_n_elem::val );
Chris@49 341 }
Chris@49 342
Chris@49 343
Chris@49 344
Chris@49 345 template<typename oT>
Chris@49 346 inline
Chris@49 347 field_injector_row<oT>::~field_injector_row()
Chris@49 348 {
Chris@49 349 arma_extra_debug_sigprint();
Chris@49 350
Chris@49 351 delete AA;
Chris@49 352 delete BB;
Chris@49 353 }
Chris@49 354
Chris@49 355
Chris@49 356
Chris@49 357 template<typename oT>
Chris@49 358 inline
Chris@49 359 void
Chris@49 360 field_injector_row<oT>::insert(const oT& val) const
Chris@49 361 {
Chris@49 362 arma_extra_debug_sigprint();
Chris@49 363
Chris@49 364 field<oT>& A = *AA;
Chris@49 365 field<oT>& B = *BB;
Chris@49 366
Chris@49 367 if(n_cols < A.n_elem)
Chris@49 368 {
Chris@49 369 A[n_cols] = val;
Chris@49 370 ++n_cols;
Chris@49 371 }
Chris@49 372 else
Chris@49 373 {
Chris@49 374 B.set_size(2 * A.n_elem);
Chris@49 375
Chris@49 376 for(uword i=0; i<n_cols; ++i)
Chris@49 377 {
Chris@49 378 B[i] = A[i];
Chris@49 379 }
Chris@49 380
Chris@49 381 B[n_cols] = val;
Chris@49 382 ++n_cols;
Chris@49 383
Chris@49 384 std::swap(AA, BB);
Chris@49 385 }
Chris@49 386 }
Chris@49 387
Chris@49 388
Chris@49 389
Chris@49 390 //
Chris@49 391 //
Chris@49 392 //
Chris@49 393
Chris@49 394
Chris@49 395 template<typename T1>
Chris@49 396 inline
Chris@49 397 field_injector<T1>::field_injector(T1& in_X, const typename field_injector<T1>::object_type& val)
Chris@49 398 : X(in_X)
Chris@49 399 , n_rows(1)
Chris@49 400 {
Chris@49 401 arma_extra_debug_sigprint();
Chris@49 402
Chris@49 403 typedef typename field_injector<T1>::object_type oT;
Chris@49 404
Chris@49 405 AA = new podarray< field_injector_row<oT>* >;
Chris@49 406 BB = new podarray< field_injector_row<oT>* >;
Chris@49 407
Chris@49 408 podarray< field_injector_row<oT>* >& A = *AA;
Chris@49 409
Chris@49 410 A.set_size(n_rows);
Chris@49 411
Chris@49 412 for(uword row=0; row<n_rows; ++row)
Chris@49 413 {
Chris@49 414 A[row] = new field_injector_row<oT>;
Chris@49 415 }
Chris@49 416
Chris@49 417 (*(A[0])).insert(val);
Chris@49 418 }
Chris@49 419
Chris@49 420
Chris@49 421
Chris@49 422 template<typename T1>
Chris@49 423 inline
Chris@49 424 field_injector<T1>::field_injector(T1& in_X, const injector_end_of_row<>& x)
Chris@49 425 : X(in_X)
Chris@49 426 , n_rows(1)
Chris@49 427 {
Chris@49 428 arma_extra_debug_sigprint();
Chris@49 429 arma_ignore(x);
Chris@49 430
Chris@49 431 typedef typename field_injector<T1>::object_type oT;
Chris@49 432
Chris@49 433 AA = new podarray< field_injector_row<oT>* >;
Chris@49 434 BB = new podarray< field_injector_row<oT>* >;
Chris@49 435
Chris@49 436 podarray< field_injector_row<oT>* >& A = *AA;
Chris@49 437
Chris@49 438 A.set_size(n_rows);
Chris@49 439
Chris@49 440 for(uword row=0; row<n_rows; ++row)
Chris@49 441 {
Chris@49 442 A[row] = new field_injector_row<oT>;
Chris@49 443 }
Chris@49 444
Chris@49 445 (*this).end_of_row();
Chris@49 446 }
Chris@49 447
Chris@49 448
Chris@49 449
Chris@49 450 template<typename T1>
Chris@49 451 inline
Chris@49 452 field_injector<T1>::~field_injector()
Chris@49 453 {
Chris@49 454 arma_extra_debug_sigprint();
Chris@49 455
Chris@49 456 typedef typename field_injector<T1>::object_type oT;
Chris@49 457
Chris@49 458 podarray< field_injector_row<oT>* >& A = *AA;
Chris@49 459
Chris@49 460 if(n_rows > 0)
Chris@49 461 {
Chris@49 462 uword max_n_cols = (*(A[0])).n_cols;
Chris@49 463
Chris@49 464 for(uword row=1; row<n_rows; ++row)
Chris@49 465 {
Chris@49 466 const uword n_cols = (*(A[row])).n_cols;
Chris@49 467
Chris@49 468 if(max_n_cols < n_cols)
Chris@49 469 {
Chris@49 470 max_n_cols = n_cols;
Chris@49 471 }
Chris@49 472 }
Chris@49 473
Chris@49 474 const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;
Chris@49 475
Chris@49 476 X.set_size(max_n_rows, max_n_cols);
Chris@49 477
Chris@49 478 for(uword row=0; row<max_n_rows; ++row)
Chris@49 479 {
Chris@49 480 const uword n_cols = (*(A[row])).n_cols;
Chris@49 481
Chris@49 482 for(uword col=0; col<n_cols; ++col)
Chris@49 483 {
Chris@49 484 const field<oT>& tmp = *((*(A[row])).AA);
Chris@49 485 X.at(row,col) = tmp[col];
Chris@49 486 }
Chris@49 487
Chris@49 488 for(uword col=n_cols; col<max_n_cols; ++col)
Chris@49 489 {
Chris@49 490 X.at(row,col) = oT();
Chris@49 491 }
Chris@49 492 }
Chris@49 493 }
Chris@49 494
Chris@49 495
Chris@49 496 for(uword row=0; row<n_rows; ++row)
Chris@49 497 {
Chris@49 498 delete A[row];
Chris@49 499 }
Chris@49 500
Chris@49 501 delete AA;
Chris@49 502 delete BB;
Chris@49 503 }
Chris@49 504
Chris@49 505
Chris@49 506
Chris@49 507 template<typename T1>
Chris@49 508 inline
Chris@49 509 void
Chris@49 510 field_injector<T1>::insert(const typename field_injector<T1>::object_type& val) const
Chris@49 511 {
Chris@49 512 arma_extra_debug_sigprint();
Chris@49 513
Chris@49 514 typedef typename field_injector<T1>::object_type oT;
Chris@49 515
Chris@49 516 podarray< field_injector_row<oT>* >& A = *AA;
Chris@49 517
Chris@49 518 (*(A[n_rows-1])).insert(val);
Chris@49 519 }
Chris@49 520
Chris@49 521
Chris@49 522
Chris@49 523
Chris@49 524 template<typename T1>
Chris@49 525 inline
Chris@49 526 void
Chris@49 527 field_injector<T1>::end_of_row() const
Chris@49 528 {
Chris@49 529 arma_extra_debug_sigprint();
Chris@49 530
Chris@49 531 typedef typename field_injector<T1>::object_type oT;
Chris@49 532
Chris@49 533 podarray< field_injector_row<oT>* >& A = *AA;
Chris@49 534 podarray< field_injector_row<oT>* >& B = *BB;
Chris@49 535
Chris@49 536 B.set_size( n_rows+1 );
Chris@49 537
Chris@49 538 for(uword row=0; row<n_rows; ++row)
Chris@49 539 {
Chris@49 540 B[row] = A[row];
Chris@49 541 }
Chris@49 542
Chris@49 543 for(uword row=n_rows; row<(n_rows+1); ++row)
Chris@49 544 {
Chris@49 545 B[row] = new field_injector_row<oT>;
Chris@49 546 }
Chris@49 547
Chris@49 548 std::swap(AA, BB);
Chris@49 549
Chris@49 550 n_rows += 1;
Chris@49 551 }
Chris@49 552
Chris@49 553
Chris@49 554
Chris@49 555 template<typename T1>
Chris@49 556 arma_inline
Chris@49 557 const field_injector<T1>&
Chris@49 558 operator<<(const field_injector<T1>& ref, const typename field_injector<T1>::object_type& val)
Chris@49 559 {
Chris@49 560 arma_extra_debug_sigprint();
Chris@49 561
Chris@49 562 ref.insert(val);
Chris@49 563
Chris@49 564 return ref;
Chris@49 565 }
Chris@49 566
Chris@49 567
Chris@49 568
Chris@49 569 template<typename T1>
Chris@49 570 arma_inline
Chris@49 571 const field_injector<T1>&
Chris@49 572 operator<<(const field_injector<T1>& ref, const injector_end_of_row<>& x)
Chris@49 573 {
Chris@49 574 arma_extra_debug_sigprint();
Chris@49 575 arma_ignore(x);
Chris@49 576
Chris@49 577 ref.end_of_row();
Chris@49 578
Chris@49 579 return ref;
Chris@49 580 }
Chris@49 581
Chris@49 582
Chris@49 583
Chris@49 584 //! @}