Chris@49
|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2012 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 op_diagvec
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename T1>
|
Chris@49
|
15 inline
|
Chris@49
|
16 void
|
Chris@49
|
17 op_diagvec::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagvec>& X)
|
Chris@49
|
18 {
|
Chris@49
|
19 arma_extra_debug_sigprint();
|
Chris@49
|
20
|
Chris@49
|
21 typedef typename T1::elem_type eT;
|
Chris@49
|
22
|
Chris@49
|
23 const uword a = X.aux_uword_a;
|
Chris@49
|
24 const uword b = X.aux_uword_b;
|
Chris@49
|
25
|
Chris@49
|
26 const uword row_offset = (b > 0) ? a : 0;
|
Chris@49
|
27 const uword col_offset = (b == 0) ? a : 0;
|
Chris@49
|
28
|
Chris@49
|
29 const Proxy<T1> P(X.m);
|
Chris@49
|
30
|
Chris@49
|
31 const uword n_rows = P.get_n_rows();
|
Chris@49
|
32 const uword n_cols = P.get_n_cols();
|
Chris@49
|
33
|
Chris@49
|
34 arma_debug_check
|
Chris@49
|
35 (
|
Chris@49
|
36 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
|
Chris@49
|
37 "diagvec(): requested diagonal is out of bounds"
|
Chris@49
|
38 );
|
Chris@49
|
39
|
Chris@49
|
40 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
|
Chris@49
|
41
|
Chris@49
|
42 if(is_Mat<typename Proxy<T1>::stored_type>::value)
|
Chris@49
|
43 {
|
Chris@49
|
44 op_diagvec::apply_unwrap(out, P.Q, row_offset, col_offset, len);
|
Chris@49
|
45 }
|
Chris@49
|
46 else
|
Chris@49
|
47 {
|
Chris@49
|
48 if(P.is_alias(out) == false)
|
Chris@49
|
49 {
|
Chris@49
|
50 op_diagvec::apply_proxy(out, P, row_offset, col_offset, len);
|
Chris@49
|
51 }
|
Chris@49
|
52 else
|
Chris@49
|
53 {
|
Chris@49
|
54 Mat<eT> tmp;
|
Chris@49
|
55
|
Chris@49
|
56 op_diagvec::apply_proxy(tmp, P, row_offset, col_offset, len);
|
Chris@49
|
57
|
Chris@49
|
58 out.steal_mem(tmp);
|
Chris@49
|
59 }
|
Chris@49
|
60 }
|
Chris@49
|
61 }
|
Chris@49
|
62
|
Chris@49
|
63
|
Chris@49
|
64
|
Chris@49
|
65 template<typename T1>
|
Chris@49
|
66 arma_hot
|
Chris@49
|
67 inline
|
Chris@49
|
68 void
|
Chris@49
|
69 op_diagvec::apply_unwrap(Mat<typename T1::elem_type>& out, const T1& X, const uword row_offset, const uword col_offset, const uword len)
|
Chris@49
|
70 {
|
Chris@49
|
71 arma_extra_debug_sigprint();
|
Chris@49
|
72
|
Chris@49
|
73 typedef typename T1::elem_type eT;
|
Chris@49
|
74
|
Chris@49
|
75 const unwrap_check<T1> tmp_A(X, out);
|
Chris@49
|
76 const Mat<eT>& A = tmp_A.M;
|
Chris@49
|
77
|
Chris@49
|
78 out.set_size(len, 1);
|
Chris@49
|
79
|
Chris@49
|
80 eT* out_mem = out.memptr();
|
Chris@49
|
81
|
Chris@49
|
82 uword i,j;
|
Chris@49
|
83 for(i=0, j=1; j < len; i+=2, j+=2)
|
Chris@49
|
84 {
|
Chris@49
|
85 const eT tmp_i = A.at( i + row_offset, i + col_offset );
|
Chris@49
|
86 const eT tmp_j = A.at( j + row_offset, j + col_offset );
|
Chris@49
|
87
|
Chris@49
|
88 out_mem[i] = tmp_i;
|
Chris@49
|
89 out_mem[j] = tmp_j;
|
Chris@49
|
90 }
|
Chris@49
|
91
|
Chris@49
|
92 if(i < len)
|
Chris@49
|
93 {
|
Chris@49
|
94 out_mem[i] = A.at( i + row_offset, i + col_offset );
|
Chris@49
|
95 }
|
Chris@49
|
96 }
|
Chris@49
|
97
|
Chris@49
|
98
|
Chris@49
|
99
|
Chris@49
|
100 template<typename T1>
|
Chris@49
|
101 arma_hot
|
Chris@49
|
102 inline
|
Chris@49
|
103 void
|
Chris@49
|
104 op_diagvec::apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset, const uword len)
|
Chris@49
|
105 {
|
Chris@49
|
106 arma_extra_debug_sigprint();
|
Chris@49
|
107
|
Chris@49
|
108 typedef typename T1::elem_type eT;
|
Chris@49
|
109
|
Chris@49
|
110 out.set_size(len, 1);
|
Chris@49
|
111
|
Chris@49
|
112 eT* out_mem = out.memptr();
|
Chris@49
|
113
|
Chris@49
|
114 uword i,j;
|
Chris@49
|
115 for(i=0, j=1; j < len; i+=2, j+=2)
|
Chris@49
|
116 {
|
Chris@49
|
117 const eT tmp_i = P.at( i + row_offset, i + col_offset );
|
Chris@49
|
118 const eT tmp_j = P.at( j + row_offset, j + col_offset );
|
Chris@49
|
119
|
Chris@49
|
120 out_mem[i] = tmp_i;
|
Chris@49
|
121 out_mem[j] = tmp_j;
|
Chris@49
|
122 }
|
Chris@49
|
123
|
Chris@49
|
124 if(i < len)
|
Chris@49
|
125 {
|
Chris@49
|
126 out_mem[i] = P.at( i + row_offset, i + col_offset );
|
Chris@49
|
127 }
|
Chris@49
|
128 }
|
Chris@49
|
129
|
Chris@49
|
130
|
Chris@49
|
131
|
Chris@49
|
132 //! @}
|