annotate armadillo-3.900.4/include/armadillo_bits/SpCol_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) 2011-2012 Ryan Curtin
Chris@49 2 // Copyright (C) 2011 Matthew Amidon
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 SpCol
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 //! construct an empty column vector
Chris@49 14 template<typename eT>
Chris@49 15 inline
Chris@49 16 SpCol<eT>::SpCol()
Chris@49 17 : SpMat<eT>(0, 1)
Chris@49 18 {
Chris@49 19 arma_extra_debug_sigprint();
Chris@49 20
Chris@49 21 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 22 }
Chris@49 23
Chris@49 24
Chris@49 25
Chris@49 26 //! construct a column vector with the specified number of elements
Chris@49 27 template<typename eT>
Chris@49 28 inline
Chris@49 29 SpCol<eT>::SpCol(const uword in_n_elem)
Chris@49 30 : SpMat<eT>(in_n_elem, 1)
Chris@49 31 {
Chris@49 32 arma_extra_debug_sigprint();
Chris@49 33
Chris@49 34 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 35 }
Chris@49 36
Chris@49 37
Chris@49 38
Chris@49 39 template<typename eT>
Chris@49 40 inline
Chris@49 41 SpCol<eT>::SpCol(const uword in_n_rows, const uword in_n_cols)
Chris@49 42 : SpMat<eT>(in_n_rows, in_n_cols)
Chris@49 43 {
Chris@49 44 arma_extra_debug_sigprint();
Chris@49 45
Chris@49 46 arma_debug_check((in_n_cols != 1), "SpCol::SpCol(): must have only one column");
Chris@49 47
Chris@49 48 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 49 }
Chris@49 50
Chris@49 51
Chris@49 52
Chris@49 53 //! construct a column vector from specified text
Chris@49 54 template<typename eT>
Chris@49 55 inline
Chris@49 56 SpCol<eT>::SpCol(const char* text)
Chris@49 57 : SpMat<eT>(text)
Chris@49 58 {
Chris@49 59 arma_extra_debug_sigprint();
Chris@49 60
Chris@49 61 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 62
Chris@49 63 arma_debug_check((SpMat<eT>::n_cols != 1), "SpCol::SpCol(): must have only one column");
Chris@49 64 }
Chris@49 65
Chris@49 66
Chris@49 67
Chris@49 68 //! construct a column vector from specified text
Chris@49 69 template<typename eT>
Chris@49 70 inline
Chris@49 71 const SpCol<eT>&
Chris@49 72 SpCol<eT>::operator=(const char* text)
Chris@49 73 {
Chris@49 74 arma_extra_debug_sigprint();
Chris@49 75
Chris@49 76 SpMat<eT>::init(std::string(text));
Chris@49 77
Chris@49 78 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 79
Chris@49 80 return *this;
Chris@49 81 }
Chris@49 82
Chris@49 83
Chris@49 84
Chris@49 85 //! construct a column vector from specified text
Chris@49 86 template<typename eT>
Chris@49 87 inline
Chris@49 88 SpCol<eT>::SpCol(const std::string& text)
Chris@49 89 : SpMat<eT>(text)
Chris@49 90 {
Chris@49 91 arma_extra_debug_sigprint();
Chris@49 92
Chris@49 93 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 94
Chris@49 95 arma_debug_check((SpMat<eT>::n_cols != 1), "SpCol::SpCol(): must have only one column");
Chris@49 96 }
Chris@49 97
Chris@49 98
Chris@49 99
Chris@49 100 //! construct a column vector from specified text
Chris@49 101 template<typename eT>
Chris@49 102 inline
Chris@49 103 const SpCol<eT>&
Chris@49 104 SpCol<eT>::operator=(const std::string& text)
Chris@49 105 {
Chris@49 106 arma_extra_debug_sigprint();
Chris@49 107
Chris@49 108 SpMat<eT>::init(std::string(text));
Chris@49 109
Chris@49 110 return *this;
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 const SpCol<eT>&
Chris@49 118 SpCol<eT>::operator=(const eT val)
Chris@49 119 {
Chris@49 120 arma_extra_debug_sigprint();
Chris@49 121
Chris@49 122 SpMat<eT>::operator=(val);
Chris@49 123
Chris@49 124 return *this;
Chris@49 125 }
Chris@49 126
Chris@49 127
Chris@49 128
Chris@49 129 template<typename eT>
Chris@49 130 template<typename T1>
Chris@49 131 inline
Chris@49 132 SpCol<eT>::SpCol(const Base<eT,T1>& X)
Chris@49 133 {
Chris@49 134 arma_extra_debug_sigprint();
Chris@49 135
Chris@49 136 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 137
Chris@49 138 SpMat<eT>::operator=(X.get_ref());
Chris@49 139 }
Chris@49 140
Chris@49 141
Chris@49 142
Chris@49 143 template<typename eT>
Chris@49 144 template<typename T1>
Chris@49 145 inline
Chris@49 146 const SpCol<eT>&
Chris@49 147 SpCol<eT>::operator=(const Base<eT,T1>& X)
Chris@49 148 {
Chris@49 149 arma_extra_debug_sigprint();
Chris@49 150
Chris@49 151 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 152
Chris@49 153 SpMat<eT>::operator=(X.get_ref());
Chris@49 154
Chris@49 155 return *this;
Chris@49 156 }
Chris@49 157
Chris@49 158
Chris@49 159
Chris@49 160 template<typename eT>
Chris@49 161 template<typename T1>
Chris@49 162 inline
Chris@49 163 SpCol<eT>::SpCol(const SpBase<eT,T1>& X)
Chris@49 164 {
Chris@49 165 arma_extra_debug_sigprint();
Chris@49 166
Chris@49 167 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 168
Chris@49 169 SpMat<eT>::operator=(X.get_ref());
Chris@49 170 }
Chris@49 171
Chris@49 172
Chris@49 173
Chris@49 174 template<typename eT>
Chris@49 175 template<typename T1>
Chris@49 176 inline
Chris@49 177 const SpCol<eT>&
Chris@49 178 SpCol<eT>::operator=(const SpBase<eT,T1>& X)
Chris@49 179 {
Chris@49 180 arma_extra_debug_sigprint();
Chris@49 181
Chris@49 182 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 183
Chris@49 184 SpMat<eT>::operator=(X.get_ref());
Chris@49 185
Chris@49 186 return *this;
Chris@49 187 }
Chris@49 188
Chris@49 189
Chris@49 190
Chris@49 191 template<typename eT>
Chris@49 192 template<typename T1, typename T2>
Chris@49 193 inline
Chris@49 194 SpCol<eT>::SpCol
Chris@49 195 (
Chris@49 196 const SpBase<typename SpCol<eT>::pod_type, T1>& A,
Chris@49 197 const SpBase<typename SpCol<eT>::pod_type, T2>& B
Chris@49 198 )
Chris@49 199 {
Chris@49 200 arma_extra_debug_sigprint();
Chris@49 201
Chris@49 202 access::rw(SpMat<eT>::vec_state) = 1;
Chris@49 203
Chris@49 204 SpMat<eT>::init(A,B);
Chris@49 205 }
Chris@49 206
Chris@49 207
Chris@49 208
Chris@49 209 template<typename eT>
Chris@49 210 inline
Chris@49 211 SpValProxy< SpMat<eT> >
Chris@49 212 SpCol<eT>::row(const uword row_num)
Chris@49 213 {
Chris@49 214 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "SpCol::row(): out of bounds" );
Chris@49 215
Chris@49 216 return SpMat<eT>::at(row_num, 0);
Chris@49 217 }
Chris@49 218
Chris@49 219
Chris@49 220
Chris@49 221 template<typename eT>
Chris@49 222 inline
Chris@49 223 eT
Chris@49 224 SpCol<eT>::row(const uword row_num) const
Chris@49 225 {
Chris@49 226 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "SpCol::row(): out of bounds" );
Chris@49 227
Chris@49 228 return SpMat<eT>::at(row_num, 0);
Chris@49 229 }
Chris@49 230
Chris@49 231
Chris@49 232 /*
Chris@49 233 template<typename eT>
Chris@49 234 arma_inline
Chris@49 235 subview_col<eT>
Chris@49 236 SpCol<eT>::rows(const uword in_row1, const uword in_row2)
Chris@49 237 {
Chris@49 238 arma_extra_debug_sigprint();
Chris@49 239
Chris@49 240 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used");
Chris@49 241
Chris@49 242 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 243
Chris@49 244 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
Chris@49 245 }
Chris@49 246
Chris@49 247
Chris@49 248
Chris@49 249 template<typename eT>
Chris@49 250 arma_inline
Chris@49 251 const subview_col<eT>
Chris@49 252 SpCol<eT>::rows(const uword in_row1, const uword in_row2) const
Chris@49 253 {
Chris@49 254 arma_extra_debug_sigprint();
Chris@49 255
Chris@49 256 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used");
Chris@49 257
Chris@49 258 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 259
Chris@49 260 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
Chris@49 261 }
Chris@49 262
Chris@49 263
Chris@49 264
Chris@49 265 template<typename eT>
Chris@49 266 arma_inline
Chris@49 267 subview_col<eT>
Chris@49 268 SpCol<eT>::subvec(const uword in_row1, const uword in_row2)
Chris@49 269 {
Chris@49 270 arma_extra_debug_sigprint();
Chris@49 271
Chris@49 272 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used");
Chris@49 273
Chris@49 274 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 275
Chris@49 276 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
Chris@49 277 }
Chris@49 278
Chris@49 279
Chris@49 280
Chris@49 281 template<typename eT>
Chris@49 282 arma_inline
Chris@49 283 const subview_col<eT>
Chris@49 284 SpCol<eT>::subvec(const uword in_row1, const uword in_row2) const
Chris@49 285 {
Chris@49 286 arma_extra_debug_sigprint();
Chris@49 287
Chris@49 288 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used");
Chris@49 289
Chris@49 290 const uword subview_n_rows = in_row2 - in_row1 + 1;
Chris@49 291
Chris@49 292 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
Chris@49 293 }
Chris@49 294
Chris@49 295
Chris@49 296
Chris@49 297 template<typename eT>
Chris@49 298 arma_inline
Chris@49 299 subview_col<eT>
Chris@49 300 SpCol<eT>::subvec(const span& row_span)
Chris@49 301 {
Chris@49 302 arma_extra_debug_sigprint();
Chris@49 303
Chris@49 304 const bool row_all = row_span.whole;
Chris@49 305
Chris@49 306 const uword local_n_rows = SpMat<eT>::n_rows;
Chris@49 307
Chris@49 308 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 309 const uword in_row2 = row_span.b;
Chris@49 310 const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 311
Chris@49 312 arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used");
Chris@49 313
Chris@49 314 return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);
Chris@49 315 }
Chris@49 316
Chris@49 317
Chris@49 318
Chris@49 319 template<typename eT>
Chris@49 320 arma_inline
Chris@49 321 const subview_col<eT>
Chris@49 322 SpCol<eT>::subvec(const span& row_span) const
Chris@49 323 {
Chris@49 324 arma_extra_debug_sigprint();
Chris@49 325
Chris@49 326 const bool row_all = row_span.whole;
Chris@49 327
Chris@49 328 const uword local_n_rows = SpMat<eT>::n_rows;
Chris@49 329
Chris@49 330 const uword in_row1 = row_all ? 0 : row_span.a;
Chris@49 331 const uword in_row2 = row_span.b;
Chris@49 332 const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
Chris@49 333
Chris@49 334 arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used");
Chris@49 335
Chris@49 336 return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);
Chris@49 337 }
Chris@49 338 */
Chris@49 339
Chris@49 340
Chris@49 341 //! remove specified row
Chris@49 342 template<typename eT>
Chris@49 343 inline
Chris@49 344 void
Chris@49 345 SpCol<eT>::shed_row(const uword row_num)
Chris@49 346 {
Chris@49 347 arma_extra_debug_sigprint();
Chris@49 348
Chris@49 349 arma_debug_check( row_num >= SpMat<eT>::n_rows, "SpCol::shed_row(): out of bounds");
Chris@49 350
Chris@49 351 shed_rows(row_num, row_num);
Chris@49 352 }
Chris@49 353
Chris@49 354
Chris@49 355
Chris@49 356 //! remove specified rows
Chris@49 357 template<typename eT>
Chris@49 358 inline
Chris@49 359 void
Chris@49 360 SpCol<eT>::shed_rows(const uword in_row1, const uword in_row2)
Chris@49 361 {
Chris@49 362 arma_extra_debug_sigprint();
Chris@49 363
Chris@49 364 arma_debug_check
Chris@49 365 (
Chris@49 366 (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows),
Chris@49 367 "SpCol::shed_rows(): indices out of bounds or incorrectly used"
Chris@49 368 );
Chris@49 369
Chris@49 370 const uword diff = (in_row2 - in_row1 + 1);
Chris@49 371
Chris@49 372 // This is easy because everything is in one column.
Chris@49 373 uword start = 0, end = 0;
Chris@49 374 bool start_found = false, end_found = false;
Chris@49 375 for(uword i = 0; i < SpMat<eT>::n_nonzero; ++i)
Chris@49 376 {
Chris@49 377 // Start position found?
Chris@49 378 if (SpMat<eT>::row_indices[i] >= in_row1 && !start_found)
Chris@49 379 {
Chris@49 380 start = i;
Chris@49 381 start_found = true;
Chris@49 382 }
Chris@49 383
Chris@49 384 // End position found?
Chris@49 385 if (SpMat<eT>::row_indices[i] > in_row2)
Chris@49 386 {
Chris@49 387 end = i;
Chris@49 388 end_found = true;
Chris@49 389 break;
Chris@49 390 }
Chris@49 391 }
Chris@49 392
Chris@49 393 if (!end_found)
Chris@49 394 {
Chris@49 395 end = SpMat<eT>::n_nonzero;
Chris@49 396 }
Chris@49 397
Chris@49 398 // Now we can make the copy.
Chris@49 399 if (start != end)
Chris@49 400 {
Chris@49 401 const uword elem_diff = end - start;
Chris@49 402
Chris@49 403 eT* new_values = memory::acquire_chunked<eT> (SpMat<eT>::n_nonzero - elem_diff);
Chris@49 404 uword* new_row_indices = memory::acquire_chunked<uword>(SpMat<eT>::n_nonzero - elem_diff);
Chris@49 405
Chris@49 406 // Copy before the section we are dropping (if it exists).
Chris@49 407 if (start > 0)
Chris@49 408 {
Chris@49 409 arrayops::copy(new_values, SpMat<eT>::values, start);
Chris@49 410 arrayops::copy(new_row_indices, SpMat<eT>::row_indices, start);
Chris@49 411 }
Chris@49 412
Chris@49 413 // Copy after the section we are dropping (if it exists).
Chris@49 414 if (end != SpMat<eT>::n_nonzero)
Chris@49 415 {
Chris@49 416 arrayops::copy(new_values + start, SpMat<eT>::values + end, (SpMat<eT>::n_nonzero - end));
Chris@49 417 arrayops::copy(new_row_indices + start, SpMat<eT>::row_indices + end, (SpMat<eT>::n_nonzero - end));
Chris@49 418 arrayops::inplace_minus(new_row_indices + start, diff, (SpMat<eT>::n_nonzero - end));
Chris@49 419 }
Chris@49 420
Chris@49 421 memory::release(SpMat<eT>::values);
Chris@49 422 memory::release(SpMat<eT>::row_indices);
Chris@49 423
Chris@49 424 access::rw(SpMat<eT>::values) = new_values;
Chris@49 425 access::rw(SpMat<eT>::row_indices) = new_row_indices;
Chris@49 426
Chris@49 427 access::rw(SpMat<eT>::n_nonzero) -= elem_diff;
Chris@49 428 access::rw(SpMat<eT>::col_ptrs[1]) -= elem_diff;
Chris@49 429 }
Chris@49 430
Chris@49 431 access::rw(SpMat<eT>::n_rows) -= diff;
Chris@49 432 access::rw(SpMat<eT>::n_elem) -= diff;
Chris@49 433
Chris@49 434 }
Chris@49 435
Chris@49 436
Chris@49 437
Chris@49 438 // //! insert N rows at the specified row position,
Chris@49 439 // //! optionally setting the elements of the inserted rows to zero
Chris@49 440 // template<typename eT>
Chris@49 441 // inline
Chris@49 442 // void
Chris@49 443 // SpCol<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)
Chris@49 444 // {
Chris@49 445 // arma_extra_debug_sigprint();
Chris@49 446 //
Chris@49 447 // arma_debug_check(set_to_zero == false, "SpCol::insert_rows(): cannot set nonzero values");
Chris@49 448 //
Chris@49 449 // arma_debug_check((row_num > SpMat<eT>::n_rows), "SpCol::insert_rows(): out of bounds");
Chris@49 450 //
Chris@49 451 // for(uword row = 0; row < SpMat<eT>::n_rows; ++row)
Chris@49 452 // {
Chris@49 453 // if (SpMat<eT>::row_indices[row] >= row_num)
Chris@49 454 // {
Chris@49 455 // access::rw(SpMat<eT>::row_indices[row]) += N;
Chris@49 456 // }
Chris@49 457 // }
Chris@49 458 //
Chris@49 459 // access::rw(SpMat<eT>::n_rows) += N;
Chris@49 460 // access::rw(SpMat<eT>::n_elem) += N;
Chris@49 461 // }
Chris@49 462 //
Chris@49 463 //
Chris@49 464 //
Chris@49 465 // //! insert the given object at the specified row position;
Chris@49 466 // //! the given object must have one column
Chris@49 467 // template<typename eT>
Chris@49 468 // template<typename T1>
Chris@49 469 // inline
Chris@49 470 // void
Chris@49 471 // SpCol<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)
Chris@49 472 // {
Chris@49 473 // arma_extra_debug_sigprint();
Chris@49 474 //
Chris@49 475 // SpMat<eT>::insert_rows(row_num, X);
Chris@49 476 // }
Chris@49 477
Chris@49 478
Chris@49 479
Chris@49 480 template<typename eT>
Chris@49 481 inline
Chris@49 482 typename SpCol<eT>::row_iterator
Chris@49 483 SpCol<eT>::begin_row(const uword row_num)
Chris@49 484 {
Chris@49 485 arma_extra_debug_sigprint();
Chris@49 486
Chris@49 487 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "begin_row(): index out of bounds");
Chris@49 488
Chris@49 489 return row_iterator(*this, row_num, 0);
Chris@49 490 }
Chris@49 491
Chris@49 492
Chris@49 493
Chris@49 494 template<typename eT>
Chris@49 495 inline
Chris@49 496 typename SpCol<eT>::const_row_iterator
Chris@49 497 SpCol<eT>::begin_row(const uword row_num) const
Chris@49 498 {
Chris@49 499 arma_extra_debug_sigprint();
Chris@49 500
Chris@49 501 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "begin_row(): index out of bounds");
Chris@49 502
Chris@49 503 return const_row_iterator(*this, row_num, 0);
Chris@49 504 }
Chris@49 505
Chris@49 506
Chris@49 507
Chris@49 508 template<typename eT>
Chris@49 509 inline
Chris@49 510 typename SpCol<eT>::row_iterator
Chris@49 511 SpCol<eT>::end_row(const uword row_num)
Chris@49 512 {
Chris@49 513 arma_extra_debug_sigprint();
Chris@49 514
Chris@49 515 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "end_row(): index out of bounds");
Chris@49 516
Chris@49 517 return row_iterator(*this, row_num + 1, 0);
Chris@49 518 }
Chris@49 519
Chris@49 520
Chris@49 521
Chris@49 522 template<typename eT>
Chris@49 523 inline
Chris@49 524 typename SpCol<eT>::const_row_iterator
Chris@49 525 SpCol<eT>::end_row(const uword row_num) const
Chris@49 526 {
Chris@49 527 arma_extra_debug_sigprint();
Chris@49 528
Chris@49 529 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "end_row(): index out of bounds");
Chris@49 530
Chris@49 531 return const_row_iterator(*this, row_num + 1, 0);
Chris@49 532 }
Chris@49 533
Chris@49 534
Chris@49 535
Chris@49 536 #ifdef ARMA_EXTRA_SPCOL_MEAT
Chris@49 537 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPCOL_MEAT)
Chris@49 538 #endif
Chris@49 539
Chris@49 540
Chris@49 541
Chris@49 542 //! @}