Chris@49: // Copyright (C) 2009-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2009-2012 Conrad Sanderson Chris@49: // Copyright (C) 2009-2010 Dimitrios Bouzas 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: Chris@49: //! \addtogroup op_repmat Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: //! \brief Chris@49: //! implementation of the 'repeat matrix' operation, used for constructing matrices Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_repmat::apply(Mat& out, const Op& in) 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 tmp(in.m, out); Chris@49: const Mat& X = tmp.M; Chris@49: Chris@49: const uword copies_per_row = in.aux_uword_a; Chris@49: const uword copies_per_col = in.aux_uword_b; Chris@49: Chris@49: const uword X_n_rows = X.n_rows; Chris@49: const uword X_n_cols = X.n_cols; Chris@49: Chris@49: out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col); Chris@49: Chris@49: const uword out_n_rows = out.n_rows; Chris@49: const uword out_n_cols = out.n_cols; Chris@49: Chris@49: // if( (out_n_rows > 0) && (out_n_cols > 0) ) Chris@49: // { Chris@49: // for(uword col = 0; col < out_n_cols; col += X_n_cols) Chris@49: // for(uword row = 0; row < out_n_rows; row += X_n_rows) Chris@49: // { Chris@49: // out.submat(row, col, row+X_n_rows-1, col+X_n_cols-1) = X; Chris@49: // } Chris@49: // } Chris@49: Chris@49: if( (out_n_rows > 0) && (out_n_cols > 0) ) Chris@49: { Chris@49: if(copies_per_row != 1) Chris@49: { Chris@49: for(uword col_copy=0; col_copy < copies_per_col; ++col_copy) Chris@49: { Chris@49: const uword out_col_offset = X_n_cols * col_copy; Chris@49: Chris@49: for(uword col=0; col < X_n_cols; ++col) Chris@49: { Chris@49: eT* out_colptr = out.colptr(col + out_col_offset); Chris@49: const eT* X_colptr = X.colptr(col); Chris@49: Chris@49: for(uword row_copy=0; row_copy < copies_per_row; ++row_copy) Chris@49: { Chris@49: const uword out_row_offset = X_n_rows * row_copy; Chris@49: Chris@49: arrayops::copy( &out_colptr[out_row_offset], X_colptr, X_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword col_copy=0; col_copy < copies_per_col; ++col_copy) Chris@49: { Chris@49: const uword out_col_offset = X_n_cols * col_copy; Chris@49: Chris@49: for(uword col=0; col < X_n_cols; ++col) Chris@49: { Chris@49: eT* out_colptr = out.colptr(col + out_col_offset); Chris@49: const eT* X_colptr = X.colptr(col); Chris@49: Chris@49: arrayops::copy( out_colptr, X_colptr, X_n_rows ); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}