max@0: // Copyright (C) 2011 NICTA (www.nicta.com.au) max@0: // Copyright (C) 2011 Conrad Sanderson max@0: // max@0: // This file is part of the Armadillo C++ library. max@0: // It is provided without any warranty of fitness max@0: // for any purpose. You can redistribute this file max@0: // and/or modify it under the terms of the GNU max@0: // Lesser General Public License (LGPL) as published max@0: // by the Free Software Foundation, either version 3 max@0: // of the License or (at your option) any later version. max@0: // (see http://www.opensource.org/licenses for more info) max@0: max@0: max@0: //! \addtogroup arrayops max@0: //! @{ max@0: max@0: max@0: max@0: template max@0: arma_hot max@0: arma_inline max@0: void max@0: arrayops::copy(eT* dest, const eT* src, const uword n_elem) max@0: { max@0: switch(n_elem) max@0: { max@0: default: max@0: arrayops::copy_big(dest, src, n_elem); max@0: break; max@0: case 8: max@0: dest[7] = src[7]; max@0: case 7: max@0: dest[6] = src[6]; max@0: case 6: max@0: dest[5] = src[5]; max@0: case 5: max@0: dest[4] = src[4]; max@0: case 4: max@0: dest[3] = src[3]; max@0: case 3: max@0: dest[2] = src[2]; max@0: case 2: max@0: dest[1] = src[1]; max@0: case 1: max@0: dest[0] = src[0]; max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: arrayops::copy_big(eT* dest, const eT* src, const uword n_elem) max@0: { max@0: switch(n_elem) max@0: { max@0: default: max@0: std::memcpy(dest, src, n_elem*sizeof(eT)); max@0: break; max@0: case 32: max@0: dest[31] = src[31]; max@0: case 31: max@0: dest[30] = src[30]; max@0: case 30: max@0: dest[29] = src[29]; max@0: case 29: max@0: dest[28] = src[28]; max@0: case 28: max@0: dest[27] = src[27]; max@0: case 27: max@0: dest[26] = src[26]; max@0: case 26: max@0: dest[25] = src[25]; max@0: case 25: max@0: dest[24] = src[24]; max@0: case 24: max@0: dest[23] = src[23]; max@0: case 23: max@0: dest[22] = src[22]; max@0: case 22: max@0: dest[21] = src[21]; max@0: case 21: max@0: dest[20] = src[20]; max@0: case 20: max@0: dest[19] = src[19]; max@0: case 19: max@0: dest[18] = src[18]; max@0: case 18: max@0: dest[17] = src[17]; max@0: case 17: max@0: dest[16] = src[16]; max@0: case 16: max@0: dest[15] = src[15]; max@0: case 15: max@0: dest[14] = src[14]; max@0: case 14: max@0: dest[13] = src[13]; max@0: case 13: max@0: dest[12] = src[12]; max@0: case 12: max@0: dest[11] = src[11]; max@0: case 11: max@0: dest[10] = src[10]; max@0: case 10: max@0: dest[9] = src[9]; max@0: case 9: max@0: dest[8] = src[8]; max@0: case 8: max@0: dest[7] = src[7]; max@0: case 7: max@0: dest[6] = src[6]; max@0: case 6: max@0: dest[5] = src[5]; max@0: case 5: max@0: dest[4] = src[4]; max@0: case 4: max@0: dest[3] = src[3]; max@0: case 3: max@0: dest[2] = src[2]; max@0: case 2: max@0: dest[1] = src[1]; max@0: case 1: max@0: dest[0] = src[0]; max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: arma_hot max@0: arma_inline max@0: void max@0: arrayops::convert_cx_scalar max@0: ( max@0: out_eT& out, max@0: const in_eT& in, max@0: const typename arma_not_cx::result* junk1, max@0: const typename arma_not_cx< in_eT>::result* junk2 max@0: ) max@0: { max@0: arma_ignore(junk1); max@0: arma_ignore(junk2); max@0: max@0: out = out_eT(in); max@0: } max@0: max@0: max@0: max@0: template max@0: arma_hot max@0: arma_inline max@0: void max@0: arrayops::convert_cx_scalar max@0: ( max@0: out_eT& out, max@0: const std::complex& in, max@0: const typename arma_not_cx::result* junk max@0: ) max@0: { max@0: arma_ignore(junk); max@0: max@0: out = out_eT( in.real() ); max@0: } max@0: max@0: max@0: max@0: template max@0: arma_hot max@0: arma_inline max@0: void max@0: arrayops::convert_cx_scalar max@0: ( max@0: std::complex& out, max@0: const std::complex< in_T>& in max@0: ) max@0: { max@0: typedef std::complex out_eT; max@0: max@0: out = out_eT(in); max@0: } max@0: max@0: max@0: max@0: template max@0: arma_hot max@0: inline max@0: void max@0: arrayops::convert(out_eT* dest, const in_eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::convert_cx(out_eT* dest, const in_eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_plus(eT* dest, const eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_minus(eT* dest, const eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_mul(eT* dest, const eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_div(eT* dest, const eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_set(eT* dest, const eT val, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_plus(eT* dest, const eT val, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_minus(eT* dest, const eT val, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_mul(eT* dest, const eT val, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: inline max@0: void max@0: arrayops::inplace_div(eT* dest, const eT val, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: eT max@0: arrayops::accumulate(const eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: eT acc1 = eT(0); max@0: eT acc2 = eT(0); max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: eT max@0: arrayops::product(const eT* src, const uword n_elem) max@0: { max@0: eT val1 = eT(1); max@0: eT val2 = eT(1); max@0: max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: bool max@0: arrayops::is_finite(const eT* src, const uword n_elem) max@0: { max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: typename get_pod_type::result max@0: arrayops::norm_1(const eT* src, const uword n_elem) max@0: { max@0: typedef typename get_pod_type::result T; max@0: max@0: T acc = T(0); max@0: max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: eT max@0: arrayops::norm_2(const eT* src, const uword n_elem, const typename arma_not_cx::result* junk) max@0: { max@0: arma_ignore(junk); max@0: max@0: eT acc = eT(0); max@0: max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: T max@0: arrayops::norm_2(const std::complex* src, const uword n_elem) max@0: { max@0: T acc = T(0); max@0: max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: typename get_pod_type::result max@0: arrayops::norm_k(const eT* src, const uword n_elem, const int k) max@0: { max@0: typedef typename get_pod_type::result T; max@0: max@0: T acc = T(0); max@0: max@0: uword i,j; max@0: max@0: for(i=0, j=1; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: typename get_pod_type::result max@0: arrayops::norm_max(const eT* src, const uword n_elem) max@0: { max@0: typedef typename get_pod_type::result T; max@0: max@0: T max_val = std::abs(src[0]); max@0: max@0: uword i,j; max@0: max@0: for(i=1, j=2; j max@0: arma_hot max@0: arma_pure max@0: inline max@0: typename get_pod_type::result max@0: arrayops::norm_min(const eT* src, const uword n_elem) max@0: { max@0: typedef typename get_pod_type::result T; max@0: max@0: T min_val = std::abs(src[0]); max@0: max@0: uword i,j; max@0: max@0: for(i=1, j=2; j tmp_i) { min_val = tmp_i; } max@0: if(min_val > tmp_j) { min_val = tmp_j; } max@0: } max@0: max@0: if(i < n_elem) max@0: { max@0: const T tmp_i = std::abs(src[i]); max@0: max@0: if(min_val > tmp_i) { min_val = tmp_i; } max@0: } max@0: max@0: return min_val; max@0: } max@0: max@0: max@0: max@0: //! @}