Chris@49
|
1 // Copyright (C) 2012 Conrad Sanderson
|
Chris@49
|
2 //
|
Chris@49
|
3 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
6
|
Chris@49
|
7
|
Chris@49
|
8 //! \addtogroup subview_each
|
Chris@49
|
9 //! @{
|
Chris@49
|
10
|
Chris@49
|
11
|
Chris@49
|
12 //
|
Chris@49
|
13 //
|
Chris@49
|
14 // subview_each_common
|
Chris@49
|
15
|
Chris@49
|
16 template<typename parent, unsigned int mode>
|
Chris@49
|
17 inline
|
Chris@49
|
18 subview_each_common<parent,mode>::subview_each_common(parent& in_p)
|
Chris@49
|
19 : p(in_p)
|
Chris@49
|
20 {
|
Chris@49
|
21 arma_extra_debug_sigprint();
|
Chris@49
|
22 }
|
Chris@49
|
23
|
Chris@49
|
24
|
Chris@49
|
25
|
Chris@49
|
26 template<typename parent, unsigned int mode>
|
Chris@49
|
27 arma_inline
|
Chris@49
|
28 const Mat<typename parent::elem_type>&
|
Chris@49
|
29 subview_each_common<parent,mode>::get_mat_ref_helper(const Mat<typename parent::elem_type>& X) const
|
Chris@49
|
30 {
|
Chris@49
|
31 return X;
|
Chris@49
|
32 }
|
Chris@49
|
33
|
Chris@49
|
34
|
Chris@49
|
35
|
Chris@49
|
36 template<typename parent, unsigned int mode>
|
Chris@49
|
37 arma_inline
|
Chris@49
|
38 const Mat<typename parent::elem_type>&
|
Chris@49
|
39 subview_each_common<parent,mode>::get_mat_ref_helper(const subview<typename parent::elem_type>& X) const
|
Chris@49
|
40 {
|
Chris@49
|
41 return X.m;
|
Chris@49
|
42 }
|
Chris@49
|
43
|
Chris@49
|
44
|
Chris@49
|
45
|
Chris@49
|
46 template<typename parent, unsigned int mode>
|
Chris@49
|
47 arma_inline
|
Chris@49
|
48 const Mat<typename parent::elem_type>&
|
Chris@49
|
49 subview_each_common<parent,mode>::get_mat_ref() const
|
Chris@49
|
50 {
|
Chris@49
|
51 return get_mat_ref_helper(p);
|
Chris@49
|
52 }
|
Chris@49
|
53
|
Chris@49
|
54
|
Chris@49
|
55
|
Chris@49
|
56 template<typename parent, unsigned int mode>
|
Chris@49
|
57 inline
|
Chris@49
|
58 void
|
Chris@49
|
59 subview_each_common<parent,mode>::check_size(const Mat<typename parent::elem_type>& A) const
|
Chris@49
|
60 {
|
Chris@49
|
61 if(arma_config::debug == true)
|
Chris@49
|
62 {
|
Chris@49
|
63 if(mode == 0)
|
Chris@49
|
64 {
|
Chris@49
|
65 if( (A.n_rows != p.n_rows) || (A.n_cols != 1) )
|
Chris@49
|
66 {
|
Chris@49
|
67 arma_stop( incompat_size_string(A) );
|
Chris@49
|
68 }
|
Chris@49
|
69 }
|
Chris@49
|
70 else
|
Chris@49
|
71 {
|
Chris@49
|
72 if( (A.n_rows != 1) || (A.n_cols != p.n_cols) )
|
Chris@49
|
73 {
|
Chris@49
|
74 arma_stop( incompat_size_string(A) );
|
Chris@49
|
75 }
|
Chris@49
|
76 }
|
Chris@49
|
77 }
|
Chris@49
|
78 }
|
Chris@49
|
79
|
Chris@49
|
80
|
Chris@49
|
81
|
Chris@49
|
82 template<typename parent, unsigned int mode>
|
Chris@49
|
83 arma_cold
|
Chris@49
|
84 inline
|
Chris@49
|
85 const std::string
|
Chris@49
|
86 subview_each_common<parent,mode>::incompat_size_string(const Mat<typename parent::elem_type>& A) const
|
Chris@49
|
87 {
|
Chris@49
|
88 std::stringstream tmp;
|
Chris@49
|
89
|
Chris@49
|
90 if(mode == 0)
|
Chris@49
|
91 {
|
Chris@49
|
92 tmp << "each_col(): incompatible size; expected " << p.n_rows << "x1" << ", got " << A.n_rows << 'x' << A.n_cols;
|
Chris@49
|
93 }
|
Chris@49
|
94 else
|
Chris@49
|
95 {
|
Chris@49
|
96 tmp << "each_row(): incompatible size; expected 1x" << p.n_cols << ", got " << A.n_rows << 'x' << A.n_cols;
|
Chris@49
|
97 }
|
Chris@49
|
98
|
Chris@49
|
99 return tmp.str();
|
Chris@49
|
100 }
|
Chris@49
|
101
|
Chris@49
|
102
|
Chris@49
|
103
|
Chris@49
|
104 //
|
Chris@49
|
105 //
|
Chris@49
|
106 // subview_each1
|
Chris@49
|
107
|
Chris@49
|
108
|
Chris@49
|
109
|
Chris@49
|
110 template<typename parent, unsigned int mode>
|
Chris@49
|
111 inline
|
Chris@49
|
112 subview_each1<parent,mode>::~subview_each1()
|
Chris@49
|
113 {
|
Chris@49
|
114 arma_extra_debug_sigprint();
|
Chris@49
|
115 }
|
Chris@49
|
116
|
Chris@49
|
117
|
Chris@49
|
118
|
Chris@49
|
119 template<typename parent, unsigned int mode>
|
Chris@49
|
120 inline
|
Chris@49
|
121 subview_each1<parent,mode>::subview_each1(parent& in_p)
|
Chris@49
|
122 : subview_each_common<parent,mode>::subview_each_common(in_p)
|
Chris@49
|
123 {
|
Chris@49
|
124 arma_extra_debug_sigprint();
|
Chris@49
|
125 }
|
Chris@49
|
126
|
Chris@49
|
127
|
Chris@49
|
128
|
Chris@49
|
129 template<typename parent, unsigned int mode>
|
Chris@49
|
130 template<typename T1>
|
Chris@49
|
131 inline
|
Chris@49
|
132 void
|
Chris@49
|
133 subview_each1<parent,mode>::operator= (const Base<eT,T1>& in)
|
Chris@49
|
134 {
|
Chris@49
|
135 arma_extra_debug_sigprint();
|
Chris@49
|
136
|
Chris@49
|
137 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
138
|
Chris@49
|
139 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
140 const Mat<eT>& A = tmp.M;
|
Chris@49
|
141
|
Chris@49
|
142 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
143
|
Chris@49
|
144 const eT* A_mem = A.memptr();
|
Chris@49
|
145 const uword p_n_rows = p.n_rows;
|
Chris@49
|
146 const uword p_n_cols = p.n_cols;
|
Chris@49
|
147
|
Chris@49
|
148 if(mode == 0) // each column
|
Chris@49
|
149 {
|
Chris@49
|
150 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
151 {
|
Chris@49
|
152 arrayops::copy( p.colptr(i), A_mem, p_n_rows );
|
Chris@49
|
153 }
|
Chris@49
|
154 }
|
Chris@49
|
155 else // each row
|
Chris@49
|
156 {
|
Chris@49
|
157 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
158 {
|
Chris@49
|
159 arrayops::inplace_set( p.colptr(i), A_mem[i], p_n_rows);
|
Chris@49
|
160 }
|
Chris@49
|
161 }
|
Chris@49
|
162 }
|
Chris@49
|
163
|
Chris@49
|
164
|
Chris@49
|
165
|
Chris@49
|
166 template<typename parent, unsigned int mode>
|
Chris@49
|
167 template<typename T1>
|
Chris@49
|
168 inline
|
Chris@49
|
169 void
|
Chris@49
|
170 subview_each1<parent,mode>::operator+= (const Base<eT,T1>& in)
|
Chris@49
|
171 {
|
Chris@49
|
172 arma_extra_debug_sigprint();
|
Chris@49
|
173
|
Chris@49
|
174 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
175
|
Chris@49
|
176 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
177 const Mat<eT>& A = tmp.M;
|
Chris@49
|
178
|
Chris@49
|
179 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
180
|
Chris@49
|
181 const eT* A_mem = A.memptr();
|
Chris@49
|
182 const uword p_n_rows = p.n_rows;
|
Chris@49
|
183 const uword p_n_cols = p.n_cols;
|
Chris@49
|
184
|
Chris@49
|
185 if(mode == 0) // each column
|
Chris@49
|
186 {
|
Chris@49
|
187 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
188 {
|
Chris@49
|
189 arrayops::inplace_plus( p.colptr(i), A_mem, p_n_rows );
|
Chris@49
|
190 }
|
Chris@49
|
191 }
|
Chris@49
|
192 else // each row
|
Chris@49
|
193 {
|
Chris@49
|
194 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
195 {
|
Chris@49
|
196 arrayops::inplace_plus( p.colptr(i), A_mem[i], p_n_rows);
|
Chris@49
|
197 }
|
Chris@49
|
198 }
|
Chris@49
|
199 }
|
Chris@49
|
200
|
Chris@49
|
201
|
Chris@49
|
202
|
Chris@49
|
203 template<typename parent, unsigned int mode>
|
Chris@49
|
204 template<typename T1>
|
Chris@49
|
205 inline
|
Chris@49
|
206 void
|
Chris@49
|
207 subview_each1<parent,mode>::operator-= (const Base<eT,T1>& in)
|
Chris@49
|
208 {
|
Chris@49
|
209 arma_extra_debug_sigprint();
|
Chris@49
|
210
|
Chris@49
|
211 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
212
|
Chris@49
|
213 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
214 const Mat<eT>& A = tmp.M;
|
Chris@49
|
215
|
Chris@49
|
216 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
217
|
Chris@49
|
218 const eT* A_mem = A.memptr();
|
Chris@49
|
219 const uword p_n_rows = p.n_rows;
|
Chris@49
|
220 const uword p_n_cols = p.n_cols;
|
Chris@49
|
221
|
Chris@49
|
222 if(mode == 0) // each column
|
Chris@49
|
223 {
|
Chris@49
|
224 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
225 {
|
Chris@49
|
226 arrayops::inplace_minus( p.colptr(i), A_mem, p_n_rows );
|
Chris@49
|
227 }
|
Chris@49
|
228 }
|
Chris@49
|
229 else // each row
|
Chris@49
|
230 {
|
Chris@49
|
231 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
232 {
|
Chris@49
|
233 arrayops::inplace_minus( p.colptr(i), A_mem[i], p_n_rows);
|
Chris@49
|
234 }
|
Chris@49
|
235 }
|
Chris@49
|
236 }
|
Chris@49
|
237
|
Chris@49
|
238
|
Chris@49
|
239
|
Chris@49
|
240 template<typename parent, unsigned int mode>
|
Chris@49
|
241 template<typename T1>
|
Chris@49
|
242 inline
|
Chris@49
|
243 void
|
Chris@49
|
244 subview_each1<parent,mode>::operator%= (const Base<eT,T1>& in)
|
Chris@49
|
245 {
|
Chris@49
|
246 arma_extra_debug_sigprint();
|
Chris@49
|
247
|
Chris@49
|
248 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
249
|
Chris@49
|
250 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
251 const Mat<eT>& A = tmp.M;
|
Chris@49
|
252
|
Chris@49
|
253 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
254
|
Chris@49
|
255 const eT* A_mem = A.memptr();
|
Chris@49
|
256 const uword p_n_rows = p.n_rows;
|
Chris@49
|
257 const uword p_n_cols = p.n_cols;
|
Chris@49
|
258
|
Chris@49
|
259 if(mode == 0) // each column
|
Chris@49
|
260 {
|
Chris@49
|
261 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
262 {
|
Chris@49
|
263 arrayops::inplace_mul( p.colptr(i), A_mem, p_n_rows );
|
Chris@49
|
264 }
|
Chris@49
|
265 }
|
Chris@49
|
266 else // each row
|
Chris@49
|
267 {
|
Chris@49
|
268 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
269 {
|
Chris@49
|
270 arrayops::inplace_mul( p.colptr(i), A_mem[i], p_n_rows);
|
Chris@49
|
271 }
|
Chris@49
|
272 }
|
Chris@49
|
273 }
|
Chris@49
|
274
|
Chris@49
|
275
|
Chris@49
|
276
|
Chris@49
|
277 template<typename parent, unsigned int mode>
|
Chris@49
|
278 template<typename T1>
|
Chris@49
|
279 inline
|
Chris@49
|
280 void
|
Chris@49
|
281 subview_each1<parent,mode>::operator/= (const Base<eT,T1>& in)
|
Chris@49
|
282 {
|
Chris@49
|
283 arma_extra_debug_sigprint();
|
Chris@49
|
284
|
Chris@49
|
285 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
286
|
Chris@49
|
287 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
288 const Mat<eT>& A = tmp.M;
|
Chris@49
|
289
|
Chris@49
|
290 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
291
|
Chris@49
|
292 const eT* A_mem = A.memptr();
|
Chris@49
|
293 const uword p_n_rows = p.n_rows;
|
Chris@49
|
294 const uword p_n_cols = p.n_cols;
|
Chris@49
|
295
|
Chris@49
|
296 if(mode == 0) // each column
|
Chris@49
|
297 {
|
Chris@49
|
298 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
299 {
|
Chris@49
|
300 arrayops::inplace_div( p.colptr(i), A_mem, p_n_rows );
|
Chris@49
|
301 }
|
Chris@49
|
302 }
|
Chris@49
|
303 else // each row
|
Chris@49
|
304 {
|
Chris@49
|
305 for(uword i=0; i < p_n_cols; ++i)
|
Chris@49
|
306 {
|
Chris@49
|
307 arrayops::inplace_div( p.colptr(i), A_mem[i], p_n_rows);
|
Chris@49
|
308 }
|
Chris@49
|
309 }
|
Chris@49
|
310 }
|
Chris@49
|
311
|
Chris@49
|
312
|
Chris@49
|
313
|
Chris@49
|
314 //
|
Chris@49
|
315 //
|
Chris@49
|
316 // subview_each2
|
Chris@49
|
317
|
Chris@49
|
318
|
Chris@49
|
319
|
Chris@49
|
320 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
321 inline
|
Chris@49
|
322 subview_each2<parent,mode,TB>::~subview_each2()
|
Chris@49
|
323 {
|
Chris@49
|
324 arma_extra_debug_sigprint();
|
Chris@49
|
325 }
|
Chris@49
|
326
|
Chris@49
|
327
|
Chris@49
|
328
|
Chris@49
|
329 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
330 inline
|
Chris@49
|
331 subview_each2<parent,mode,TB>::subview_each2(parent& in_p, const Base<uword, TB>& in_indices)
|
Chris@49
|
332 : subview_each_common<parent,mode>::subview_each_common(in_p)
|
Chris@49
|
333 , base_indices(in_indices)
|
Chris@49
|
334 {
|
Chris@49
|
335 arma_extra_debug_sigprint();
|
Chris@49
|
336 }
|
Chris@49
|
337
|
Chris@49
|
338
|
Chris@49
|
339
|
Chris@49
|
340 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
341 inline
|
Chris@49
|
342 void
|
Chris@49
|
343 subview_each2<parent,mode,TB>::check_indices(const Mat<uword>& indices) const
|
Chris@49
|
344 {
|
Chris@49
|
345 if(mode == 0)
|
Chris@49
|
346 {
|
Chris@49
|
347 arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_col(): list of indices must be a vector" );
|
Chris@49
|
348 }
|
Chris@49
|
349 else
|
Chris@49
|
350 {
|
Chris@49
|
351 arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_row(): list of indices must be a vector" );
|
Chris@49
|
352 }
|
Chris@49
|
353 }
|
Chris@49
|
354
|
Chris@49
|
355
|
Chris@49
|
356
|
Chris@49
|
357 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
358 template<typename T1>
|
Chris@49
|
359 inline
|
Chris@49
|
360 void
|
Chris@49
|
361 subview_each2<parent,mode,TB>::operator= (const Base<eT,T1>& in)
|
Chris@49
|
362 {
|
Chris@49
|
363 arma_extra_debug_sigprint();
|
Chris@49
|
364
|
Chris@49
|
365 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
366
|
Chris@49
|
367 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
368 const Mat<eT>& A = tmp.M;
|
Chris@49
|
369
|
Chris@49
|
370 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
371
|
Chris@49
|
372 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
373 const Mat<uword>& indices = tmp_indices.M;
|
Chris@49
|
374
|
Chris@49
|
375 check_indices(indices);
|
Chris@49
|
376
|
Chris@49
|
377 const eT* A_mem = A.memptr();
|
Chris@49
|
378 const uword p_n_rows = p.n_rows;
|
Chris@49
|
379 const uword p_n_cols = p.n_cols;
|
Chris@49
|
380
|
Chris@49
|
381 const uword* indices_mem = indices.memptr();
|
Chris@49
|
382 const uword N = indices.n_elem;
|
Chris@49
|
383
|
Chris@49
|
384 if(mode == 0) // each column
|
Chris@49
|
385 {
|
Chris@49
|
386 for(uword i=0; i < N; ++i)
|
Chris@49
|
387 {
|
Chris@49
|
388 const uword col = indices_mem[i];
|
Chris@49
|
389
|
Chris@49
|
390 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
|
Chris@49
|
391
|
Chris@49
|
392 arrayops::copy( p.colptr(col), A_mem, p_n_rows );
|
Chris@49
|
393 }
|
Chris@49
|
394 }
|
Chris@49
|
395 else // each row
|
Chris@49
|
396 {
|
Chris@49
|
397 for(uword i=0; i < N; ++i)
|
Chris@49
|
398 {
|
Chris@49
|
399 const uword row = indices_mem[i];
|
Chris@49
|
400
|
Chris@49
|
401 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
|
Chris@49
|
402
|
Chris@49
|
403 for(uword col=0; col < p_n_cols; ++col)
|
Chris@49
|
404 {
|
Chris@49
|
405 p.at(row,col) = A_mem[col];
|
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 parent, unsigned int mode, typename TB>
|
Chris@49
|
414 template<typename T1>
|
Chris@49
|
415 inline
|
Chris@49
|
416 void
|
Chris@49
|
417 subview_each2<parent,mode,TB>::operator+= (const Base<eT,T1>& in)
|
Chris@49
|
418 {
|
Chris@49
|
419 arma_extra_debug_sigprint();
|
Chris@49
|
420
|
Chris@49
|
421 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
422
|
Chris@49
|
423 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
424 const Mat<eT>& A = tmp.M;
|
Chris@49
|
425
|
Chris@49
|
426 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
427
|
Chris@49
|
428 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
429 const Mat<uword>& indices = tmp_indices.M;
|
Chris@49
|
430
|
Chris@49
|
431 check_indices(indices);
|
Chris@49
|
432
|
Chris@49
|
433 const eT* A_mem = A.memptr();
|
Chris@49
|
434 const uword p_n_rows = p.n_rows;
|
Chris@49
|
435 const uword p_n_cols = p.n_cols;
|
Chris@49
|
436
|
Chris@49
|
437 const uword* indices_mem = indices.memptr();
|
Chris@49
|
438 const uword N = indices.n_elem;
|
Chris@49
|
439
|
Chris@49
|
440 if(mode == 0) // each column
|
Chris@49
|
441 {
|
Chris@49
|
442 for(uword i=0; i < N; ++i)
|
Chris@49
|
443 {
|
Chris@49
|
444 const uword col = indices_mem[i];
|
Chris@49
|
445
|
Chris@49
|
446 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
|
Chris@49
|
447
|
Chris@49
|
448 arrayops::inplace_plus( p.colptr(col), A_mem, p_n_rows );
|
Chris@49
|
449 }
|
Chris@49
|
450 }
|
Chris@49
|
451 else // each row
|
Chris@49
|
452 {
|
Chris@49
|
453 for(uword i=0; i < N; ++i)
|
Chris@49
|
454 {
|
Chris@49
|
455 const uword row = indices_mem[i];
|
Chris@49
|
456
|
Chris@49
|
457 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
|
Chris@49
|
458
|
Chris@49
|
459 for(uword col=0; col < p_n_cols; ++col)
|
Chris@49
|
460 {
|
Chris@49
|
461 p.at(row,col) += A_mem[col];
|
Chris@49
|
462 }
|
Chris@49
|
463 }
|
Chris@49
|
464 }
|
Chris@49
|
465 }
|
Chris@49
|
466
|
Chris@49
|
467
|
Chris@49
|
468
|
Chris@49
|
469 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
470 template<typename T1>
|
Chris@49
|
471 inline
|
Chris@49
|
472 void
|
Chris@49
|
473 subview_each2<parent,mode,TB>::operator-= (const Base<eT,T1>& in)
|
Chris@49
|
474 {
|
Chris@49
|
475 arma_extra_debug_sigprint();
|
Chris@49
|
476
|
Chris@49
|
477 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
478
|
Chris@49
|
479 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
480 const Mat<eT>& A = tmp.M;
|
Chris@49
|
481
|
Chris@49
|
482 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
483
|
Chris@49
|
484 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
485 const Mat<uword>& indices = tmp_indices.M;
|
Chris@49
|
486
|
Chris@49
|
487 check_indices(indices);
|
Chris@49
|
488
|
Chris@49
|
489 const eT* A_mem = A.memptr();
|
Chris@49
|
490 const uword p_n_rows = p.n_rows;
|
Chris@49
|
491 const uword p_n_cols = p.n_cols;
|
Chris@49
|
492
|
Chris@49
|
493 const uword* indices_mem = indices.memptr();
|
Chris@49
|
494 const uword N = indices.n_elem;
|
Chris@49
|
495
|
Chris@49
|
496 if(mode == 0) // each column
|
Chris@49
|
497 {
|
Chris@49
|
498 for(uword i=0; i < N; ++i)
|
Chris@49
|
499 {
|
Chris@49
|
500 const uword col = indices_mem[i];
|
Chris@49
|
501
|
Chris@49
|
502 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
|
Chris@49
|
503
|
Chris@49
|
504 arrayops::inplace_minus( p.colptr(col), A_mem, p_n_rows );
|
Chris@49
|
505 }
|
Chris@49
|
506 }
|
Chris@49
|
507 else // each row
|
Chris@49
|
508 {
|
Chris@49
|
509 for(uword i=0; i < N; ++i)
|
Chris@49
|
510 {
|
Chris@49
|
511 const uword row = indices_mem[i];
|
Chris@49
|
512
|
Chris@49
|
513 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
|
Chris@49
|
514
|
Chris@49
|
515 for(uword col=0; col < p_n_cols; ++col)
|
Chris@49
|
516 {
|
Chris@49
|
517 p.at(row,col) -= A_mem[col];
|
Chris@49
|
518 }
|
Chris@49
|
519 }
|
Chris@49
|
520 }
|
Chris@49
|
521 }
|
Chris@49
|
522
|
Chris@49
|
523
|
Chris@49
|
524
|
Chris@49
|
525 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
526 template<typename T1>
|
Chris@49
|
527 inline
|
Chris@49
|
528 void
|
Chris@49
|
529 subview_each2<parent,mode,TB>::operator%= (const Base<eT,T1>& in)
|
Chris@49
|
530 {
|
Chris@49
|
531 arma_extra_debug_sigprint();
|
Chris@49
|
532
|
Chris@49
|
533 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
534
|
Chris@49
|
535 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
536 const Mat<eT>& A = tmp.M;
|
Chris@49
|
537
|
Chris@49
|
538 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
539
|
Chris@49
|
540 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
541 const Mat<uword>& indices = tmp_indices.M;
|
Chris@49
|
542
|
Chris@49
|
543 check_indices(indices);
|
Chris@49
|
544
|
Chris@49
|
545 const eT* A_mem = A.memptr();
|
Chris@49
|
546 const uword p_n_rows = p.n_rows;
|
Chris@49
|
547 const uword p_n_cols = p.n_cols;
|
Chris@49
|
548
|
Chris@49
|
549 const uword* indices_mem = indices.memptr();
|
Chris@49
|
550 const uword N = indices.n_elem;
|
Chris@49
|
551
|
Chris@49
|
552 if(mode == 0) // each column
|
Chris@49
|
553 {
|
Chris@49
|
554 for(uword i=0; i < N; ++i)
|
Chris@49
|
555 {
|
Chris@49
|
556 const uword col = indices_mem[i];
|
Chris@49
|
557
|
Chris@49
|
558 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
|
Chris@49
|
559
|
Chris@49
|
560 arrayops::inplace_mul( p.colptr(col), A_mem, p_n_rows );
|
Chris@49
|
561 }
|
Chris@49
|
562 }
|
Chris@49
|
563 else // each row
|
Chris@49
|
564 {
|
Chris@49
|
565 for(uword i=0; i < N; ++i)
|
Chris@49
|
566 {
|
Chris@49
|
567 const uword row = indices_mem[i];
|
Chris@49
|
568
|
Chris@49
|
569 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
|
Chris@49
|
570
|
Chris@49
|
571 for(uword col=0; col < p_n_cols; ++col)
|
Chris@49
|
572 {
|
Chris@49
|
573 p.at(row,col) *= A_mem[col];
|
Chris@49
|
574 }
|
Chris@49
|
575 }
|
Chris@49
|
576 }
|
Chris@49
|
577 }
|
Chris@49
|
578
|
Chris@49
|
579
|
Chris@49
|
580
|
Chris@49
|
581 template<typename parent, unsigned int mode, typename TB>
|
Chris@49
|
582 template<typename T1>
|
Chris@49
|
583 inline
|
Chris@49
|
584 void
|
Chris@49
|
585 subview_each2<parent,mode,TB>::operator/= (const Base<eT,T1>& in)
|
Chris@49
|
586 {
|
Chris@49
|
587 arma_extra_debug_sigprint();
|
Chris@49
|
588
|
Chris@49
|
589 parent& p = subview_each_common<parent,mode>::p;
|
Chris@49
|
590
|
Chris@49
|
591 const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
592 const Mat<eT>& A = tmp.M;
|
Chris@49
|
593
|
Chris@49
|
594 subview_each_common<parent,mode>::check_size(A);
|
Chris@49
|
595
|
Chris@49
|
596 const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );
|
Chris@49
|
597 const Mat<uword>& indices = tmp_indices.M;
|
Chris@49
|
598
|
Chris@49
|
599 check_indices(indices);
|
Chris@49
|
600
|
Chris@49
|
601 const eT* A_mem = A.memptr();
|
Chris@49
|
602 const uword p_n_rows = p.n_rows;
|
Chris@49
|
603 const uword p_n_cols = p.n_cols;
|
Chris@49
|
604
|
Chris@49
|
605 const uword* indices_mem = indices.memptr();
|
Chris@49
|
606 const uword N = indices.n_elem;
|
Chris@49
|
607
|
Chris@49
|
608 if(mode == 0) // each column
|
Chris@49
|
609 {
|
Chris@49
|
610 for(uword i=0; i < N; ++i)
|
Chris@49
|
611 {
|
Chris@49
|
612 const uword col = indices_mem[i];
|
Chris@49
|
613
|
Chris@49
|
614 arma_debug_check( (col > p_n_cols), "each_col(): index out of bounds" );
|
Chris@49
|
615
|
Chris@49
|
616 arrayops::inplace_div( p.colptr(col), A_mem, p_n_rows );
|
Chris@49
|
617 }
|
Chris@49
|
618 }
|
Chris@49
|
619 else // each row
|
Chris@49
|
620 {
|
Chris@49
|
621 for(uword i=0; i < N; ++i)
|
Chris@49
|
622 {
|
Chris@49
|
623 const uword row = indices_mem[i];
|
Chris@49
|
624
|
Chris@49
|
625 arma_debug_check( (row > p_n_rows), "each_row(): index out of bounds" );
|
Chris@49
|
626
|
Chris@49
|
627 for(uword col=0; col < p_n_cols; ++col)
|
Chris@49
|
628 {
|
Chris@49
|
629 p.at(row,col) /= A_mem[col];
|
Chris@49
|
630 }
|
Chris@49
|
631 }
|
Chris@49
|
632 }
|
Chris@49
|
633 }
|
Chris@49
|
634
|
Chris@49
|
635
|
Chris@49
|
636
|
Chris@49
|
637 //! @}
|