Chris@49: // Copyright (C) 2010-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2010-2013 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup glue_conv Chris@49: //! @{ Chris@49: Chris@49: Chris@49: //! rudimentary implementation of the convolution operation Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_conv::apply(Mat& out, const Glue& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap_check A_tmp(X.A, out); Chris@49: const unwrap_check B_tmp(X.B, out); Chris@49: Chris@49: const Mat& A = A_tmp.M; Chris@49: const Mat& B = B_tmp.M; Chris@49: Chris@49: arma_debug_check Chris@49: ( Chris@49: ( ((A.is_vec() == false) && (A.is_empty() == false)) || ((B.is_vec() == false) && (B.is_empty() == false)) ), Chris@49: "conv(): given object is not a vector" Chris@49: ); Chris@49: Chris@49: Chris@49: const Mat& h = (A.n_elem <= B.n_elem) ? A : B; Chris@49: const Mat& x = (A.n_elem <= B.n_elem) ? B : A; Chris@49: Chris@49: Chris@49: const uword h_n_elem = h.n_elem; Chris@49: const uword x_n_elem = x.n_elem; Chris@49: const uword out_n_elem = h_n_elem + x_n_elem - 1; Chris@49: Chris@49: Chris@49: if( (h_n_elem == 0) || (x_n_elem == 0) ) Chris@49: { Chris@49: out.reset(); Chris@49: return; Chris@49: } Chris@49: Chris@49: Chris@49: (A.n_cols == 1) ? out.set_size(out_n_elem, 1) : out.set_size(1, out_n_elem); Chris@49: Chris@49: Chris@49: const eT* h_mem = h.memptr(); Chris@49: const eT* x_mem = x.memptr(); Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: Chris@49: for(uword out_i = 0; out_i < (h_n_elem-1); ++out_i) Chris@49: { Chris@49: eT acc = eT(0); Chris@49: Chris@49: uword h_i = out_i; Chris@49: Chris@49: for(uword x_i = 0; x_i <= out_i; ++x_i, --h_i) Chris@49: { Chris@49: acc += h_mem[h_i] * x_mem[x_i]; Chris@49: } Chris@49: Chris@49: out_mem[out_i] = acc; Chris@49: } Chris@49: Chris@49: Chris@49: for(uword out_i = h_n_elem-1; out_i < out_n_elem - (h_n_elem-1); ++out_i) Chris@49: { Chris@49: eT acc = eT(0); Chris@49: Chris@49: uword h_i = h_n_elem - 1; Chris@49: Chris@49: for(uword x_i = out_i - h_n_elem + 1; x_i <= out_i; ++x_i, --h_i) Chris@49: { Chris@49: acc += h_mem[h_i] * x_mem[x_i]; Chris@49: } Chris@49: Chris@49: out_mem[out_i] = acc; Chris@49: } Chris@49: Chris@49: Chris@49: for(uword out_i = out_n_elem - (h_n_elem-1); out_i < out_n_elem; ++out_i) Chris@49: { Chris@49: eT acc = eT(0); Chris@49: Chris@49: uword h_i = h_n_elem - 1; Chris@49: Chris@49: for(uword x_i = out_i - h_n_elem + 1; x_i < x_n_elem; ++x_i, --h_i) Chris@49: { Chris@49: acc += h_mem[h_i] * x_mem[x_i]; Chris@49: } Chris@49: Chris@49: out_mem[out_i] = acc; Chris@49: } Chris@49: Chris@49: Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}