annotate armadillo-3.900.4/include/armadillo_bits/arrayops_meat.hpp @ 64:b065acf30a54

Add CITATION file
author Chris Cannam
date Thu, 05 Sep 2013 17:31:08 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2011-2013 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2011-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 arrayops
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13
Chris@49 14 template<typename eT>
Chris@49 15 arma_hot
Chris@49 16 arma_inline
Chris@49 17 void
Chris@49 18 arrayops::copy(eT* dest, const eT* src, const uword n_elem)
Chris@49 19 {
Chris@49 20 switch(n_elem)
Chris@49 21 {
Chris@49 22 default:
Chris@49 23 arrayops::copy_big(dest, src, n_elem);
Chris@49 24 break;
Chris@49 25 case 8:
Chris@49 26 dest[7] = src[7];
Chris@49 27 case 7:
Chris@49 28 dest[6] = src[6];
Chris@49 29 case 6:
Chris@49 30 dest[5] = src[5];
Chris@49 31 case 5:
Chris@49 32 dest[4] = src[4];
Chris@49 33 case 4:
Chris@49 34 dest[3] = src[3];
Chris@49 35 case 3:
Chris@49 36 dest[2] = src[2];
Chris@49 37 case 2:
Chris@49 38 dest[1] = src[1];
Chris@49 39 case 1:
Chris@49 40 dest[0] = src[0];
Chris@49 41 }
Chris@49 42 }
Chris@49 43
Chris@49 44
Chris@49 45
Chris@49 46 template<typename eT>
Chris@49 47 inline
Chris@49 48 void
Chris@49 49 arrayops::copy_big(eT* dest, const eT* src, const uword n_elem)
Chris@49 50 {
Chris@49 51 switch(n_elem)
Chris@49 52 {
Chris@49 53 default:
Chris@49 54 std::memcpy(dest, src, n_elem*sizeof(eT));
Chris@49 55 break;
Chris@49 56 case 32:
Chris@49 57 dest[31] = src[31];
Chris@49 58 case 31:
Chris@49 59 dest[30] = src[30];
Chris@49 60 case 30:
Chris@49 61 dest[29] = src[29];
Chris@49 62 case 29:
Chris@49 63 dest[28] = src[28];
Chris@49 64 case 28:
Chris@49 65 dest[27] = src[27];
Chris@49 66 case 27:
Chris@49 67 dest[26] = src[26];
Chris@49 68 case 26:
Chris@49 69 dest[25] = src[25];
Chris@49 70 case 25:
Chris@49 71 dest[24] = src[24];
Chris@49 72 case 24:
Chris@49 73 dest[23] = src[23];
Chris@49 74 case 23:
Chris@49 75 dest[22] = src[22];
Chris@49 76 case 22:
Chris@49 77 dest[21] = src[21];
Chris@49 78 case 21:
Chris@49 79 dest[20] = src[20];
Chris@49 80 case 20:
Chris@49 81 dest[19] = src[19];
Chris@49 82 case 19:
Chris@49 83 dest[18] = src[18];
Chris@49 84 case 18:
Chris@49 85 dest[17] = src[17];
Chris@49 86 case 17:
Chris@49 87 dest[16] = src[16];
Chris@49 88 case 16:
Chris@49 89 dest[15] = src[15];
Chris@49 90 case 15:
Chris@49 91 dest[14] = src[14];
Chris@49 92 case 14:
Chris@49 93 dest[13] = src[13];
Chris@49 94 case 13:
Chris@49 95 dest[12] = src[12];
Chris@49 96 case 12:
Chris@49 97 dest[11] = src[11];
Chris@49 98 case 11:
Chris@49 99 dest[10] = src[10];
Chris@49 100 case 10:
Chris@49 101 dest[9] = src[9];
Chris@49 102 case 9:
Chris@49 103 dest[8] = src[8];
Chris@49 104 case 8:
Chris@49 105 dest[7] = src[7];
Chris@49 106 case 7:
Chris@49 107 dest[6] = src[6];
Chris@49 108 case 6:
Chris@49 109 dest[5] = src[5];
Chris@49 110 case 5:
Chris@49 111 dest[4] = src[4];
Chris@49 112 case 4:
Chris@49 113 dest[3] = src[3];
Chris@49 114 case 3:
Chris@49 115 dest[2] = src[2];
Chris@49 116 case 2:
Chris@49 117 dest[1] = src[1];
Chris@49 118 case 1:
Chris@49 119 dest[0] = src[0];
Chris@49 120 }
Chris@49 121 }
Chris@49 122
Chris@49 123
Chris@49 124
Chris@49 125 template<typename eT>
Chris@49 126 arma_hot
Chris@49 127 inline
Chris@49 128 void
Chris@49 129 arrayops::copy_forwards(eT* dest, const eT* src, const uword n_elem)
Chris@49 130 {
Chris@49 131 // can't use std::memcpy(), as we don't know how it copies data
Chris@49 132 uword i,j;
Chris@49 133
Chris@49 134 for(i=0, j=1; j < n_elem; i+=2, j+=2)
Chris@49 135 {
Chris@49 136 dest[i] = src[i];
Chris@49 137 dest[j] = src[j];
Chris@49 138 }
Chris@49 139
Chris@49 140 if(i < n_elem)
Chris@49 141 {
Chris@49 142 dest[i] = src[i];
Chris@49 143 }
Chris@49 144 }
Chris@49 145
Chris@49 146
Chris@49 147
Chris@49 148 // template<typename eT>
Chris@49 149 // arma_hot
Chris@49 150 // inline
Chris@49 151 // void
Chris@49 152 // arrayops::copy_backwards(eT* dest, const eT* src, const uword n_elem)
Chris@49 153 // {
Chris@49 154 // // can't use std::memcpy(), as we don't know how it copies data
Chris@49 155 //
Chris@49 156 // switch(n_elem)
Chris@49 157 // {
Chris@49 158 // default:
Chris@49 159 // for(uword i = (n_elem-1); i >= 1; --i) { dest[i] = src[i]; }
Chris@49 160 // // NOTE: the 'break' statement has been deliberately omitted
Chris@49 161 // case 1:
Chris@49 162 // dest[0] = src[0];
Chris@49 163 // case 0:
Chris@49 164 // ;
Chris@49 165 // }
Chris@49 166 // }
Chris@49 167
Chris@49 168
Chris@49 169
Chris@49 170 template<typename eT>
Chris@49 171 arma_hot
Chris@49 172 inline
Chris@49 173 void
Chris@49 174 arrayops::copy_backwards(eT* dest, const eT* src, const uword n_elem)
Chris@49 175 {
Chris@49 176 // can't use std::memcpy(), as we don't know how it copies data
Chris@49 177
Chris@49 178 switch(n_elem)
Chris@49 179 {
Chris@49 180 default:
Chris@49 181 {
Chris@49 182 uword i, j;
Chris@49 183 for(i = (n_elem-1), j = (n_elem-2); j >= 2; i-=2, j-=2)
Chris@49 184 {
Chris@49 185 const eT tmp_i = src[i];
Chris@49 186 const eT tmp_j = src[j];
Chris@49 187
Chris@49 188 dest[i] = tmp_i;
Chris@49 189 dest[j] = tmp_j;
Chris@49 190 }
Chris@49 191
Chris@49 192 // j is less than 2: it can be 1 or 0
Chris@49 193 // i is j+1, ie. less than 3: it can be 2 or 1
Chris@49 194
Chris@49 195 if(i == 2)
Chris@49 196 {
Chris@49 197 dest[2] = src[2];
Chris@49 198 }
Chris@49 199 }
Chris@49 200 // NOTE: the 'break' statement has been deliberately omitted
Chris@49 201 case 2:
Chris@49 202 dest[1] = src[1];
Chris@49 203 case 1:
Chris@49 204 dest[0] = src[0];
Chris@49 205 case 0:
Chris@49 206 ;
Chris@49 207 }
Chris@49 208 }
Chris@49 209
Chris@49 210
Chris@49 211
Chris@49 212 template<typename out_eT, typename in_eT>
Chris@49 213 arma_hot
Chris@49 214 arma_inline
Chris@49 215 void
Chris@49 216 arrayops::convert_cx_scalar
Chris@49 217 (
Chris@49 218 out_eT& out,
Chris@49 219 const in_eT& in,
Chris@49 220 const typename arma_not_cx<out_eT>::result* junk1,
Chris@49 221 const typename arma_not_cx< in_eT>::result* junk2
Chris@49 222 )
Chris@49 223 {
Chris@49 224 arma_ignore(junk1);
Chris@49 225 arma_ignore(junk2);
Chris@49 226
Chris@49 227 out = out_eT(in);
Chris@49 228 }
Chris@49 229
Chris@49 230
Chris@49 231
Chris@49 232 template<typename out_eT, typename in_T>
Chris@49 233 arma_hot
Chris@49 234 arma_inline
Chris@49 235 void
Chris@49 236 arrayops::convert_cx_scalar
Chris@49 237 (
Chris@49 238 out_eT& out,
Chris@49 239 const std::complex<in_T>& in,
Chris@49 240 const typename arma_not_cx<out_eT>::result* junk
Chris@49 241 )
Chris@49 242 {
Chris@49 243 arma_ignore(junk);
Chris@49 244
Chris@49 245 out = out_eT( in.real() );
Chris@49 246 }
Chris@49 247
Chris@49 248
Chris@49 249
Chris@49 250 template<typename out_T, typename in_T>
Chris@49 251 arma_hot
Chris@49 252 arma_inline
Chris@49 253 void
Chris@49 254 arrayops::convert_cx_scalar
Chris@49 255 (
Chris@49 256 std::complex<out_T>& out,
Chris@49 257 const std::complex< in_T>& in
Chris@49 258 )
Chris@49 259 {
Chris@49 260 typedef std::complex<out_T> out_eT;
Chris@49 261
Chris@49 262 out = out_eT(in);
Chris@49 263 }
Chris@49 264
Chris@49 265
Chris@49 266
Chris@49 267 template<typename out_eT, typename in_eT>
Chris@49 268 arma_hot
Chris@49 269 inline
Chris@49 270 void
Chris@49 271 arrayops::convert(out_eT* dest, const in_eT* src, const uword n_elem)
Chris@49 272 {
Chris@49 273 uword i,j;
Chris@49 274
Chris@49 275 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 276 {
Chris@49 277 const in_eT tmp_i = src[i];
Chris@49 278 const in_eT tmp_j = src[j];
Chris@49 279
Chris@49 280 // dest[i] = out_eT( tmp_i );
Chris@49 281 // dest[j] = out_eT( tmp_j );
Chris@49 282
Chris@49 283 dest[i] = (is_signed<out_eT>::value)
Chris@49 284 ? out_eT( tmp_i )
Chris@49 285 : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) );
Chris@49 286
Chris@49 287 dest[j] = (is_signed<out_eT>::value)
Chris@49 288 ? out_eT( tmp_j )
Chris@49 289 : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_j, in_eT(0)) ? out_eT(0) : out_eT(tmp_j) );
Chris@49 290 }
Chris@49 291
Chris@49 292 if(i < n_elem)
Chris@49 293 {
Chris@49 294 const in_eT tmp_i = src[i];
Chris@49 295
Chris@49 296 // dest[i] = out_eT( tmp_i );
Chris@49 297
Chris@49 298 dest[i] = (is_signed<out_eT>::value)
Chris@49 299 ? out_eT( tmp_i )
Chris@49 300 : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) );
Chris@49 301 }
Chris@49 302 }
Chris@49 303
Chris@49 304
Chris@49 305
Chris@49 306 template<typename out_eT, typename in_eT>
Chris@49 307 arma_hot
Chris@49 308 inline
Chris@49 309 void
Chris@49 310 arrayops::convert_cx(out_eT* dest, const in_eT* src, const uword n_elem)
Chris@49 311 {
Chris@49 312 uword i,j;
Chris@49 313
Chris@49 314 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 315 {
Chris@49 316 arrayops::convert_cx_scalar( dest[i], src[i] );
Chris@49 317 arrayops::convert_cx_scalar( dest[j], src[j] );
Chris@49 318 }
Chris@49 319
Chris@49 320 if(i < n_elem)
Chris@49 321 {
Chris@49 322 arrayops::convert_cx_scalar( dest[i], src[i] );
Chris@49 323 }
Chris@49 324 }
Chris@49 325
Chris@49 326
Chris@49 327
Chris@49 328 template<typename eT>
Chris@49 329 arma_hot
Chris@49 330 inline
Chris@49 331 void
Chris@49 332 arrayops::inplace_plus(eT* dest, const eT* src, const uword n_elem)
Chris@49 333 {
Chris@49 334 if(memory::is_aligned(dest))
Chris@49 335 {
Chris@49 336 memory::mark_as_aligned(dest);
Chris@49 337
Chris@49 338 if(memory::is_aligned(src))
Chris@49 339 {
Chris@49 340 memory::mark_as_aligned(src);
Chris@49 341
Chris@49 342 arrayops::inplace_plus_base(dest, src, n_elem);
Chris@49 343 }
Chris@49 344 else
Chris@49 345 {
Chris@49 346 arrayops::inplace_plus_base(dest, src, n_elem);
Chris@49 347 }
Chris@49 348 }
Chris@49 349 else
Chris@49 350 {
Chris@49 351 if(memory::is_aligned(src))
Chris@49 352 {
Chris@49 353 memory::mark_as_aligned(src);
Chris@49 354
Chris@49 355 arrayops::inplace_plus_base(dest, src, n_elem);
Chris@49 356 }
Chris@49 357 else
Chris@49 358 {
Chris@49 359 arrayops::inplace_plus_base(dest, src, n_elem);
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 arma_hot
Chris@49 368 inline
Chris@49 369 void
Chris@49 370 arrayops::inplace_minus(eT* dest, const eT* src, const uword n_elem)
Chris@49 371 {
Chris@49 372 if(memory::is_aligned(dest))
Chris@49 373 {
Chris@49 374 memory::mark_as_aligned(dest);
Chris@49 375
Chris@49 376 if(memory::is_aligned(src))
Chris@49 377 {
Chris@49 378 memory::mark_as_aligned(src);
Chris@49 379
Chris@49 380 arrayops::inplace_minus_base(dest, src, n_elem);
Chris@49 381 }
Chris@49 382 else
Chris@49 383 {
Chris@49 384 arrayops::inplace_minus_base(dest, src, n_elem);
Chris@49 385 }
Chris@49 386 }
Chris@49 387 else
Chris@49 388 {
Chris@49 389 if(memory::is_aligned(src))
Chris@49 390 {
Chris@49 391 memory::mark_as_aligned(src);
Chris@49 392
Chris@49 393 arrayops::inplace_minus_base(dest, src, n_elem);
Chris@49 394 }
Chris@49 395 else
Chris@49 396 {
Chris@49 397 arrayops::inplace_minus_base(dest, src, n_elem);
Chris@49 398 }
Chris@49 399 }
Chris@49 400 }
Chris@49 401
Chris@49 402
Chris@49 403
Chris@49 404 template<typename eT>
Chris@49 405 arma_hot
Chris@49 406 inline
Chris@49 407 void
Chris@49 408 arrayops::inplace_mul(eT* dest, const eT* src, const uword n_elem)
Chris@49 409 {
Chris@49 410 if(memory::is_aligned(dest))
Chris@49 411 {
Chris@49 412 memory::mark_as_aligned(dest);
Chris@49 413
Chris@49 414 if(memory::is_aligned(src))
Chris@49 415 {
Chris@49 416 memory::mark_as_aligned(src);
Chris@49 417
Chris@49 418 arrayops::inplace_mul_base(dest, src, n_elem);
Chris@49 419 }
Chris@49 420 else
Chris@49 421 {
Chris@49 422 arrayops::inplace_mul_base(dest, src, n_elem);
Chris@49 423 }
Chris@49 424 }
Chris@49 425 else
Chris@49 426 {
Chris@49 427 if(memory::is_aligned(src))
Chris@49 428 {
Chris@49 429 memory::mark_as_aligned(src);
Chris@49 430
Chris@49 431 arrayops::inplace_mul_base(dest, src, n_elem);
Chris@49 432 }
Chris@49 433 else
Chris@49 434 {
Chris@49 435 arrayops::inplace_mul_base(dest, src, n_elem);
Chris@49 436 }
Chris@49 437 }
Chris@49 438 }
Chris@49 439
Chris@49 440
Chris@49 441
Chris@49 442 template<typename eT>
Chris@49 443 arma_hot
Chris@49 444 inline
Chris@49 445 void
Chris@49 446 arrayops::inplace_div(eT* dest, const eT* src, const uword n_elem)
Chris@49 447 {
Chris@49 448 if(memory::is_aligned(dest))
Chris@49 449 {
Chris@49 450 memory::mark_as_aligned(dest);
Chris@49 451
Chris@49 452 if(memory::is_aligned(src))
Chris@49 453 {
Chris@49 454 memory::mark_as_aligned(src);
Chris@49 455
Chris@49 456 arrayops::inplace_div_base(dest, src, n_elem);
Chris@49 457 }
Chris@49 458 else
Chris@49 459 {
Chris@49 460 arrayops::inplace_div_base(dest, src, n_elem);
Chris@49 461 }
Chris@49 462 }
Chris@49 463 else
Chris@49 464 {
Chris@49 465 if(memory::is_aligned(src))
Chris@49 466 {
Chris@49 467 memory::mark_as_aligned(src);
Chris@49 468
Chris@49 469 arrayops::inplace_div_base(dest, src, n_elem);
Chris@49 470 }
Chris@49 471 else
Chris@49 472 {
Chris@49 473 arrayops::inplace_div_base(dest, src, n_elem);
Chris@49 474 }
Chris@49 475 }
Chris@49 476 }
Chris@49 477
Chris@49 478
Chris@49 479
Chris@49 480 template<typename eT>
Chris@49 481 arma_hot
Chris@49 482 inline
Chris@49 483 void
Chris@49 484 arrayops::inplace_plus_base(eT* dest, const eT* src, const uword n_elem)
Chris@49 485 {
Chris@49 486 uword i,j;
Chris@49 487
Chris@49 488 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 489 {
Chris@49 490 const eT tmp_i = src[i];
Chris@49 491 const eT tmp_j = src[j];
Chris@49 492
Chris@49 493 dest[i] += tmp_i;
Chris@49 494 dest[j] += tmp_j;
Chris@49 495 }
Chris@49 496
Chris@49 497 if(i < n_elem)
Chris@49 498 {
Chris@49 499 dest[i] += src[i];
Chris@49 500 }
Chris@49 501 }
Chris@49 502
Chris@49 503
Chris@49 504
Chris@49 505 template<typename eT>
Chris@49 506 arma_hot
Chris@49 507 inline
Chris@49 508 void
Chris@49 509 arrayops::inplace_minus_base(eT* dest, const eT* src, const uword n_elem)
Chris@49 510 {
Chris@49 511 uword i,j;
Chris@49 512
Chris@49 513 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 514 {
Chris@49 515 const eT tmp_i = src[i];
Chris@49 516 const eT tmp_j = src[j];
Chris@49 517
Chris@49 518 dest[i] -= tmp_i;
Chris@49 519 dest[j] -= tmp_j;
Chris@49 520 }
Chris@49 521
Chris@49 522 if(i < n_elem)
Chris@49 523 {
Chris@49 524 dest[i] -= src[i];
Chris@49 525 }
Chris@49 526 }
Chris@49 527
Chris@49 528
Chris@49 529
Chris@49 530 template<typename eT>
Chris@49 531 arma_hot
Chris@49 532 inline
Chris@49 533 void
Chris@49 534 arrayops::inplace_mul_base(eT* dest, const eT* src, const uword n_elem)
Chris@49 535 {
Chris@49 536 uword i,j;
Chris@49 537
Chris@49 538 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 539 {
Chris@49 540 const eT tmp_i = src[i];
Chris@49 541 const eT tmp_j = src[j];
Chris@49 542
Chris@49 543 dest[i] *= tmp_i;
Chris@49 544 dest[j] *= tmp_j;
Chris@49 545 }
Chris@49 546
Chris@49 547 if(i < n_elem)
Chris@49 548 {
Chris@49 549 dest[i] *= src[i];
Chris@49 550 }
Chris@49 551 }
Chris@49 552
Chris@49 553
Chris@49 554
Chris@49 555 template<typename eT>
Chris@49 556 arma_hot
Chris@49 557 inline
Chris@49 558 void
Chris@49 559 arrayops::inplace_div_base(eT* dest, const eT* src, const uword n_elem)
Chris@49 560 {
Chris@49 561 uword i,j;
Chris@49 562
Chris@49 563 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 564 {
Chris@49 565 const eT tmp_i = src[i];
Chris@49 566 const eT tmp_j = src[j];
Chris@49 567
Chris@49 568 dest[i] /= tmp_i;
Chris@49 569 dest[j] /= tmp_j;
Chris@49 570 }
Chris@49 571
Chris@49 572 if(i < n_elem)
Chris@49 573 {
Chris@49 574 dest[i] /= src[i];
Chris@49 575 }
Chris@49 576 }
Chris@49 577
Chris@49 578
Chris@49 579
Chris@49 580 template<typename eT>
Chris@49 581 arma_hot
Chris@49 582 inline
Chris@49 583 void
Chris@49 584 arrayops::inplace_set(eT* dest, const eT val, const uword n_elem)
Chris@49 585 {
Chris@49 586 if(memory::is_aligned(dest))
Chris@49 587 {
Chris@49 588 memory::mark_as_aligned(dest);
Chris@49 589
Chris@49 590 uword i,j;
Chris@49 591
Chris@49 592 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 593 {
Chris@49 594 dest[i] = val;
Chris@49 595 dest[j] = val;
Chris@49 596 }
Chris@49 597
Chris@49 598 if(i < n_elem)
Chris@49 599 {
Chris@49 600 dest[i] = val;
Chris@49 601 }
Chris@49 602 }
Chris@49 603 else
Chris@49 604 {
Chris@49 605 uword i,j;
Chris@49 606
Chris@49 607 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 608 {
Chris@49 609 dest[i] = val;
Chris@49 610 dest[j] = val;
Chris@49 611 }
Chris@49 612
Chris@49 613 if(i < n_elem)
Chris@49 614 {
Chris@49 615 dest[i] = val;
Chris@49 616 }
Chris@49 617 }
Chris@49 618 }
Chris@49 619
Chris@49 620
Chris@49 621
Chris@49 622 template<typename eT, const uword n_elem>
Chris@49 623 arma_hot
Chris@49 624 inline
Chris@49 625 void
Chris@49 626 arrayops::inplace_set_fixed(eT* dest, const eT val)
Chris@49 627 {
Chris@49 628 for(uword i=0; i<n_elem; ++i)
Chris@49 629 {
Chris@49 630 dest[i] = val;
Chris@49 631 }
Chris@49 632 }
Chris@49 633
Chris@49 634
Chris@49 635
Chris@49 636 template<typename eT>
Chris@49 637 arma_hot
Chris@49 638 inline
Chris@49 639 void
Chris@49 640 arrayops::inplace_plus(eT* dest, const eT val, const uword n_elem)
Chris@49 641 {
Chris@49 642 if(memory::is_aligned(dest))
Chris@49 643 {
Chris@49 644 memory::mark_as_aligned(dest);
Chris@49 645
Chris@49 646 uword i,j;
Chris@49 647
Chris@49 648 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 649 {
Chris@49 650 dest[i] += val;
Chris@49 651 dest[j] += val;
Chris@49 652 }
Chris@49 653
Chris@49 654 if(i < n_elem)
Chris@49 655 {
Chris@49 656 dest[i] += val;
Chris@49 657 }
Chris@49 658 }
Chris@49 659 else
Chris@49 660 {
Chris@49 661 uword i,j;
Chris@49 662
Chris@49 663 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 664 {
Chris@49 665 dest[i] += val;
Chris@49 666 dest[j] += val;
Chris@49 667 }
Chris@49 668
Chris@49 669 if(i < n_elem)
Chris@49 670 {
Chris@49 671 dest[i] += val;
Chris@49 672 }
Chris@49 673 }
Chris@49 674 }
Chris@49 675
Chris@49 676
Chris@49 677
Chris@49 678 template<typename eT>
Chris@49 679 arma_hot
Chris@49 680 inline
Chris@49 681 void
Chris@49 682 arrayops::inplace_minus(eT* dest, const eT val, const uword n_elem)
Chris@49 683 {
Chris@49 684 if(memory::is_aligned(dest))
Chris@49 685 {
Chris@49 686 memory::mark_as_aligned(dest);
Chris@49 687
Chris@49 688 uword i,j;
Chris@49 689
Chris@49 690 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 691 {
Chris@49 692 dest[i] -= val;
Chris@49 693 dest[j] -= val;
Chris@49 694 }
Chris@49 695
Chris@49 696 if(i < n_elem)
Chris@49 697 {
Chris@49 698 dest[i] -= val;
Chris@49 699 }
Chris@49 700 }
Chris@49 701 else
Chris@49 702 {
Chris@49 703 uword i,j;
Chris@49 704
Chris@49 705 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 706 {
Chris@49 707 dest[i] -= val;
Chris@49 708 dest[j] -= val;
Chris@49 709 }
Chris@49 710
Chris@49 711 if(i < n_elem)
Chris@49 712 {
Chris@49 713 dest[i] -= val;
Chris@49 714 }
Chris@49 715 }
Chris@49 716 }
Chris@49 717
Chris@49 718
Chris@49 719
Chris@49 720 template<typename eT>
Chris@49 721 arma_hot
Chris@49 722 inline
Chris@49 723 void
Chris@49 724 arrayops::inplace_mul(eT* dest, const eT val, const uword n_elem)
Chris@49 725 {
Chris@49 726 if(memory::is_aligned(dest))
Chris@49 727 {
Chris@49 728 memory::mark_as_aligned(dest);
Chris@49 729
Chris@49 730 uword i,j;
Chris@49 731
Chris@49 732 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 733 {
Chris@49 734 dest[i] *= val;
Chris@49 735 dest[j] *= val;
Chris@49 736 }
Chris@49 737
Chris@49 738 if(i < n_elem)
Chris@49 739 {
Chris@49 740 dest[i] *= val;
Chris@49 741 }
Chris@49 742 }
Chris@49 743 else
Chris@49 744 {
Chris@49 745 uword i,j;
Chris@49 746
Chris@49 747 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 748 {
Chris@49 749 dest[i] *= val;
Chris@49 750 dest[j] *= val;
Chris@49 751 }
Chris@49 752
Chris@49 753 if(i < n_elem)
Chris@49 754 {
Chris@49 755 dest[i] *= val;
Chris@49 756 }
Chris@49 757 }
Chris@49 758 }
Chris@49 759
Chris@49 760
Chris@49 761
Chris@49 762 template<typename eT>
Chris@49 763 arma_hot
Chris@49 764 inline
Chris@49 765 void
Chris@49 766 arrayops::inplace_div(eT* dest, const eT val, const uword n_elem)
Chris@49 767 {
Chris@49 768 if(memory::is_aligned(dest))
Chris@49 769 {
Chris@49 770 memory::mark_as_aligned(dest);
Chris@49 771
Chris@49 772 uword i,j;
Chris@49 773
Chris@49 774 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 775 {
Chris@49 776 dest[i] /= val;
Chris@49 777 dest[j] /= val;
Chris@49 778 }
Chris@49 779
Chris@49 780 if(i < n_elem)
Chris@49 781 {
Chris@49 782 dest[i] /= val;
Chris@49 783 }
Chris@49 784 }
Chris@49 785 else
Chris@49 786 {
Chris@49 787 uword i,j;
Chris@49 788
Chris@49 789 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 790 {
Chris@49 791 dest[i] /= val;
Chris@49 792 dest[j] /= val;
Chris@49 793 }
Chris@49 794
Chris@49 795 if(i < n_elem)
Chris@49 796 {
Chris@49 797 dest[i] /= val;
Chris@49 798 }
Chris@49 799 }
Chris@49 800 }
Chris@49 801
Chris@49 802
Chris@49 803
Chris@49 804 template<typename eT>
Chris@49 805 arma_hot
Chris@49 806 arma_pure
Chris@49 807 inline
Chris@49 808 eT
Chris@49 809 arrayops::accumulate(const eT* src, const uword n_elem)
Chris@49 810 {
Chris@49 811 uword i,j;
Chris@49 812
Chris@49 813 eT acc1 = eT(0);
Chris@49 814 eT acc2 = eT(0);
Chris@49 815
Chris@49 816 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 817 {
Chris@49 818 acc1 += src[i];
Chris@49 819 acc2 += src[j];
Chris@49 820 }
Chris@49 821
Chris@49 822 if(i < n_elem)
Chris@49 823 {
Chris@49 824 acc1 += src[i];
Chris@49 825 }
Chris@49 826
Chris@49 827 return acc1 + acc2;
Chris@49 828 }
Chris@49 829
Chris@49 830
Chris@49 831
Chris@49 832 template<typename eT>
Chris@49 833 arma_hot
Chris@49 834 arma_pure
Chris@49 835 inline
Chris@49 836 eT
Chris@49 837 arrayops::product(const eT* src, const uword n_elem)
Chris@49 838 {
Chris@49 839 eT val1 = eT(1);
Chris@49 840 eT val2 = eT(1);
Chris@49 841
Chris@49 842 uword i,j;
Chris@49 843
Chris@49 844 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 845 {
Chris@49 846 val1 *= src[i];
Chris@49 847 val2 *= src[j];
Chris@49 848 }
Chris@49 849
Chris@49 850 if(i < n_elem)
Chris@49 851 {
Chris@49 852 val1 *= src[i];
Chris@49 853 }
Chris@49 854
Chris@49 855 return val1 * val2;
Chris@49 856 }
Chris@49 857
Chris@49 858
Chris@49 859
Chris@49 860 template<typename eT>
Chris@49 861 arma_hot
Chris@49 862 arma_pure
Chris@49 863 inline
Chris@49 864 bool
Chris@49 865 arrayops::is_finite(const eT* src, const uword n_elem)
Chris@49 866 {
Chris@49 867 uword i,j;
Chris@49 868
Chris@49 869 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 870 {
Chris@49 871 const eT val_i = src[i];
Chris@49 872 const eT val_j = src[j];
Chris@49 873
Chris@49 874 if( (arma_isfinite(val_i) == false) || (arma_isfinite(val_j) == false) )
Chris@49 875 {
Chris@49 876 return false;
Chris@49 877 }
Chris@49 878 }
Chris@49 879
Chris@49 880 if(i < n_elem)
Chris@49 881 {
Chris@49 882 if(arma_isfinite(src[i]) == false)
Chris@49 883 {
Chris@49 884 return false;
Chris@49 885 }
Chris@49 886 }
Chris@49 887
Chris@49 888 return true;
Chris@49 889 }
Chris@49 890
Chris@49 891
Chris@49 892
Chris@49 893 // TODO: this function is currently not used
Chris@49 894 template<typename eT>
Chris@49 895 arma_hot
Chris@49 896 arma_pure
Chris@49 897 inline
Chris@49 898 typename get_pod_type<eT>::result
Chris@49 899 arrayops::norm_1(const eT* src, const uword n_elem)
Chris@49 900 {
Chris@49 901 typedef typename get_pod_type<eT>::result T;
Chris@49 902
Chris@49 903 T acc = T(0);
Chris@49 904
Chris@49 905 uword i,j;
Chris@49 906
Chris@49 907 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 908 {
Chris@49 909 acc += std::abs(src[i]);
Chris@49 910 acc += std::abs(src[j]);
Chris@49 911 }
Chris@49 912
Chris@49 913 if(i < n_elem)
Chris@49 914 {
Chris@49 915 acc += std::abs(src[i]);
Chris@49 916 }
Chris@49 917
Chris@49 918 return acc;
Chris@49 919 }
Chris@49 920
Chris@49 921
Chris@49 922
Chris@49 923 // TODO: this function is currently not used
Chris@49 924 template<typename eT>
Chris@49 925 arma_hot
Chris@49 926 arma_pure
Chris@49 927 inline
Chris@49 928 eT
Chris@49 929 arrayops::norm_2(const eT* src, const uword n_elem, const typename arma_not_cx<eT>::result* junk)
Chris@49 930 {
Chris@49 931 arma_ignore(junk);
Chris@49 932
Chris@49 933 eT acc = eT(0);
Chris@49 934
Chris@49 935 uword i,j;
Chris@49 936
Chris@49 937 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 938 {
Chris@49 939 const eT tmp_i = src[i];
Chris@49 940 const eT tmp_j = src[j];
Chris@49 941
Chris@49 942 acc += tmp_i * tmp_i;
Chris@49 943 acc += tmp_j * tmp_j;
Chris@49 944 }
Chris@49 945
Chris@49 946 if(i < n_elem)
Chris@49 947 {
Chris@49 948 const eT tmp_i = src[i];
Chris@49 949
Chris@49 950 acc += tmp_i * tmp_i;
Chris@49 951 }
Chris@49 952
Chris@49 953 return std::sqrt(acc);
Chris@49 954 }
Chris@49 955
Chris@49 956
Chris@49 957
Chris@49 958 // TODO: this function is currently not used
Chris@49 959 template<typename T>
Chris@49 960 arma_hot
Chris@49 961 arma_pure
Chris@49 962 inline
Chris@49 963 T
Chris@49 964 arrayops::norm_2(const std::complex<T>* src, const uword n_elem)
Chris@49 965 {
Chris@49 966 T acc = T(0);
Chris@49 967
Chris@49 968 uword i,j;
Chris@49 969
Chris@49 970 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 971 {
Chris@49 972 const T tmp_i = std::abs(src[i]);
Chris@49 973 const T tmp_j = std::abs(src[j]);
Chris@49 974
Chris@49 975 acc += tmp_i * tmp_i;
Chris@49 976 acc += tmp_j * tmp_j;
Chris@49 977 }
Chris@49 978
Chris@49 979 if(i < n_elem)
Chris@49 980 {
Chris@49 981 const T tmp_i = std::abs(src[i]);
Chris@49 982
Chris@49 983 acc += tmp_i * tmp_i;
Chris@49 984 }
Chris@49 985
Chris@49 986 return std::sqrt(acc);
Chris@49 987 }
Chris@49 988
Chris@49 989
Chris@49 990
Chris@49 991 // TODO: this function is currently not used
Chris@49 992 template<typename eT>
Chris@49 993 arma_hot
Chris@49 994 arma_pure
Chris@49 995 inline
Chris@49 996 typename get_pod_type<eT>::result
Chris@49 997 arrayops::norm_k(const eT* src, const uword n_elem, const int k)
Chris@49 998 {
Chris@49 999 typedef typename get_pod_type<eT>::result T;
Chris@49 1000
Chris@49 1001 T acc = T(0);
Chris@49 1002
Chris@49 1003 uword i,j;
Chris@49 1004
Chris@49 1005 for(i=0, j=1; j<n_elem; i+=2, j+=2)
Chris@49 1006 {
Chris@49 1007 acc += std::pow(std::abs(src[i]), k);
Chris@49 1008 acc += std::pow(std::abs(src[j]), k);
Chris@49 1009 }
Chris@49 1010
Chris@49 1011 if(i < n_elem)
Chris@49 1012 {
Chris@49 1013 acc += std::pow(std::abs(src[i]), k);
Chris@49 1014 }
Chris@49 1015
Chris@49 1016 return std::pow(acc, T(1)/T(k));
Chris@49 1017 }
Chris@49 1018
Chris@49 1019
Chris@49 1020
Chris@49 1021 // TODO: this function is currently not used
Chris@49 1022 template<typename eT>
Chris@49 1023 arma_hot
Chris@49 1024 arma_pure
Chris@49 1025 inline
Chris@49 1026 typename get_pod_type<eT>::result
Chris@49 1027 arrayops::norm_max(const eT* src, const uword n_elem)
Chris@49 1028 {
Chris@49 1029 typedef typename get_pod_type<eT>::result T;
Chris@49 1030
Chris@49 1031 T max_val = std::abs(src[0]);
Chris@49 1032
Chris@49 1033 uword i,j;
Chris@49 1034
Chris@49 1035 for(i=1, j=2; j<n_elem; i+=2, j+=2)
Chris@49 1036 {
Chris@49 1037 const T tmp_i = std::abs(src[i]);
Chris@49 1038 const T tmp_j = std::abs(src[j]);
Chris@49 1039
Chris@49 1040 if(max_val < tmp_i) { max_val = tmp_i; }
Chris@49 1041 if(max_val < tmp_j) { max_val = tmp_j; }
Chris@49 1042 }
Chris@49 1043
Chris@49 1044 if(i < n_elem)
Chris@49 1045 {
Chris@49 1046 const T tmp_i = std::abs(src[i]);
Chris@49 1047
Chris@49 1048 if(max_val < tmp_i) { max_val = tmp_i; }
Chris@49 1049 }
Chris@49 1050
Chris@49 1051 return max_val;
Chris@49 1052 }
Chris@49 1053
Chris@49 1054
Chris@49 1055
Chris@49 1056 // TODO: this function is currently not used
Chris@49 1057 template<typename eT>
Chris@49 1058 arma_hot
Chris@49 1059 arma_pure
Chris@49 1060 inline
Chris@49 1061 typename get_pod_type<eT>::result
Chris@49 1062 arrayops::norm_min(const eT* src, const uword n_elem)
Chris@49 1063 {
Chris@49 1064 typedef typename get_pod_type<eT>::result T;
Chris@49 1065
Chris@49 1066 T min_val = std::abs(src[0]);
Chris@49 1067
Chris@49 1068 uword i,j;
Chris@49 1069
Chris@49 1070 for(i=1, j=2; j<n_elem; i+=2, j+=2)
Chris@49 1071 {
Chris@49 1072 const T tmp_i = std::abs(src[i]);
Chris@49 1073 const T tmp_j = std::abs(src[j]);
Chris@49 1074
Chris@49 1075 if(min_val > tmp_i) { min_val = tmp_i; }
Chris@49 1076 if(min_val > tmp_j) { min_val = tmp_j; }
Chris@49 1077 }
Chris@49 1078
Chris@49 1079 if(i < n_elem)
Chris@49 1080 {
Chris@49 1081 const T tmp_i = std::abs(src[i]);
Chris@49 1082
Chris@49 1083 if(min_val > tmp_i) { min_val = tmp_i; }
Chris@49 1084 }
Chris@49 1085
Chris@49 1086 return min_val;
Chris@49 1087 }
Chris@49 1088
Chris@49 1089
Chris@49 1090
Chris@49 1091 //! @}