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