Chris@49
|
1 // Copyright (C) 2010-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2010-2013 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 subview_elem1
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 template<typename eT, typename T1>
|
Chris@49
|
14 inline
|
Chris@49
|
15 subview_elem1<eT,T1>::~subview_elem1()
|
Chris@49
|
16 {
|
Chris@49
|
17 arma_extra_debug_sigprint();
|
Chris@49
|
18 }
|
Chris@49
|
19
|
Chris@49
|
20
|
Chris@49
|
21 template<typename eT, typename T1>
|
Chris@49
|
22 arma_inline
|
Chris@49
|
23 subview_elem1<eT,T1>::subview_elem1(const Mat<eT>& in_m, const Base<uword,T1>& in_a)
|
Chris@49
|
24 : m(in_m)
|
Chris@49
|
25 , a(in_a)
|
Chris@49
|
26 {
|
Chris@49
|
27 arma_extra_debug_sigprint();
|
Chris@49
|
28 }
|
Chris@49
|
29
|
Chris@49
|
30
|
Chris@49
|
31
|
Chris@49
|
32 template<typename eT, typename T1>
|
Chris@49
|
33 template<typename op_type>
|
Chris@49
|
34 inline
|
Chris@49
|
35 void
|
Chris@49
|
36 subview_elem1<eT,T1>::inplace_op(const eT val)
|
Chris@49
|
37 {
|
Chris@49
|
38 arma_extra_debug_sigprint();
|
Chris@49
|
39
|
Chris@49
|
40 Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
|
Chris@49
|
41
|
Chris@49
|
42 eT* m_mem = m_local.memptr();
|
Chris@49
|
43 const uword m_n_elem = m_local.n_elem;
|
Chris@49
|
44
|
Chris@49
|
45 const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local);
|
Chris@49
|
46 const umat& aa = tmp.M;
|
Chris@49
|
47
|
Chris@49
|
48 arma_debug_check
|
Chris@49
|
49 (
|
Chris@49
|
50 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
|
Chris@49
|
51 "Mat::elem(): given object is not a vector"
|
Chris@49
|
52 );
|
Chris@49
|
53
|
Chris@49
|
54 const uword* aa_mem = aa.memptr();
|
Chris@49
|
55 const uword aa_n_elem = aa.n_elem;
|
Chris@49
|
56
|
Chris@49
|
57 uword iq,jq;
|
Chris@49
|
58 for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
|
Chris@49
|
59 {
|
Chris@49
|
60 const uword ii = aa_mem[iq];
|
Chris@49
|
61 const uword jj = aa_mem[jq];
|
Chris@49
|
62
|
Chris@49
|
63 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
|
Chris@49
|
64
|
Chris@49
|
65 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = val; m_mem[jj] = val; }
|
Chris@49
|
66 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += val; m_mem[jj] += val; }
|
Chris@49
|
67 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= val; m_mem[jj] -= val; }
|
Chris@49
|
68 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= val; m_mem[jj] *= val; }
|
Chris@49
|
69 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= val; m_mem[jj] /= val; }
|
Chris@49
|
70 }
|
Chris@49
|
71
|
Chris@49
|
72 if(iq < aa_n_elem)
|
Chris@49
|
73 {
|
Chris@49
|
74 const uword ii = aa_mem[iq];
|
Chris@49
|
75
|
Chris@49
|
76 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
|
Chris@49
|
77
|
Chris@49
|
78 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = val; }
|
Chris@49
|
79 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += val; }
|
Chris@49
|
80 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= val; }
|
Chris@49
|
81 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= val; }
|
Chris@49
|
82 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= val; }
|
Chris@49
|
83 }
|
Chris@49
|
84 }
|
Chris@49
|
85
|
Chris@49
|
86
|
Chris@49
|
87
|
Chris@49
|
88 template<typename eT, typename T1>
|
Chris@49
|
89 template<typename op_type, typename T2>
|
Chris@49
|
90 inline
|
Chris@49
|
91 void
|
Chris@49
|
92 subview_elem1<eT,T1>::inplace_op(const subview_elem1<eT,T2>& x)
|
Chris@49
|
93 {
|
Chris@49
|
94 arma_extra_debug_sigprint();
|
Chris@49
|
95
|
Chris@49
|
96 subview_elem1<eT,T1>& s = *this;
|
Chris@49
|
97
|
Chris@49
|
98 if(&(s.m) == &(x.m))
|
Chris@49
|
99 {
|
Chris@49
|
100 arma_extra_debug_print("subview_elem1::inplace_op(): aliasing detected");
|
Chris@49
|
101
|
Chris@49
|
102 const Mat<eT> tmp(x);
|
Chris@49
|
103
|
Chris@49
|
104 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { s.operator= (tmp); }
|
Chris@49
|
105 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { s.operator+=(tmp); }
|
Chris@49
|
106 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { s.operator-=(tmp); }
|
Chris@49
|
107 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { s.operator%=(tmp); }
|
Chris@49
|
108 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { s.operator/=(tmp); }
|
Chris@49
|
109 }
|
Chris@49
|
110 else
|
Chris@49
|
111 {
|
Chris@49
|
112 Mat<eT>& s_m_local = const_cast< Mat<eT>& >(s.m);
|
Chris@49
|
113 const Mat<eT>& x_m_local = x.m;
|
Chris@49
|
114
|
Chris@49
|
115 const unwrap_check_mixed<T1> s_tmp(s.a.get_ref(), s_m_local);
|
Chris@49
|
116 const unwrap_check_mixed<T2> x_tmp(x.a.get_ref(), s_m_local);
|
Chris@49
|
117
|
Chris@49
|
118 const umat& s_aa = s_tmp.M;
|
Chris@49
|
119 const umat& x_aa = x_tmp.M;
|
Chris@49
|
120
|
Chris@49
|
121 arma_debug_check
|
Chris@49
|
122 (
|
Chris@49
|
123 ( ((s_aa.is_vec() == false) && (s_aa.is_empty() == false)) || ((x_aa.is_vec() == false) && (x_aa.is_empty() == false)) ),
|
Chris@49
|
124 "Mat::elem(): given object is not a vector"
|
Chris@49
|
125 );
|
Chris@49
|
126
|
Chris@49
|
127 const uword* s_aa_mem = s_aa.memptr();
|
Chris@49
|
128 const uword* x_aa_mem = x_aa.memptr();
|
Chris@49
|
129
|
Chris@49
|
130 const uword s_aa_n_elem = s_aa.n_elem;
|
Chris@49
|
131
|
Chris@49
|
132 arma_debug_check( (s_aa_n_elem != x_aa.n_elem), "Mat::elem(): size mismatch" );
|
Chris@49
|
133
|
Chris@49
|
134
|
Chris@49
|
135 eT* s_m_mem = s_m_local.memptr();
|
Chris@49
|
136 const uword s_m_n_elem = s_m_local.n_elem;
|
Chris@49
|
137
|
Chris@49
|
138 const eT* x_m_mem = x_m_local.memptr();
|
Chris@49
|
139 const uword x_m_n_elem = x_m_local.n_elem;
|
Chris@49
|
140
|
Chris@49
|
141 uword iq,jq;
|
Chris@49
|
142 for(iq=0, jq=1; jq < s_aa_n_elem; iq+=2, jq+=2)
|
Chris@49
|
143 {
|
Chris@49
|
144 const uword s_ii = s_aa_mem[iq];
|
Chris@49
|
145 const uword s_jj = s_aa_mem[jq];
|
Chris@49
|
146
|
Chris@49
|
147 const uword x_ii = x_aa_mem[iq];
|
Chris@49
|
148 const uword x_jj = x_aa_mem[jq];
|
Chris@49
|
149
|
Chris@49
|
150 arma_debug_check
|
Chris@49
|
151 (
|
Chris@49
|
152 (s_ii >= s_m_n_elem) || (s_jj >= s_m_n_elem) || (x_ii >= x_m_n_elem) || (x_jj >= x_m_n_elem),
|
Chris@49
|
153 "Mat::elem(): index out of bounds"
|
Chris@49
|
154 );
|
Chris@49
|
155
|
Chris@49
|
156 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { s_m_mem[s_ii] = x_m_mem[x_ii]; s_m_mem[s_jj] = x_m_mem[x_jj]; }
|
Chris@49
|
157 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { s_m_mem[s_ii] += x_m_mem[x_ii]; s_m_mem[s_jj] += x_m_mem[x_jj]; }
|
Chris@49
|
158 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { s_m_mem[s_ii] -= x_m_mem[x_ii]; s_m_mem[s_jj] -= x_m_mem[x_jj]; }
|
Chris@49
|
159 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { s_m_mem[s_ii] *= x_m_mem[x_ii]; s_m_mem[s_jj] *= x_m_mem[x_jj]; }
|
Chris@49
|
160 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { s_m_mem[s_ii] /= x_m_mem[x_ii]; s_m_mem[s_jj] /= x_m_mem[x_jj]; }
|
Chris@49
|
161 }
|
Chris@49
|
162
|
Chris@49
|
163 if(iq < s_aa_n_elem)
|
Chris@49
|
164 {
|
Chris@49
|
165 const uword s_ii = s_aa_mem[iq];
|
Chris@49
|
166 const uword x_ii = x_aa_mem[iq];
|
Chris@49
|
167
|
Chris@49
|
168 arma_debug_check
|
Chris@49
|
169 (
|
Chris@49
|
170 ( (s_ii >= s_m_n_elem) || (x_ii >= x_m_n_elem) ),
|
Chris@49
|
171 "Mat::elem(): index out of bounds"
|
Chris@49
|
172 );
|
Chris@49
|
173
|
Chris@49
|
174 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { s_m_mem[s_ii] = x_m_mem[x_ii]; }
|
Chris@49
|
175 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { s_m_mem[s_ii] += x_m_mem[x_ii]; }
|
Chris@49
|
176 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { s_m_mem[s_ii] -= x_m_mem[x_ii]; }
|
Chris@49
|
177 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { s_m_mem[s_ii] *= x_m_mem[x_ii]; }
|
Chris@49
|
178 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { s_m_mem[s_ii] /= x_m_mem[x_ii]; }
|
Chris@49
|
179 }
|
Chris@49
|
180 }
|
Chris@49
|
181 }
|
Chris@49
|
182
|
Chris@49
|
183
|
Chris@49
|
184
|
Chris@49
|
185 template<typename eT, typename T1>
|
Chris@49
|
186 template<typename op_type, typename T2>
|
Chris@49
|
187 inline
|
Chris@49
|
188 void
|
Chris@49
|
189 subview_elem1<eT,T1>::inplace_op(const Base<eT,T2>& x)
|
Chris@49
|
190 {
|
Chris@49
|
191 arma_extra_debug_sigprint();
|
Chris@49
|
192
|
Chris@49
|
193 Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
|
Chris@49
|
194
|
Chris@49
|
195 eT* m_mem = m_local.memptr();
|
Chris@49
|
196 const uword m_n_elem = m_local.n_elem;
|
Chris@49
|
197
|
Chris@49
|
198 const unwrap_check_mixed<T1> aa_tmp(a.get_ref(), m_local);
|
Chris@49
|
199 const umat& aa = aa_tmp.M;
|
Chris@49
|
200
|
Chris@49
|
201 arma_debug_check
|
Chris@49
|
202 (
|
Chris@49
|
203 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
|
Chris@49
|
204 "Mat::elem(): given object is not a vector"
|
Chris@49
|
205 );
|
Chris@49
|
206
|
Chris@49
|
207 const uword* aa_mem = aa.memptr();
|
Chris@49
|
208 const uword aa_n_elem = aa.n_elem;
|
Chris@49
|
209
|
Chris@49
|
210 const Proxy<T2> P(x.get_ref());
|
Chris@49
|
211
|
Chris@49
|
212 arma_debug_check( (aa_n_elem != P.get_n_elem()), "Mat::elem(): size mismatch" );
|
Chris@49
|
213
|
Chris@49
|
214 const bool is_alias = P.is_alias(m);
|
Chris@49
|
215
|
Chris@49
|
216 if( (is_alias == false) && (Proxy<T2>::prefer_at_accessor == false) )
|
Chris@49
|
217 {
|
Chris@49
|
218 typename Proxy<T2>::ea_type X = P.get_ea();
|
Chris@49
|
219
|
Chris@49
|
220 uword iq,jq;
|
Chris@49
|
221 for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
|
Chris@49
|
222 {
|
Chris@49
|
223 const uword ii = aa_mem[iq];
|
Chris@49
|
224 const uword jj = aa_mem[jq];
|
Chris@49
|
225
|
Chris@49
|
226 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
|
Chris@49
|
227
|
Chris@49
|
228 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; }
|
Chris@49
|
229 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; }
|
Chris@49
|
230 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; }
|
Chris@49
|
231 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; }
|
Chris@49
|
232 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; }
|
Chris@49
|
233 }
|
Chris@49
|
234
|
Chris@49
|
235 if(iq < aa_n_elem)
|
Chris@49
|
236 {
|
Chris@49
|
237 const uword ii = aa_mem[iq];
|
Chris@49
|
238
|
Chris@49
|
239 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
|
Chris@49
|
240
|
Chris@49
|
241 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; }
|
Chris@49
|
242 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; }
|
Chris@49
|
243 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; }
|
Chris@49
|
244 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; }
|
Chris@49
|
245 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; }
|
Chris@49
|
246 }
|
Chris@49
|
247 }
|
Chris@49
|
248 else
|
Chris@49
|
249 {
|
Chris@49
|
250 arma_extra_debug_print("subview_elem1::inplace_op(): aliasing or prefer_at_accessor detected");
|
Chris@49
|
251
|
Chris@49
|
252 const unwrap_check<typename Proxy<T2>::stored_type> tmp(P.Q, is_alias);
|
Chris@49
|
253 const Mat<eT>& M = tmp.M;
|
Chris@49
|
254
|
Chris@49
|
255 const eT* X = M.memptr();
|
Chris@49
|
256
|
Chris@49
|
257 uword iq,jq;
|
Chris@49
|
258 for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
|
Chris@49
|
259 {
|
Chris@49
|
260 const uword ii = aa_mem[iq];
|
Chris@49
|
261 const uword jj = aa_mem[jq];
|
Chris@49
|
262
|
Chris@49
|
263 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
|
Chris@49
|
264
|
Chris@49
|
265 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; }
|
Chris@49
|
266 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; }
|
Chris@49
|
267 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; }
|
Chris@49
|
268 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; }
|
Chris@49
|
269 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; }
|
Chris@49
|
270 }
|
Chris@49
|
271
|
Chris@49
|
272 if(iq < aa_n_elem)
|
Chris@49
|
273 {
|
Chris@49
|
274 const uword ii = aa_mem[iq];
|
Chris@49
|
275
|
Chris@49
|
276 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
|
Chris@49
|
277
|
Chris@49
|
278 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; }
|
Chris@49
|
279 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; }
|
Chris@49
|
280 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; }
|
Chris@49
|
281 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; }
|
Chris@49
|
282 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; }
|
Chris@49
|
283 }
|
Chris@49
|
284 }
|
Chris@49
|
285 }
|
Chris@49
|
286
|
Chris@49
|
287
|
Chris@49
|
288
|
Chris@49
|
289 //
|
Chris@49
|
290 //
|
Chris@49
|
291
|
Chris@49
|
292
|
Chris@49
|
293
|
Chris@49
|
294 template<typename eT, typename T1>
|
Chris@49
|
295 arma_inline
|
Chris@49
|
296 const Op<subview_elem1<eT,T1>,op_htrans>
|
Chris@49
|
297 subview_elem1<eT,T1>::t() const
|
Chris@49
|
298 {
|
Chris@49
|
299 return Op<subview_elem1<eT,T1>,op_htrans>(*this);
|
Chris@49
|
300 }
|
Chris@49
|
301
|
Chris@49
|
302
|
Chris@49
|
303
|
Chris@49
|
304 template<typename eT, typename T1>
|
Chris@49
|
305 arma_inline
|
Chris@49
|
306 const Op<subview_elem1<eT,T1>,op_htrans>
|
Chris@49
|
307 subview_elem1<eT,T1>::ht() const
|
Chris@49
|
308 {
|
Chris@49
|
309 return Op<subview_elem1<eT,T1>,op_htrans>(*this);
|
Chris@49
|
310 }
|
Chris@49
|
311
|
Chris@49
|
312
|
Chris@49
|
313
|
Chris@49
|
314 template<typename eT, typename T1>
|
Chris@49
|
315 arma_inline
|
Chris@49
|
316 const Op<subview_elem1<eT,T1>,op_strans>
|
Chris@49
|
317 subview_elem1<eT,T1>::st() const
|
Chris@49
|
318 {
|
Chris@49
|
319 return Op<subview_elem1<eT,T1>,op_strans>(*this);
|
Chris@49
|
320 }
|
Chris@49
|
321
|
Chris@49
|
322
|
Chris@49
|
323
|
Chris@49
|
324 template<typename eT, typename T1>
|
Chris@49
|
325 inline
|
Chris@49
|
326 void
|
Chris@49
|
327 subview_elem1<eT,T1>::fill(const eT val)
|
Chris@49
|
328 {
|
Chris@49
|
329 arma_extra_debug_sigprint();
|
Chris@49
|
330
|
Chris@49
|
331 inplace_op<op_subview_elem_equ>(val);
|
Chris@49
|
332 }
|
Chris@49
|
333
|
Chris@49
|
334
|
Chris@49
|
335
|
Chris@49
|
336 template<typename eT, typename T1>
|
Chris@49
|
337 inline
|
Chris@49
|
338 void
|
Chris@49
|
339 subview_elem1<eT,T1>::zeros()
|
Chris@49
|
340 {
|
Chris@49
|
341 arma_extra_debug_sigprint();
|
Chris@49
|
342
|
Chris@49
|
343 inplace_op<op_subview_elem_equ>(eT(0));
|
Chris@49
|
344 }
|
Chris@49
|
345
|
Chris@49
|
346
|
Chris@49
|
347
|
Chris@49
|
348 template<typename eT, typename T1>
|
Chris@49
|
349 inline
|
Chris@49
|
350 void
|
Chris@49
|
351 subview_elem1<eT,T1>::ones()
|
Chris@49
|
352 {
|
Chris@49
|
353 arma_extra_debug_sigprint();
|
Chris@49
|
354
|
Chris@49
|
355 inplace_op<op_subview_elem_equ>(eT(1));
|
Chris@49
|
356 }
|
Chris@49
|
357
|
Chris@49
|
358
|
Chris@49
|
359
|
Chris@49
|
360 template<typename eT, typename T1>
|
Chris@49
|
361 inline
|
Chris@49
|
362 void
|
Chris@49
|
363 subview_elem1<eT,T1>::operator+= (const eT val)
|
Chris@49
|
364 {
|
Chris@49
|
365 arma_extra_debug_sigprint();
|
Chris@49
|
366
|
Chris@49
|
367 inplace_op<op_subview_elem_inplace_plus>(val);
|
Chris@49
|
368 }
|
Chris@49
|
369
|
Chris@49
|
370
|
Chris@49
|
371
|
Chris@49
|
372 template<typename eT, typename T1>
|
Chris@49
|
373 inline
|
Chris@49
|
374 void
|
Chris@49
|
375 subview_elem1<eT,T1>::operator-= (const eT val)
|
Chris@49
|
376 {
|
Chris@49
|
377 arma_extra_debug_sigprint();
|
Chris@49
|
378
|
Chris@49
|
379 inplace_op<op_subview_elem_inplace_minus>(val);
|
Chris@49
|
380 }
|
Chris@49
|
381
|
Chris@49
|
382
|
Chris@49
|
383
|
Chris@49
|
384 template<typename eT, typename T1>
|
Chris@49
|
385 inline
|
Chris@49
|
386 void
|
Chris@49
|
387 subview_elem1<eT,T1>::operator*= (const eT val)
|
Chris@49
|
388 {
|
Chris@49
|
389 arma_extra_debug_sigprint();
|
Chris@49
|
390
|
Chris@49
|
391 inplace_op<op_subview_elem_inplace_schur>(val);
|
Chris@49
|
392 }
|
Chris@49
|
393
|
Chris@49
|
394
|
Chris@49
|
395
|
Chris@49
|
396 template<typename eT, typename T1>
|
Chris@49
|
397 inline
|
Chris@49
|
398 void
|
Chris@49
|
399 subview_elem1<eT,T1>::operator/= (const eT val)
|
Chris@49
|
400 {
|
Chris@49
|
401 arma_extra_debug_sigprint();
|
Chris@49
|
402
|
Chris@49
|
403 inplace_op<op_subview_elem_inplace_div>(val);
|
Chris@49
|
404 }
|
Chris@49
|
405
|
Chris@49
|
406
|
Chris@49
|
407
|
Chris@49
|
408 //
|
Chris@49
|
409 //
|
Chris@49
|
410
|
Chris@49
|
411
|
Chris@49
|
412
|
Chris@49
|
413 template<typename eT, typename T1>
|
Chris@49
|
414 template<typename T2>
|
Chris@49
|
415 inline
|
Chris@49
|
416 void
|
Chris@49
|
417 subview_elem1<eT,T1>::operator_equ(const subview_elem1<eT,T2>& x)
|
Chris@49
|
418 {
|
Chris@49
|
419 arma_extra_debug_sigprint();
|
Chris@49
|
420
|
Chris@49
|
421 inplace_op<op_subview_elem_equ>(x);
|
Chris@49
|
422 }
|
Chris@49
|
423
|
Chris@49
|
424
|
Chris@49
|
425
|
Chris@49
|
426
|
Chris@49
|
427 template<typename eT, typename T1>
|
Chris@49
|
428 template<typename T2>
|
Chris@49
|
429 inline
|
Chris@49
|
430 void
|
Chris@49
|
431 subview_elem1<eT,T1>::operator= (const subview_elem1<eT,T2>& x)
|
Chris@49
|
432 {
|
Chris@49
|
433 arma_extra_debug_sigprint();
|
Chris@49
|
434
|
Chris@49
|
435 (*this).operator_equ(x);
|
Chris@49
|
436 }
|
Chris@49
|
437
|
Chris@49
|
438
|
Chris@49
|
439
|
Chris@49
|
440 //! work around compiler bugs
|
Chris@49
|
441 template<typename eT, typename T1>
|
Chris@49
|
442 inline
|
Chris@49
|
443 void
|
Chris@49
|
444 subview_elem1<eT,T1>::operator= (const subview_elem1<eT,T1>& x)
|
Chris@49
|
445 {
|
Chris@49
|
446 arma_extra_debug_sigprint();
|
Chris@49
|
447
|
Chris@49
|
448 (*this).operator_equ(x);
|
Chris@49
|
449 }
|
Chris@49
|
450
|
Chris@49
|
451
|
Chris@49
|
452
|
Chris@49
|
453 template<typename eT, typename T1>
|
Chris@49
|
454 template<typename T2>
|
Chris@49
|
455 inline
|
Chris@49
|
456 void
|
Chris@49
|
457 subview_elem1<eT,T1>::operator+= (const subview_elem1<eT,T2>& x)
|
Chris@49
|
458 {
|
Chris@49
|
459 arma_extra_debug_sigprint();
|
Chris@49
|
460
|
Chris@49
|
461 inplace_op<op_subview_elem_inplace_plus>(x);
|
Chris@49
|
462 }
|
Chris@49
|
463
|
Chris@49
|
464
|
Chris@49
|
465
|
Chris@49
|
466 template<typename eT, typename T1>
|
Chris@49
|
467 template<typename T2>
|
Chris@49
|
468 inline
|
Chris@49
|
469 void
|
Chris@49
|
470 subview_elem1<eT,T1>::operator-= (const subview_elem1<eT,T2>& x)
|
Chris@49
|
471 {
|
Chris@49
|
472 arma_extra_debug_sigprint();
|
Chris@49
|
473
|
Chris@49
|
474 inplace_op<op_subview_elem_inplace_minus>(x);
|
Chris@49
|
475 }
|
Chris@49
|
476
|
Chris@49
|
477
|
Chris@49
|
478
|
Chris@49
|
479 template<typename eT, typename T1>
|
Chris@49
|
480 template<typename T2>
|
Chris@49
|
481 inline
|
Chris@49
|
482 void
|
Chris@49
|
483 subview_elem1<eT,T1>::operator%= (const subview_elem1<eT,T2>& x)
|
Chris@49
|
484 {
|
Chris@49
|
485 arma_extra_debug_sigprint();
|
Chris@49
|
486
|
Chris@49
|
487 inplace_op<op_subview_elem_inplace_schur>(x);
|
Chris@49
|
488 }
|
Chris@49
|
489
|
Chris@49
|
490
|
Chris@49
|
491
|
Chris@49
|
492 template<typename eT, typename T1>
|
Chris@49
|
493 template<typename T2>
|
Chris@49
|
494 inline
|
Chris@49
|
495 void
|
Chris@49
|
496 subview_elem1<eT,T1>::operator/= (const subview_elem1<eT,T2>& x)
|
Chris@49
|
497 {
|
Chris@49
|
498 arma_extra_debug_sigprint();
|
Chris@49
|
499
|
Chris@49
|
500 inplace_op<op_subview_elem_inplace_div>(x);
|
Chris@49
|
501 }
|
Chris@49
|
502
|
Chris@49
|
503
|
Chris@49
|
504
|
Chris@49
|
505 template<typename eT, typename T1>
|
Chris@49
|
506 template<typename T2>
|
Chris@49
|
507 inline
|
Chris@49
|
508 void
|
Chris@49
|
509 subview_elem1<eT,T1>::operator= (const Base<eT,T2>& x)
|
Chris@49
|
510 {
|
Chris@49
|
511 arma_extra_debug_sigprint();
|
Chris@49
|
512
|
Chris@49
|
513 inplace_op<op_subview_elem_equ>(x);
|
Chris@49
|
514 }
|
Chris@49
|
515
|
Chris@49
|
516
|
Chris@49
|
517
|
Chris@49
|
518 template<typename eT, typename T1>
|
Chris@49
|
519 template<typename T2>
|
Chris@49
|
520 inline
|
Chris@49
|
521 void
|
Chris@49
|
522 subview_elem1<eT,T1>::operator+= (const Base<eT,T2>& x)
|
Chris@49
|
523 {
|
Chris@49
|
524 arma_extra_debug_sigprint();
|
Chris@49
|
525
|
Chris@49
|
526 inplace_op<op_subview_elem_inplace_plus>(x);
|
Chris@49
|
527 }
|
Chris@49
|
528
|
Chris@49
|
529
|
Chris@49
|
530
|
Chris@49
|
531 template<typename eT, typename T1>
|
Chris@49
|
532 template<typename T2>
|
Chris@49
|
533 inline
|
Chris@49
|
534 void
|
Chris@49
|
535 subview_elem1<eT,T1>::operator-= (const Base<eT,T2>& x)
|
Chris@49
|
536 {
|
Chris@49
|
537 arma_extra_debug_sigprint();
|
Chris@49
|
538
|
Chris@49
|
539 inplace_op<op_subview_elem_inplace_minus>(x);
|
Chris@49
|
540 }
|
Chris@49
|
541
|
Chris@49
|
542
|
Chris@49
|
543
|
Chris@49
|
544 template<typename eT, typename T1>
|
Chris@49
|
545 template<typename T2>
|
Chris@49
|
546 inline
|
Chris@49
|
547 void
|
Chris@49
|
548 subview_elem1<eT,T1>::operator%= (const Base<eT,T2>& x)
|
Chris@49
|
549 {
|
Chris@49
|
550 arma_extra_debug_sigprint();
|
Chris@49
|
551
|
Chris@49
|
552 inplace_op<op_subview_elem_inplace_schur>(x);
|
Chris@49
|
553 }
|
Chris@49
|
554
|
Chris@49
|
555
|
Chris@49
|
556
|
Chris@49
|
557 template<typename eT, typename T1>
|
Chris@49
|
558 template<typename T2>
|
Chris@49
|
559 inline
|
Chris@49
|
560 void
|
Chris@49
|
561 subview_elem1<eT,T1>::operator/= (const Base<eT,T2>& x)
|
Chris@49
|
562 {
|
Chris@49
|
563 arma_extra_debug_sigprint();
|
Chris@49
|
564
|
Chris@49
|
565 inplace_op<op_subview_elem_inplace_div>(x);
|
Chris@49
|
566 }
|
Chris@49
|
567
|
Chris@49
|
568
|
Chris@49
|
569
|
Chris@49
|
570 //
|
Chris@49
|
571 //
|
Chris@49
|
572
|
Chris@49
|
573
|
Chris@49
|
574
|
Chris@49
|
575 template<typename eT, typename T1>
|
Chris@49
|
576 inline
|
Chris@49
|
577 void
|
Chris@49
|
578 subview_elem1<eT,T1>::extract(Mat<eT>& actual_out, const subview_elem1<eT,T1>& in)
|
Chris@49
|
579 {
|
Chris@49
|
580 arma_extra_debug_sigprint();
|
Chris@49
|
581
|
Chris@49
|
582 const unwrap_check_mixed<T1> tmp1(in.a.get_ref(), actual_out);
|
Chris@49
|
583 const umat& aa = tmp1.M;
|
Chris@49
|
584
|
Chris@49
|
585 arma_debug_check
|
Chris@49
|
586 (
|
Chris@49
|
587 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
|
Chris@49
|
588 "Mat::elem(): given object is not a vector"
|
Chris@49
|
589 );
|
Chris@49
|
590
|
Chris@49
|
591 const uword* aa_mem = aa.memptr();
|
Chris@49
|
592 const uword aa_n_elem = aa.n_elem;
|
Chris@49
|
593
|
Chris@49
|
594 const Mat<eT>& m_local = in.m;
|
Chris@49
|
595
|
Chris@49
|
596 const eT* m_mem = m_local.memptr();
|
Chris@49
|
597 const uword m_n_elem = m_local.n_elem;
|
Chris@49
|
598
|
Chris@49
|
599 const bool alias = (&actual_out == &m_local);
|
Chris@49
|
600
|
Chris@49
|
601 arma_extra_debug_warn(alias, "subview_elem1::extract(): aliasing detected");
|
Chris@49
|
602
|
Chris@49
|
603 Mat<eT>* tmp_out = alias ? new Mat<eT>() : 0;
|
Chris@49
|
604 Mat<eT>& out = alias ? *tmp_out : actual_out;
|
Chris@49
|
605
|
Chris@49
|
606 out.set_size(aa_n_elem, 1);
|
Chris@49
|
607
|
Chris@49
|
608 eT* out_mem = out.memptr();
|
Chris@49
|
609
|
Chris@49
|
610 uword i,j;
|
Chris@49
|
611 for(i=0, j=1; j<aa_n_elem; i+=2, j+=2)
|
Chris@49
|
612 {
|
Chris@49
|
613 const uword ii = aa_mem[i];
|
Chris@49
|
614 const uword jj = aa_mem[j];
|
Chris@49
|
615
|
Chris@49
|
616 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
|
Chris@49
|
617
|
Chris@49
|
618 out_mem[i] = m_mem[ii];
|
Chris@49
|
619 out_mem[j] = m_mem[jj];
|
Chris@49
|
620 }
|
Chris@49
|
621
|
Chris@49
|
622 if(i < aa_n_elem)
|
Chris@49
|
623 {
|
Chris@49
|
624 const uword ii = aa_mem[i];
|
Chris@49
|
625
|
Chris@49
|
626 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
|
Chris@49
|
627
|
Chris@49
|
628 out_mem[i] = m_mem[ii];
|
Chris@49
|
629 }
|
Chris@49
|
630
|
Chris@49
|
631 if(alias == true)
|
Chris@49
|
632 {
|
Chris@49
|
633 actual_out.steal_mem(out);
|
Chris@49
|
634 delete tmp_out;
|
Chris@49
|
635 }
|
Chris@49
|
636 }
|
Chris@49
|
637
|
Chris@49
|
638
|
Chris@49
|
639
|
Chris@49
|
640 template<typename eT, typename T1>
|
Chris@49
|
641 template<typename op_type>
|
Chris@49
|
642 inline
|
Chris@49
|
643 void
|
Chris@49
|
644 subview_elem1<eT,T1>::mat_inplace_op(Mat<eT>& out, const subview_elem1& in)
|
Chris@49
|
645 {
|
Chris@49
|
646 arma_extra_debug_sigprint();
|
Chris@49
|
647
|
Chris@49
|
648 const unwrap<T1> tmp1(in.a.get_ref());
|
Chris@49
|
649 const umat& aa = tmp1.M;
|
Chris@49
|
650
|
Chris@49
|
651 arma_debug_check
|
Chris@49
|
652 (
|
Chris@49
|
653 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
|
Chris@49
|
654 "Mat::elem(): given object is not a vector"
|
Chris@49
|
655 );
|
Chris@49
|
656
|
Chris@49
|
657 const uword* aa_mem = aa.memptr();
|
Chris@49
|
658 const uword aa_n_elem = aa.n_elem;
|
Chris@49
|
659
|
Chris@49
|
660 const unwrap_check< Mat<eT> > tmp2(in.m, out);
|
Chris@49
|
661 const Mat<eT>& m_local = tmp2.M;
|
Chris@49
|
662
|
Chris@49
|
663 const eT* m_mem = m_local.memptr();
|
Chris@49
|
664 const uword m_n_elem = m_local.n_elem;
|
Chris@49
|
665
|
Chris@49
|
666 arma_debug_check( (out.n_elem != aa_n_elem), "Mat::elem(): size mismatch" );
|
Chris@49
|
667
|
Chris@49
|
668 eT* out_mem = out.memptr();
|
Chris@49
|
669
|
Chris@49
|
670 uword i,j;
|
Chris@49
|
671 for(i=0, j=1; j<aa_n_elem; i+=2, j+=2)
|
Chris@49
|
672 {
|
Chris@49
|
673 const uword ii = aa_mem[i];
|
Chris@49
|
674 const uword jj = aa_mem[j];
|
Chris@49
|
675
|
Chris@49
|
676 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
|
Chris@49
|
677
|
Chris@49
|
678 if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { out_mem[i] += m_mem[ii]; out_mem[j] += m_mem[jj]; }
|
Chris@49
|
679 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { out_mem[i] -= m_mem[ii]; out_mem[j] -= m_mem[jj]; }
|
Chris@49
|
680 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { out_mem[i] *= m_mem[ii]; out_mem[j] *= m_mem[jj]; }
|
Chris@49
|
681 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { out_mem[i] /= m_mem[ii]; out_mem[j] /= m_mem[jj]; }
|
Chris@49
|
682 }
|
Chris@49
|
683
|
Chris@49
|
684 if(i < aa_n_elem)
|
Chris@49
|
685 {
|
Chris@49
|
686 const uword ii = aa_mem[i];
|
Chris@49
|
687
|
Chris@49
|
688 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
|
Chris@49
|
689
|
Chris@49
|
690 if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { out_mem[i] += m_mem[ii]; }
|
Chris@49
|
691 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { out_mem[i] -= m_mem[ii]; }
|
Chris@49
|
692 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { out_mem[i] *= m_mem[ii]; }
|
Chris@49
|
693 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { out_mem[i] /= m_mem[ii]; }
|
Chris@49
|
694 }
|
Chris@49
|
695 }
|
Chris@49
|
696
|
Chris@49
|
697
|
Chris@49
|
698
|
Chris@49
|
699 template<typename eT, typename T1>
|
Chris@49
|
700 inline
|
Chris@49
|
701 void
|
Chris@49
|
702 subview_elem1<eT,T1>::plus_inplace(Mat<eT>& out, const subview_elem1& in)
|
Chris@49
|
703 {
|
Chris@49
|
704 arma_extra_debug_sigprint();
|
Chris@49
|
705
|
Chris@49
|
706 mat_inplace_op<op_subview_elem_inplace_plus>(out, in);
|
Chris@49
|
707 }
|
Chris@49
|
708
|
Chris@49
|
709
|
Chris@49
|
710
|
Chris@49
|
711 template<typename eT, typename T1>
|
Chris@49
|
712 inline
|
Chris@49
|
713 void
|
Chris@49
|
714 subview_elem1<eT,T1>::minus_inplace(Mat<eT>& out, const subview_elem1& in)
|
Chris@49
|
715 {
|
Chris@49
|
716 arma_extra_debug_sigprint();
|
Chris@49
|
717
|
Chris@49
|
718 mat_inplace_op<op_subview_elem_inplace_minus>(out, in);
|
Chris@49
|
719 }
|
Chris@49
|
720
|
Chris@49
|
721
|
Chris@49
|
722
|
Chris@49
|
723 template<typename eT, typename T1>
|
Chris@49
|
724 inline
|
Chris@49
|
725 void
|
Chris@49
|
726 subview_elem1<eT,T1>::schur_inplace(Mat<eT>& out, const subview_elem1& in)
|
Chris@49
|
727 {
|
Chris@49
|
728 arma_extra_debug_sigprint();
|
Chris@49
|
729
|
Chris@49
|
730 mat_inplace_op<op_subview_elem_inplace_schur>(out, in);
|
Chris@49
|
731 }
|
Chris@49
|
732
|
Chris@49
|
733
|
Chris@49
|
734
|
Chris@49
|
735 template<typename eT, typename T1>
|
Chris@49
|
736 inline
|
Chris@49
|
737 void
|
Chris@49
|
738 subview_elem1<eT,T1>::div_inplace(Mat<eT>& out, const subview_elem1& in)
|
Chris@49
|
739 {
|
Chris@49
|
740 arma_extra_debug_sigprint();
|
Chris@49
|
741
|
Chris@49
|
742 mat_inplace_op<op_subview_elem_inplace_div>(out, in);
|
Chris@49
|
743 }
|
Chris@49
|
744
|
Chris@49
|
745
|
Chris@49
|
746
|
Chris@49
|
747 //! @}
|