Chris@49
|
1 // Copyright (C) 2009-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2009-2012 Conrad Sanderson
|
Chris@49
|
3 // Copyright (C) 2009-2010 Dimitrios Bouzas
|
Chris@49
|
4 //
|
Chris@49
|
5 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
8
|
Chris@49
|
9
|
Chris@49
|
10
|
Chris@49
|
11 //! \addtogroup op_repmat
|
Chris@49
|
12 //! @{
|
Chris@49
|
13
|
Chris@49
|
14
|
Chris@49
|
15
|
Chris@49
|
16 //! \brief
|
Chris@49
|
17 //! implementation of the 'repeat matrix' operation, used for constructing matrices
|
Chris@49
|
18 template<typename T1>
|
Chris@49
|
19 inline
|
Chris@49
|
20 void
|
Chris@49
|
21 op_repmat::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_repmat>& in)
|
Chris@49
|
22 {
|
Chris@49
|
23 arma_extra_debug_sigprint();
|
Chris@49
|
24
|
Chris@49
|
25 typedef typename T1::elem_type eT;
|
Chris@49
|
26
|
Chris@49
|
27 const unwrap_check<T1> tmp(in.m, out);
|
Chris@49
|
28 const Mat<eT>& X = tmp.M;
|
Chris@49
|
29
|
Chris@49
|
30 const uword copies_per_row = in.aux_uword_a;
|
Chris@49
|
31 const uword copies_per_col = in.aux_uword_b;
|
Chris@49
|
32
|
Chris@49
|
33 const uword X_n_rows = X.n_rows;
|
Chris@49
|
34 const uword X_n_cols = X.n_cols;
|
Chris@49
|
35
|
Chris@49
|
36 out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col);
|
Chris@49
|
37
|
Chris@49
|
38 const uword out_n_rows = out.n_rows;
|
Chris@49
|
39 const uword out_n_cols = out.n_cols;
|
Chris@49
|
40
|
Chris@49
|
41 // if( (out_n_rows > 0) && (out_n_cols > 0) )
|
Chris@49
|
42 // {
|
Chris@49
|
43 // for(uword col = 0; col < out_n_cols; col += X_n_cols)
|
Chris@49
|
44 // for(uword row = 0; row < out_n_rows; row += X_n_rows)
|
Chris@49
|
45 // {
|
Chris@49
|
46 // out.submat(row, col, row+X_n_rows-1, col+X_n_cols-1) = X;
|
Chris@49
|
47 // }
|
Chris@49
|
48 // }
|
Chris@49
|
49
|
Chris@49
|
50 if( (out_n_rows > 0) && (out_n_cols > 0) )
|
Chris@49
|
51 {
|
Chris@49
|
52 if(copies_per_row != 1)
|
Chris@49
|
53 {
|
Chris@49
|
54 for(uword col_copy=0; col_copy < copies_per_col; ++col_copy)
|
Chris@49
|
55 {
|
Chris@49
|
56 const uword out_col_offset = X_n_cols * col_copy;
|
Chris@49
|
57
|
Chris@49
|
58 for(uword col=0; col < X_n_cols; ++col)
|
Chris@49
|
59 {
|
Chris@49
|
60 eT* out_colptr = out.colptr(col + out_col_offset);
|
Chris@49
|
61 const eT* X_colptr = X.colptr(col);
|
Chris@49
|
62
|
Chris@49
|
63 for(uword row_copy=0; row_copy < copies_per_row; ++row_copy)
|
Chris@49
|
64 {
|
Chris@49
|
65 const uword out_row_offset = X_n_rows * row_copy;
|
Chris@49
|
66
|
Chris@49
|
67 arrayops::copy( &out_colptr[out_row_offset], X_colptr, X_n_rows );
|
Chris@49
|
68 }
|
Chris@49
|
69 }
|
Chris@49
|
70 }
|
Chris@49
|
71 }
|
Chris@49
|
72 else
|
Chris@49
|
73 {
|
Chris@49
|
74 for(uword col_copy=0; col_copy < copies_per_col; ++col_copy)
|
Chris@49
|
75 {
|
Chris@49
|
76 const uword out_col_offset = X_n_cols * col_copy;
|
Chris@49
|
77
|
Chris@49
|
78 for(uword col=0; col < X_n_cols; ++col)
|
Chris@49
|
79 {
|
Chris@49
|
80 eT* out_colptr = out.colptr(col + out_col_offset);
|
Chris@49
|
81 const eT* X_colptr = X.colptr(col);
|
Chris@49
|
82
|
Chris@49
|
83 arrayops::copy( out_colptr, X_colptr, X_n_rows );
|
Chris@49
|
84 }
|
Chris@49
|
85 }
|
Chris@49
|
86 }
|
Chris@49
|
87 }
|
Chris@49
|
88
|
Chris@49
|
89 }
|
Chris@49
|
90
|
Chris@49
|
91
|
Chris@49
|
92
|
Chris@49
|
93 //! @}
|