Chris@49
|
1 // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-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_cube
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 template<typename eT>
|
Chris@49
|
14 inline
|
Chris@49
|
15 subview_cube<eT>::~subview_cube()
|
Chris@49
|
16 {
|
Chris@49
|
17 arma_extra_debug_sigprint();
|
Chris@49
|
18 }
|
Chris@49
|
19
|
Chris@49
|
20
|
Chris@49
|
21
|
Chris@49
|
22 template<typename eT>
|
Chris@49
|
23 arma_inline
|
Chris@49
|
24 subview_cube<eT>::subview_cube
|
Chris@49
|
25 (
|
Chris@49
|
26 const Cube<eT>& in_m,
|
Chris@49
|
27 const uword in_row1,
|
Chris@49
|
28 const uword in_col1,
|
Chris@49
|
29 const uword in_slice1,
|
Chris@49
|
30 const uword in_n_rows,
|
Chris@49
|
31 const uword in_n_cols,
|
Chris@49
|
32 const uword in_n_slices
|
Chris@49
|
33 )
|
Chris@49
|
34 : m (in_m)
|
Chris@49
|
35 , aux_row1 (in_row1)
|
Chris@49
|
36 , aux_col1 (in_col1)
|
Chris@49
|
37 , aux_slice1 (in_slice1)
|
Chris@49
|
38 , n_rows (in_n_rows)
|
Chris@49
|
39 , n_cols (in_n_cols)
|
Chris@49
|
40 , n_elem_slice(in_n_rows * in_n_cols)
|
Chris@49
|
41 , n_slices (in_n_slices)
|
Chris@49
|
42 , n_elem (n_elem_slice * in_n_slices)
|
Chris@49
|
43 {
|
Chris@49
|
44 arma_extra_debug_sigprint();
|
Chris@49
|
45 }
|
Chris@49
|
46
|
Chris@49
|
47
|
Chris@49
|
48
|
Chris@49
|
49 template<typename eT>
|
Chris@49
|
50 inline
|
Chris@49
|
51 void
|
Chris@49
|
52 subview_cube<eT>::operator+= (const eT val)
|
Chris@49
|
53 {
|
Chris@49
|
54 arma_extra_debug_sigprint();
|
Chris@49
|
55
|
Chris@49
|
56 const uword local_n_rows = n_rows;
|
Chris@49
|
57 const uword local_n_cols = n_cols;
|
Chris@49
|
58 const uword local_n_slices = n_slices;
|
Chris@49
|
59
|
Chris@49
|
60 for(uword slice = 0; slice < local_n_slices; ++slice)
|
Chris@49
|
61 {
|
Chris@49
|
62 for(uword col = 0; col < local_n_cols; ++col)
|
Chris@49
|
63 {
|
Chris@49
|
64 arrayops::inplace_plus( slice_colptr(slice,col), val, local_n_rows );
|
Chris@49
|
65 }
|
Chris@49
|
66 }
|
Chris@49
|
67 }
|
Chris@49
|
68
|
Chris@49
|
69
|
Chris@49
|
70
|
Chris@49
|
71 template<typename eT>
|
Chris@49
|
72 inline
|
Chris@49
|
73 void
|
Chris@49
|
74 subview_cube<eT>::operator-= (const eT val)
|
Chris@49
|
75 {
|
Chris@49
|
76 arma_extra_debug_sigprint();
|
Chris@49
|
77
|
Chris@49
|
78 const uword local_n_rows = n_rows;
|
Chris@49
|
79 const uword local_n_cols = n_cols;
|
Chris@49
|
80 const uword local_n_slices = n_slices;
|
Chris@49
|
81
|
Chris@49
|
82 for(uword slice = 0; slice < local_n_slices; ++slice)
|
Chris@49
|
83 {
|
Chris@49
|
84 for(uword col = 0; col < local_n_cols; ++col)
|
Chris@49
|
85 {
|
Chris@49
|
86 arrayops::inplace_minus( slice_colptr(slice,col), val, local_n_rows );
|
Chris@49
|
87 }
|
Chris@49
|
88 }
|
Chris@49
|
89 }
|
Chris@49
|
90
|
Chris@49
|
91
|
Chris@49
|
92
|
Chris@49
|
93 template<typename eT>
|
Chris@49
|
94 inline
|
Chris@49
|
95 void
|
Chris@49
|
96 subview_cube<eT>::operator*= (const eT val)
|
Chris@49
|
97 {
|
Chris@49
|
98 arma_extra_debug_sigprint();
|
Chris@49
|
99
|
Chris@49
|
100 const uword local_n_rows = n_rows;
|
Chris@49
|
101 const uword local_n_cols = n_cols;
|
Chris@49
|
102 const uword local_n_slices = n_slices;
|
Chris@49
|
103
|
Chris@49
|
104 for(uword slice = 0; slice < local_n_slices; ++slice)
|
Chris@49
|
105 {
|
Chris@49
|
106 for(uword col = 0; col < local_n_cols; ++col)
|
Chris@49
|
107 {
|
Chris@49
|
108 arrayops::inplace_mul( slice_colptr(slice,col), val, local_n_rows );
|
Chris@49
|
109 }
|
Chris@49
|
110 }
|
Chris@49
|
111 }
|
Chris@49
|
112
|
Chris@49
|
113
|
Chris@49
|
114
|
Chris@49
|
115 template<typename eT>
|
Chris@49
|
116 inline
|
Chris@49
|
117 void
|
Chris@49
|
118 subview_cube<eT>::operator/= (const eT val)
|
Chris@49
|
119 {
|
Chris@49
|
120 arma_extra_debug_sigprint();
|
Chris@49
|
121
|
Chris@49
|
122 const uword local_n_rows = n_rows;
|
Chris@49
|
123 const uword local_n_cols = n_cols;
|
Chris@49
|
124 const uword local_n_slices = n_slices;
|
Chris@49
|
125
|
Chris@49
|
126 for(uword slice = 0; slice < local_n_slices; ++slice)
|
Chris@49
|
127 {
|
Chris@49
|
128 for(uword col = 0; col < local_n_cols; ++col)
|
Chris@49
|
129 {
|
Chris@49
|
130 arrayops::inplace_div( slice_colptr(slice,col), val, local_n_rows );
|
Chris@49
|
131 }
|
Chris@49
|
132 }
|
Chris@49
|
133 }
|
Chris@49
|
134
|
Chris@49
|
135
|
Chris@49
|
136
|
Chris@49
|
137 template<typename eT>
|
Chris@49
|
138 template<typename T1>
|
Chris@49
|
139 inline
|
Chris@49
|
140 void
|
Chris@49
|
141 subview_cube<eT>::operator= (const BaseCube<eT,T1>& in)
|
Chris@49
|
142 {
|
Chris@49
|
143 arma_extra_debug_sigprint();
|
Chris@49
|
144
|
Chris@49
|
145 const unwrap_cube<T1> tmp(in.get_ref());
|
Chris@49
|
146
|
Chris@49
|
147 const Cube<eT>& x = tmp.M;
|
Chris@49
|
148 subview_cube<eT>& t = *this;
|
Chris@49
|
149
|
Chris@49
|
150 arma_debug_assert_same_size(t, x, "copy into subcube");
|
Chris@49
|
151
|
Chris@49
|
152 const uword t_n_rows = t.n_rows;
|
Chris@49
|
153 const uword t_n_cols = t.n_cols;
|
Chris@49
|
154 const uword t_n_slices = t.n_slices;
|
Chris@49
|
155
|
Chris@49
|
156 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
157 {
|
Chris@49
|
158 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
159 {
|
Chris@49
|
160 arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
161 }
|
Chris@49
|
162 }
|
Chris@49
|
163 }
|
Chris@49
|
164
|
Chris@49
|
165
|
Chris@49
|
166
|
Chris@49
|
167 template<typename eT>
|
Chris@49
|
168 template<typename T1>
|
Chris@49
|
169 inline
|
Chris@49
|
170 void
|
Chris@49
|
171 subview_cube<eT>::operator+= (const BaseCube<eT,T1>& in)
|
Chris@49
|
172 {
|
Chris@49
|
173 arma_extra_debug_sigprint();
|
Chris@49
|
174
|
Chris@49
|
175 const unwrap_cube<T1> tmp(in.get_ref());
|
Chris@49
|
176
|
Chris@49
|
177 const Cube<eT>& x = tmp.M;
|
Chris@49
|
178 subview_cube<eT>& t = *this;
|
Chris@49
|
179
|
Chris@49
|
180 arma_debug_assert_same_size(t, x, "addition");
|
Chris@49
|
181
|
Chris@49
|
182 const uword t_n_rows = t.n_rows;
|
Chris@49
|
183 const uword t_n_cols = t.n_cols;
|
Chris@49
|
184 const uword t_n_slices = t.n_slices;
|
Chris@49
|
185
|
Chris@49
|
186 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
187 {
|
Chris@49
|
188 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
189 {
|
Chris@49
|
190 arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
191 }
|
Chris@49
|
192 }
|
Chris@49
|
193 }
|
Chris@49
|
194
|
Chris@49
|
195
|
Chris@49
|
196
|
Chris@49
|
197 template<typename eT>
|
Chris@49
|
198 template<typename T1>
|
Chris@49
|
199 inline
|
Chris@49
|
200 void
|
Chris@49
|
201 subview_cube<eT>::operator-= (const BaseCube<eT,T1>& in)
|
Chris@49
|
202 {
|
Chris@49
|
203 arma_extra_debug_sigprint();
|
Chris@49
|
204
|
Chris@49
|
205 const unwrap_cube<T1> tmp(in.get_ref());
|
Chris@49
|
206
|
Chris@49
|
207 const Cube<eT>& x = tmp.M;
|
Chris@49
|
208 subview_cube<eT>& t = *this;
|
Chris@49
|
209
|
Chris@49
|
210 arma_debug_assert_same_size(t, x, "subtraction");
|
Chris@49
|
211
|
Chris@49
|
212 const uword t_n_rows = t.n_rows;
|
Chris@49
|
213 const uword t_n_cols = t.n_cols;
|
Chris@49
|
214 const uword t_n_slices = t.n_slices;
|
Chris@49
|
215
|
Chris@49
|
216 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
217 {
|
Chris@49
|
218 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
219 {
|
Chris@49
|
220 arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
221 }
|
Chris@49
|
222 }
|
Chris@49
|
223 }
|
Chris@49
|
224
|
Chris@49
|
225
|
Chris@49
|
226
|
Chris@49
|
227 template<typename eT>
|
Chris@49
|
228 template<typename T1>
|
Chris@49
|
229 inline
|
Chris@49
|
230 void
|
Chris@49
|
231 subview_cube<eT>::operator%= (const BaseCube<eT,T1>& in)
|
Chris@49
|
232 {
|
Chris@49
|
233 arma_extra_debug_sigprint();
|
Chris@49
|
234
|
Chris@49
|
235 const unwrap_cube<T1> tmp(in.get_ref());
|
Chris@49
|
236
|
Chris@49
|
237 const Cube<eT>& x = tmp.M;
|
Chris@49
|
238 subview_cube<eT>& t = *this;
|
Chris@49
|
239
|
Chris@49
|
240 arma_debug_assert_same_size(t, x, "element-wise multiplication");
|
Chris@49
|
241
|
Chris@49
|
242 const uword t_n_rows = t.n_rows;
|
Chris@49
|
243 const uword t_n_cols = t.n_cols;
|
Chris@49
|
244 const uword t_n_slices = t.n_slices;
|
Chris@49
|
245
|
Chris@49
|
246 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
247 {
|
Chris@49
|
248 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
249 {
|
Chris@49
|
250 arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
251 }
|
Chris@49
|
252 }
|
Chris@49
|
253 }
|
Chris@49
|
254
|
Chris@49
|
255
|
Chris@49
|
256
|
Chris@49
|
257 template<typename eT>
|
Chris@49
|
258 template<typename T1>
|
Chris@49
|
259 inline
|
Chris@49
|
260 void
|
Chris@49
|
261 subview_cube<eT>::operator/= (const BaseCube<eT,T1>& in)
|
Chris@49
|
262 {
|
Chris@49
|
263 arma_extra_debug_sigprint();
|
Chris@49
|
264
|
Chris@49
|
265 const unwrap_cube<T1> tmp(in.get_ref());
|
Chris@49
|
266
|
Chris@49
|
267 const Cube<eT>& x = tmp.M;
|
Chris@49
|
268 subview_cube<eT>& t = *this;
|
Chris@49
|
269
|
Chris@49
|
270 arma_debug_assert_same_size(t, x, "element-wise division");
|
Chris@49
|
271
|
Chris@49
|
272 const uword t_n_rows = t.n_rows;
|
Chris@49
|
273 const uword t_n_cols = t.n_cols;
|
Chris@49
|
274 const uword t_n_slices = t.n_slices;
|
Chris@49
|
275
|
Chris@49
|
276 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
277 {
|
Chris@49
|
278 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
279 {
|
Chris@49
|
280 arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
281 }
|
Chris@49
|
282 }
|
Chris@49
|
283 }
|
Chris@49
|
284
|
Chris@49
|
285
|
Chris@49
|
286
|
Chris@49
|
287 //! x.subcube(...) = y.subcube(...)
|
Chris@49
|
288 template<typename eT>
|
Chris@49
|
289 inline
|
Chris@49
|
290 void
|
Chris@49
|
291 subview_cube<eT>::operator= (const subview_cube<eT>& x_in)
|
Chris@49
|
292 {
|
Chris@49
|
293 arma_extra_debug_sigprint();
|
Chris@49
|
294
|
Chris@49
|
295 const bool overlap = check_overlap(x_in);
|
Chris@49
|
296
|
Chris@49
|
297 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
|
Chris@49
|
298 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
|
Chris@49
|
299 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
|
Chris@49
|
300
|
Chris@49
|
301 subview_cube<eT>& t = *this;
|
Chris@49
|
302
|
Chris@49
|
303 arma_debug_assert_same_size(t, x, "copy into subcube");
|
Chris@49
|
304
|
Chris@49
|
305 const uword t_n_rows = t.n_rows;
|
Chris@49
|
306 const uword t_n_cols = t.n_cols;
|
Chris@49
|
307 const uword t_n_slices = t.n_slices;
|
Chris@49
|
308
|
Chris@49
|
309 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
310 {
|
Chris@49
|
311 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
312 {
|
Chris@49
|
313 arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
314 }
|
Chris@49
|
315 }
|
Chris@49
|
316
|
Chris@49
|
317 if(overlap)
|
Chris@49
|
318 {
|
Chris@49
|
319 delete tmp_subview_cube;
|
Chris@49
|
320 delete tmp_cube;
|
Chris@49
|
321 }
|
Chris@49
|
322
|
Chris@49
|
323 }
|
Chris@49
|
324
|
Chris@49
|
325
|
Chris@49
|
326
|
Chris@49
|
327 template<typename eT>
|
Chris@49
|
328 inline
|
Chris@49
|
329 void
|
Chris@49
|
330 subview_cube<eT>::operator+= (const subview_cube<eT>& x_in)
|
Chris@49
|
331 {
|
Chris@49
|
332 arma_extra_debug_sigprint();
|
Chris@49
|
333
|
Chris@49
|
334 const bool overlap = check_overlap(x_in);
|
Chris@49
|
335
|
Chris@49
|
336 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
|
Chris@49
|
337 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
|
Chris@49
|
338 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
|
Chris@49
|
339
|
Chris@49
|
340 subview_cube<eT>& t = *this;
|
Chris@49
|
341
|
Chris@49
|
342 arma_debug_assert_same_size(t, x, "addition");
|
Chris@49
|
343
|
Chris@49
|
344 const uword t_n_rows = t.n_rows;
|
Chris@49
|
345 const uword t_n_cols = t.n_cols;
|
Chris@49
|
346 const uword t_n_slices = t.n_slices;
|
Chris@49
|
347
|
Chris@49
|
348 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
349 {
|
Chris@49
|
350 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
351 {
|
Chris@49
|
352 arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
353 }
|
Chris@49
|
354 }
|
Chris@49
|
355
|
Chris@49
|
356 if(overlap)
|
Chris@49
|
357 {
|
Chris@49
|
358 delete tmp_subview_cube;
|
Chris@49
|
359 delete tmp_cube;
|
Chris@49
|
360 }
|
Chris@49
|
361
|
Chris@49
|
362 }
|
Chris@49
|
363
|
Chris@49
|
364
|
Chris@49
|
365
|
Chris@49
|
366 template<typename eT>
|
Chris@49
|
367 inline
|
Chris@49
|
368 void
|
Chris@49
|
369 subview_cube<eT>::operator-= (const subview_cube<eT>& x_in)
|
Chris@49
|
370 {
|
Chris@49
|
371 arma_extra_debug_sigprint();
|
Chris@49
|
372
|
Chris@49
|
373 const bool overlap = check_overlap(x_in);
|
Chris@49
|
374
|
Chris@49
|
375 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
|
Chris@49
|
376 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
|
Chris@49
|
377 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
|
Chris@49
|
378
|
Chris@49
|
379 subview_cube<eT>& t = *this;
|
Chris@49
|
380
|
Chris@49
|
381 arma_debug_assert_same_size(t, x, "subtraction");
|
Chris@49
|
382
|
Chris@49
|
383 const uword t_n_rows = t.n_rows;
|
Chris@49
|
384 const uword t_n_cols = t.n_cols;
|
Chris@49
|
385 const uword t_n_slices = t.n_slices;
|
Chris@49
|
386
|
Chris@49
|
387 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
388 {
|
Chris@49
|
389 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
390 {
|
Chris@49
|
391 arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
392 }
|
Chris@49
|
393 }
|
Chris@49
|
394
|
Chris@49
|
395 if(overlap)
|
Chris@49
|
396 {
|
Chris@49
|
397 delete tmp_subview_cube;
|
Chris@49
|
398 delete tmp_cube;
|
Chris@49
|
399 }
|
Chris@49
|
400
|
Chris@49
|
401 }
|
Chris@49
|
402
|
Chris@49
|
403
|
Chris@49
|
404
|
Chris@49
|
405 template<typename eT>
|
Chris@49
|
406 inline
|
Chris@49
|
407 void
|
Chris@49
|
408 subview_cube<eT>::operator%= (const subview_cube<eT>& x_in)
|
Chris@49
|
409 {
|
Chris@49
|
410 arma_extra_debug_sigprint();
|
Chris@49
|
411
|
Chris@49
|
412 const bool overlap = check_overlap(x_in);
|
Chris@49
|
413
|
Chris@49
|
414 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
|
Chris@49
|
415 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
|
Chris@49
|
416 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
|
Chris@49
|
417
|
Chris@49
|
418 subview_cube<eT>& t = *this;
|
Chris@49
|
419
|
Chris@49
|
420 arma_debug_assert_same_size(t, x, "element-wise multiplication");
|
Chris@49
|
421
|
Chris@49
|
422 const uword t_n_rows = t.n_rows;
|
Chris@49
|
423 const uword t_n_cols = t.n_cols;
|
Chris@49
|
424 const uword t_n_slices = t.n_slices;
|
Chris@49
|
425
|
Chris@49
|
426 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
427 {
|
Chris@49
|
428 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
429 {
|
Chris@49
|
430 arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
431 }
|
Chris@49
|
432 }
|
Chris@49
|
433
|
Chris@49
|
434 if(overlap)
|
Chris@49
|
435 {
|
Chris@49
|
436 delete tmp_subview_cube;
|
Chris@49
|
437 delete tmp_cube;
|
Chris@49
|
438 }
|
Chris@49
|
439
|
Chris@49
|
440 }
|
Chris@49
|
441
|
Chris@49
|
442
|
Chris@49
|
443
|
Chris@49
|
444 template<typename eT>
|
Chris@49
|
445 inline
|
Chris@49
|
446 void
|
Chris@49
|
447 subview_cube<eT>::operator/= (const subview_cube<eT>& x_in)
|
Chris@49
|
448 {
|
Chris@49
|
449 arma_extra_debug_sigprint();
|
Chris@49
|
450
|
Chris@49
|
451 const bool overlap = check_overlap(x_in);
|
Chris@49
|
452
|
Chris@49
|
453 Cube<eT>* tmp_cube = overlap ? new Cube<eT>(x_in.m) : 0;
|
Chris@49
|
454 const subview_cube<eT>* tmp_subview_cube = overlap ? new subview_cube<eT>(*tmp_cube, x_in.aux_row1, x_in.aux_col1, x_in.aux_slice1, x_in.n_rows, x_in.n_cols, x_in.n_slices) : 0;
|
Chris@49
|
455 const subview_cube<eT>& x = overlap ? (*tmp_subview_cube) : x_in;
|
Chris@49
|
456
|
Chris@49
|
457 subview_cube<eT>& t = *this;
|
Chris@49
|
458
|
Chris@49
|
459 arma_debug_assert_same_size(t, x, "element-wise division");
|
Chris@49
|
460
|
Chris@49
|
461 const uword t_n_rows = t.n_rows;
|
Chris@49
|
462 const uword t_n_cols = t.n_cols;
|
Chris@49
|
463 const uword t_n_slices = t.n_slices;
|
Chris@49
|
464
|
Chris@49
|
465 for(uword slice = 0; slice < t_n_slices; ++slice)
|
Chris@49
|
466 {
|
Chris@49
|
467 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
468 {
|
Chris@49
|
469 arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );
|
Chris@49
|
470 }
|
Chris@49
|
471 }
|
Chris@49
|
472
|
Chris@49
|
473 if(overlap)
|
Chris@49
|
474 {
|
Chris@49
|
475 delete tmp_subview_cube;
|
Chris@49
|
476 delete tmp_cube;
|
Chris@49
|
477 }
|
Chris@49
|
478
|
Chris@49
|
479 }
|
Chris@49
|
480
|
Chris@49
|
481
|
Chris@49
|
482
|
Chris@49
|
483 template<typename eT>
|
Chris@49
|
484 template<typename T1>
|
Chris@49
|
485 inline
|
Chris@49
|
486 void
|
Chris@49
|
487 subview_cube<eT>::operator= (const Base<eT,T1>& in)
|
Chris@49
|
488 {
|
Chris@49
|
489 arma_extra_debug_sigprint();
|
Chris@49
|
490
|
Chris@49
|
491 const unwrap<T1> tmp(in.get_ref());
|
Chris@49
|
492
|
Chris@49
|
493 const Mat<eT>& x = tmp.M;
|
Chris@49
|
494 subview_cube<eT>& t = *this;
|
Chris@49
|
495
|
Chris@49
|
496 const uword t_n_rows = t.n_rows;
|
Chris@49
|
497 const uword t_n_cols = t.n_cols;
|
Chris@49
|
498 const uword t_n_slices = t.n_slices;
|
Chris@49
|
499
|
Chris@49
|
500 const uword x_n_rows = x.n_rows;
|
Chris@49
|
501 const uword x_n_cols = x.n_cols;
|
Chris@49
|
502
|
Chris@49
|
503 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
|
Chris@49
|
504 {
|
Chris@49
|
505 // interpret the matrix as a cube with one slice
|
Chris@49
|
506
|
Chris@49
|
507 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
508 {
|
Chris@49
|
509 arrayops::copy( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
|
Chris@49
|
510 }
|
Chris@49
|
511 }
|
Chris@49
|
512 else
|
Chris@49
|
513 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
|
Chris@49
|
514 {
|
Chris@49
|
515 for(uword i=0; i < t_n_slices; ++i)
|
Chris@49
|
516 {
|
Chris@49
|
517 arrayops::copy( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
|
Chris@49
|
518 }
|
Chris@49
|
519 }
|
Chris@49
|
520 else
|
Chris@49
|
521 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
|
Chris@49
|
522 {
|
Chris@49
|
523 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
|
Chris@49
|
524
|
Chris@49
|
525 const uword t_aux_row1 = t.aux_row1;
|
Chris@49
|
526 const uword t_aux_col1 = t.aux_col1;
|
Chris@49
|
527 const uword t_aux_slice1 = t.aux_slice1;
|
Chris@49
|
528
|
Chris@49
|
529 for(uword slice=0; slice < t_n_slices; ++slice)
|
Chris@49
|
530 {
|
Chris@49
|
531 const uword mod_slice = t_aux_slice1 + slice;
|
Chris@49
|
532
|
Chris@49
|
533 const eT* x_colptr = x.colptr(slice);
|
Chris@49
|
534
|
Chris@49
|
535 uword i,j;
|
Chris@49
|
536 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
|
Chris@49
|
537 {
|
Chris@49
|
538 const eT tmp_i = x_colptr[i];
|
Chris@49
|
539 const eT tmp_j = x_colptr[j];
|
Chris@49
|
540
|
Chris@49
|
541 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = tmp_i;
|
Chris@49
|
542 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) = tmp_j;
|
Chris@49
|
543 }
|
Chris@49
|
544
|
Chris@49
|
545 if(i < t_n_cols)
|
Chris@49
|
546 {
|
Chris@49
|
547 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = x_colptr[i];
|
Chris@49
|
548 }
|
Chris@49
|
549 }
|
Chris@49
|
550 }
|
Chris@49
|
551 else
|
Chris@49
|
552 {
|
Chris@49
|
553 if(arma_config::debug == true)
|
Chris@49
|
554 {
|
Chris@49
|
555 arma_stop( arma_incompat_size_string(t, x, "copy into subcube") );
|
Chris@49
|
556 }
|
Chris@49
|
557 }
|
Chris@49
|
558 }
|
Chris@49
|
559
|
Chris@49
|
560
|
Chris@49
|
561
|
Chris@49
|
562 template<typename eT>
|
Chris@49
|
563 template<typename T1>
|
Chris@49
|
564 inline
|
Chris@49
|
565 void
|
Chris@49
|
566 subview_cube<eT>::operator+= (const Base<eT,T1>& in)
|
Chris@49
|
567 {
|
Chris@49
|
568 arma_extra_debug_sigprint();
|
Chris@49
|
569
|
Chris@49
|
570 const unwrap<T1> tmp(in.get_ref());
|
Chris@49
|
571
|
Chris@49
|
572 const Mat<eT>& x = tmp.M;
|
Chris@49
|
573 subview_cube<eT>& t = *this;
|
Chris@49
|
574
|
Chris@49
|
575 const uword t_n_rows = t.n_rows;
|
Chris@49
|
576 const uword t_n_cols = t.n_cols;
|
Chris@49
|
577 const uword t_n_slices = t.n_slices;
|
Chris@49
|
578
|
Chris@49
|
579 const uword x_n_rows = x.n_rows;
|
Chris@49
|
580 const uword x_n_cols = x.n_cols;
|
Chris@49
|
581
|
Chris@49
|
582 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
|
Chris@49
|
583 {
|
Chris@49
|
584 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
585 {
|
Chris@49
|
586 arrayops::inplace_plus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
|
Chris@49
|
587 }
|
Chris@49
|
588 }
|
Chris@49
|
589 else
|
Chris@49
|
590 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
|
Chris@49
|
591 {
|
Chris@49
|
592 for(uword i=0; i < t_n_slices; ++i)
|
Chris@49
|
593 {
|
Chris@49
|
594 arrayops::inplace_plus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
|
Chris@49
|
595 }
|
Chris@49
|
596 }
|
Chris@49
|
597 else
|
Chris@49
|
598 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
|
Chris@49
|
599 {
|
Chris@49
|
600 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
|
Chris@49
|
601
|
Chris@49
|
602 const uword t_aux_row1 = t.aux_row1;
|
Chris@49
|
603 const uword t_aux_col1 = t.aux_col1;
|
Chris@49
|
604 const uword t_aux_slice1 = t.aux_slice1;
|
Chris@49
|
605
|
Chris@49
|
606 for(uword slice=0; slice < t_n_slices; ++slice)
|
Chris@49
|
607 {
|
Chris@49
|
608 const uword mod_slice = t_aux_slice1 + slice;
|
Chris@49
|
609
|
Chris@49
|
610 const eT* x_colptr = x.colptr(slice);
|
Chris@49
|
611
|
Chris@49
|
612 uword i,j;
|
Chris@49
|
613 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
|
Chris@49
|
614 {
|
Chris@49
|
615 const eT tmp_i = x_colptr[i];
|
Chris@49
|
616 const eT tmp_j = x_colptr[j];
|
Chris@49
|
617
|
Chris@49
|
618 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += tmp_i;
|
Chris@49
|
619 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) += tmp_j;
|
Chris@49
|
620 }
|
Chris@49
|
621
|
Chris@49
|
622 if(i < t_n_cols)
|
Chris@49
|
623 {
|
Chris@49
|
624 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += x_colptr[i];
|
Chris@49
|
625 }
|
Chris@49
|
626 }
|
Chris@49
|
627 }
|
Chris@49
|
628 else
|
Chris@49
|
629 {
|
Chris@49
|
630 if(arma_config::debug == true)
|
Chris@49
|
631 {
|
Chris@49
|
632 arma_stop( arma_incompat_size_string(t, x, "addition") );
|
Chris@49
|
633 }
|
Chris@49
|
634 }
|
Chris@49
|
635 }
|
Chris@49
|
636
|
Chris@49
|
637
|
Chris@49
|
638
|
Chris@49
|
639 template<typename eT>
|
Chris@49
|
640 template<typename T1>
|
Chris@49
|
641 inline
|
Chris@49
|
642 void
|
Chris@49
|
643 subview_cube<eT>::operator-= (const Base<eT,T1>& in)
|
Chris@49
|
644 {
|
Chris@49
|
645 arma_extra_debug_sigprint();
|
Chris@49
|
646
|
Chris@49
|
647 const unwrap<T1> tmp(in.get_ref());
|
Chris@49
|
648
|
Chris@49
|
649 const Mat<eT>& x = tmp.M;
|
Chris@49
|
650 subview_cube<eT>& t = *this;
|
Chris@49
|
651
|
Chris@49
|
652 const uword t_n_rows = t.n_rows;
|
Chris@49
|
653 const uword t_n_cols = t.n_cols;
|
Chris@49
|
654 const uword t_n_slices = t.n_slices;
|
Chris@49
|
655
|
Chris@49
|
656 const uword x_n_rows = x.n_rows;
|
Chris@49
|
657 const uword x_n_cols = x.n_cols;
|
Chris@49
|
658
|
Chris@49
|
659 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
|
Chris@49
|
660 {
|
Chris@49
|
661 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
662 {
|
Chris@49
|
663 arrayops::inplace_minus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
|
Chris@49
|
664 }
|
Chris@49
|
665 }
|
Chris@49
|
666 else
|
Chris@49
|
667 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
|
Chris@49
|
668 {
|
Chris@49
|
669 for(uword i=0; i < t_n_slices; ++i)
|
Chris@49
|
670 {
|
Chris@49
|
671 arrayops::inplace_minus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
|
Chris@49
|
672 }
|
Chris@49
|
673 }
|
Chris@49
|
674 else
|
Chris@49
|
675 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
|
Chris@49
|
676 {
|
Chris@49
|
677 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
|
Chris@49
|
678
|
Chris@49
|
679 const uword t_aux_row1 = t.aux_row1;
|
Chris@49
|
680 const uword t_aux_col1 = t.aux_col1;
|
Chris@49
|
681 const uword t_aux_slice1 = t.aux_slice1;
|
Chris@49
|
682
|
Chris@49
|
683 for(uword slice=0; slice < t_n_slices; ++slice)
|
Chris@49
|
684 {
|
Chris@49
|
685 const uword mod_slice = t_aux_slice1 + slice;
|
Chris@49
|
686
|
Chris@49
|
687 const eT* x_colptr = x.colptr(slice);
|
Chris@49
|
688
|
Chris@49
|
689 uword i,j;
|
Chris@49
|
690 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
|
Chris@49
|
691 {
|
Chris@49
|
692 const eT tmp_i = x_colptr[i];
|
Chris@49
|
693 const eT tmp_j = x_colptr[j];
|
Chris@49
|
694
|
Chris@49
|
695 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= tmp_i;
|
Chris@49
|
696 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) -= tmp_j;
|
Chris@49
|
697 }
|
Chris@49
|
698
|
Chris@49
|
699 if(i < t_n_cols)
|
Chris@49
|
700 {
|
Chris@49
|
701 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= x_colptr[i];
|
Chris@49
|
702 }
|
Chris@49
|
703 }
|
Chris@49
|
704 }
|
Chris@49
|
705 else
|
Chris@49
|
706 {
|
Chris@49
|
707 if(arma_config::debug == true)
|
Chris@49
|
708 {
|
Chris@49
|
709 arma_stop( arma_incompat_size_string(t, x, "subtraction") );
|
Chris@49
|
710 }
|
Chris@49
|
711 }
|
Chris@49
|
712 }
|
Chris@49
|
713
|
Chris@49
|
714
|
Chris@49
|
715
|
Chris@49
|
716 template<typename eT>
|
Chris@49
|
717 template<typename T1>
|
Chris@49
|
718 inline
|
Chris@49
|
719 void
|
Chris@49
|
720 subview_cube<eT>::operator%= (const Base<eT,T1>& in)
|
Chris@49
|
721 {
|
Chris@49
|
722 arma_extra_debug_sigprint();
|
Chris@49
|
723
|
Chris@49
|
724 const unwrap<T1> tmp(in.get_ref());
|
Chris@49
|
725
|
Chris@49
|
726 const Mat<eT>& x = tmp.M;
|
Chris@49
|
727 subview_cube<eT>& t = *this;
|
Chris@49
|
728
|
Chris@49
|
729 const uword t_n_rows = t.n_rows;
|
Chris@49
|
730 const uword t_n_cols = t.n_cols;
|
Chris@49
|
731 const uword t_n_slices = t.n_slices;
|
Chris@49
|
732
|
Chris@49
|
733 const uword x_n_rows = x.n_rows;
|
Chris@49
|
734 const uword x_n_cols = x.n_cols;
|
Chris@49
|
735
|
Chris@49
|
736 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
|
Chris@49
|
737 {
|
Chris@49
|
738 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
739 {
|
Chris@49
|
740 arrayops::inplace_mul( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
|
Chris@49
|
741 }
|
Chris@49
|
742 }
|
Chris@49
|
743 else
|
Chris@49
|
744 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
|
Chris@49
|
745 {
|
Chris@49
|
746 for(uword i=0; i < t_n_slices; ++i)
|
Chris@49
|
747 {
|
Chris@49
|
748 arrayops::inplace_mul( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
|
Chris@49
|
749 }
|
Chris@49
|
750 }
|
Chris@49
|
751 else
|
Chris@49
|
752 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
|
Chris@49
|
753 {
|
Chris@49
|
754 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
|
Chris@49
|
755
|
Chris@49
|
756 const uword t_aux_row1 = t.aux_row1;
|
Chris@49
|
757 const uword t_aux_col1 = t.aux_col1;
|
Chris@49
|
758 const uword t_aux_slice1 = t.aux_slice1;
|
Chris@49
|
759
|
Chris@49
|
760 for(uword slice=0; slice < t_n_slices; ++slice)
|
Chris@49
|
761 {
|
Chris@49
|
762 const uword mod_slice = t_aux_slice1 + slice;
|
Chris@49
|
763
|
Chris@49
|
764 const eT* x_colptr = x.colptr(slice);
|
Chris@49
|
765
|
Chris@49
|
766 uword i,j;
|
Chris@49
|
767 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
|
Chris@49
|
768 {
|
Chris@49
|
769 const eT tmp_i = x_colptr[i];
|
Chris@49
|
770 const eT tmp_j = x_colptr[j];
|
Chris@49
|
771
|
Chris@49
|
772 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= tmp_i;
|
Chris@49
|
773 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) *= tmp_j;
|
Chris@49
|
774 }
|
Chris@49
|
775
|
Chris@49
|
776 if(i < t_n_cols)
|
Chris@49
|
777 {
|
Chris@49
|
778 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= x_colptr[i];
|
Chris@49
|
779 }
|
Chris@49
|
780 }
|
Chris@49
|
781 }
|
Chris@49
|
782 else
|
Chris@49
|
783 {
|
Chris@49
|
784 if(arma_config::debug == true)
|
Chris@49
|
785 {
|
Chris@49
|
786 arma_stop( arma_incompat_size_string(t, x, "element-wise multiplication") );
|
Chris@49
|
787 }
|
Chris@49
|
788 }
|
Chris@49
|
789 }
|
Chris@49
|
790
|
Chris@49
|
791
|
Chris@49
|
792
|
Chris@49
|
793 template<typename eT>
|
Chris@49
|
794 template<typename T1>
|
Chris@49
|
795 inline
|
Chris@49
|
796 void
|
Chris@49
|
797 subview_cube<eT>::operator/= (const Base<eT,T1>& in)
|
Chris@49
|
798 {
|
Chris@49
|
799 arma_extra_debug_sigprint();
|
Chris@49
|
800
|
Chris@49
|
801 const unwrap<T1> tmp(in.get_ref());
|
Chris@49
|
802
|
Chris@49
|
803 const Mat<eT>& x = tmp.M;
|
Chris@49
|
804 subview_cube<eT>& t = *this;
|
Chris@49
|
805
|
Chris@49
|
806 const uword t_n_rows = t.n_rows;
|
Chris@49
|
807 const uword t_n_cols = t.n_cols;
|
Chris@49
|
808 const uword t_n_slices = t.n_slices;
|
Chris@49
|
809
|
Chris@49
|
810 const uword x_n_rows = x.n_rows;
|
Chris@49
|
811 const uword x_n_cols = x.n_cols;
|
Chris@49
|
812
|
Chris@49
|
813 if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )
|
Chris@49
|
814 {
|
Chris@49
|
815 for(uword col = 0; col < t_n_cols; ++col)
|
Chris@49
|
816 {
|
Chris@49
|
817 arrayops::inplace_div( t.slice_colptr(0, col), x.colptr(col), t_n_rows );
|
Chris@49
|
818 }
|
Chris@49
|
819 }
|
Chris@49
|
820 else
|
Chris@49
|
821 if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )
|
Chris@49
|
822 {
|
Chris@49
|
823 for(uword i=0; i < t_n_slices; ++i)
|
Chris@49
|
824 {
|
Chris@49
|
825 arrayops::inplace_div( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );
|
Chris@49
|
826 }
|
Chris@49
|
827 }
|
Chris@49
|
828 else
|
Chris@49
|
829 if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )
|
Chris@49
|
830 {
|
Chris@49
|
831 Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);
|
Chris@49
|
832
|
Chris@49
|
833 const uword t_aux_row1 = t.aux_row1;
|
Chris@49
|
834 const uword t_aux_col1 = t.aux_col1;
|
Chris@49
|
835 const uword t_aux_slice1 = t.aux_slice1;
|
Chris@49
|
836
|
Chris@49
|
837 for(uword slice=0; slice < t_n_slices; ++slice)
|
Chris@49
|
838 {
|
Chris@49
|
839 const uword mod_slice = t_aux_slice1 + slice;
|
Chris@49
|
840
|
Chris@49
|
841 const eT* x_colptr = x.colptr(slice);
|
Chris@49
|
842
|
Chris@49
|
843 uword i,j;
|
Chris@49
|
844 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
|
Chris@49
|
845 {
|
Chris@49
|
846 const eT tmp_i = x_colptr[i];
|
Chris@49
|
847 const eT tmp_j = x_colptr[j];
|
Chris@49
|
848
|
Chris@49
|
849 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= tmp_i;
|
Chris@49
|
850 Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) /= tmp_j;
|
Chris@49
|
851 }
|
Chris@49
|
852
|
Chris@49
|
853 if(i < t_n_cols)
|
Chris@49
|
854 {
|
Chris@49
|
855 Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= x_colptr[i];
|
Chris@49
|
856 }
|
Chris@49
|
857 }
|
Chris@49
|
858 }
|
Chris@49
|
859 else
|
Chris@49
|
860 {
|
Chris@49
|
861 if(arma_config::debug == true)
|
Chris@49
|
862 {
|
Chris@49
|
863 arma_stop( arma_incompat_size_string(t, x, "element-wise division") );
|
Chris@49
|
864 }
|
Chris@49
|
865 }
|
Chris@49
|
866 }
|
Chris@49
|
867
|
Chris@49
|
868
|
Chris@49
|
869
|
Chris@49
|
870 //! transform each element in the subview using a functor
|
Chris@49
|
871 template<typename eT>
|
Chris@49
|
872 template<typename functor>
|
Chris@49
|
873 inline
|
Chris@49
|
874 void
|
Chris@49
|
875 subview_cube<eT>::transform(functor F)
|
Chris@49
|
876 {
|
Chris@49
|
877 arma_extra_debug_sigprint();
|
Chris@49
|
878
|
Chris@49
|
879 Cube<eT>& Q = const_cast< Cube<eT>& >(m);
|
Chris@49
|
880
|
Chris@49
|
881 const uword start_col = aux_col1;
|
Chris@49
|
882 const uword start_row = aux_row1;
|
Chris@49
|
883 const uword start_slice = aux_slice1;
|
Chris@49
|
884
|
Chris@49
|
885 const uword end_col_plus1 = start_col + n_cols;
|
Chris@49
|
886 const uword end_row_plus1 = start_row + n_rows;
|
Chris@49
|
887 const uword end_slice_plus1 = start_slice + n_slices;
|
Chris@49
|
888
|
Chris@49
|
889 for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice)
|
Chris@49
|
890 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol )
|
Chris@49
|
891 for(uword urow = start_row; urow < end_row_plus1; ++urow )
|
Chris@49
|
892 {
|
Chris@49
|
893 Q.at(urow, ucol, uslice) = eT( F( Q.at(urow, ucol, uslice) ) );
|
Chris@49
|
894 }
|
Chris@49
|
895 }
|
Chris@49
|
896
|
Chris@49
|
897
|
Chris@49
|
898
|
Chris@49
|
899 //! imbue (fill) the subview with values provided by a functor
|
Chris@49
|
900 template<typename eT>
|
Chris@49
|
901 template<typename functor>
|
Chris@49
|
902 inline
|
Chris@49
|
903 void
|
Chris@49
|
904 subview_cube<eT>::imbue(functor F)
|
Chris@49
|
905 {
|
Chris@49
|
906 arma_extra_debug_sigprint();
|
Chris@49
|
907
|
Chris@49
|
908 Cube<eT>& Q = const_cast< Cube<eT>& >(m);
|
Chris@49
|
909
|
Chris@49
|
910 const uword start_col = aux_col1;
|
Chris@49
|
911 const uword start_row = aux_row1;
|
Chris@49
|
912 const uword start_slice = aux_slice1;
|
Chris@49
|
913
|
Chris@49
|
914 const uword end_col_plus1 = start_col + n_cols;
|
Chris@49
|
915 const uword end_row_plus1 = start_row + n_rows;
|
Chris@49
|
916 const uword end_slice_plus1 = start_slice + n_slices;
|
Chris@49
|
917
|
Chris@49
|
918 for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice)
|
Chris@49
|
919 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol )
|
Chris@49
|
920 for(uword urow = start_row; urow < end_row_plus1; ++urow )
|
Chris@49
|
921 {
|
Chris@49
|
922 Q.at(urow, ucol, uslice) = eT( F() );
|
Chris@49
|
923 }
|
Chris@49
|
924 }
|
Chris@49
|
925
|
Chris@49
|
926
|
Chris@49
|
927
|
Chris@49
|
928 template<typename eT>
|
Chris@49
|
929 inline
|
Chris@49
|
930 void
|
Chris@49
|
931 subview_cube<eT>::fill(const eT val)
|
Chris@49
|
932 {
|
Chris@49
|
933 arma_extra_debug_sigprint();
|
Chris@49
|
934
|
Chris@49
|
935 const uword local_n_rows = n_rows;
|
Chris@49
|
936 const uword local_n_cols = n_cols;
|
Chris@49
|
937 const uword local_n_slices = n_slices;
|
Chris@49
|
938
|
Chris@49
|
939 for(uword slice = 0; slice < local_n_slices; ++slice)
|
Chris@49
|
940 {
|
Chris@49
|
941 for(uword col = 0; col < local_n_cols; ++col)
|
Chris@49
|
942 {
|
Chris@49
|
943 arrayops::inplace_set( slice_colptr(slice,col), val, local_n_rows );
|
Chris@49
|
944 }
|
Chris@49
|
945 }
|
Chris@49
|
946
|
Chris@49
|
947 }
|
Chris@49
|
948
|
Chris@49
|
949
|
Chris@49
|
950
|
Chris@49
|
951 template<typename eT>
|
Chris@49
|
952 inline
|
Chris@49
|
953 void
|
Chris@49
|
954 subview_cube<eT>::zeros()
|
Chris@49
|
955 {
|
Chris@49
|
956 arma_extra_debug_sigprint();
|
Chris@49
|
957
|
Chris@49
|
958 fill(eT(0));
|
Chris@49
|
959 }
|
Chris@49
|
960
|
Chris@49
|
961
|
Chris@49
|
962
|
Chris@49
|
963 template<typename eT>
|
Chris@49
|
964 inline
|
Chris@49
|
965 void
|
Chris@49
|
966 subview_cube<eT>::ones()
|
Chris@49
|
967 {
|
Chris@49
|
968 arma_extra_debug_sigprint();
|
Chris@49
|
969
|
Chris@49
|
970 fill(eT(1));
|
Chris@49
|
971 }
|
Chris@49
|
972
|
Chris@49
|
973
|
Chris@49
|
974
|
Chris@49
|
975 template<typename eT>
|
Chris@49
|
976 inline
|
Chris@49
|
977 eT
|
Chris@49
|
978 subview_cube<eT>::at_alt(const uword i) const
|
Chris@49
|
979 {
|
Chris@49
|
980 return operator[](i);
|
Chris@49
|
981 }
|
Chris@49
|
982
|
Chris@49
|
983
|
Chris@49
|
984
|
Chris@49
|
985 template<typename eT>
|
Chris@49
|
986 inline
|
Chris@49
|
987 eT&
|
Chris@49
|
988 subview_cube<eT>::operator[](const uword i)
|
Chris@49
|
989 {
|
Chris@49
|
990 const uword in_slice = i / n_elem_slice;
|
Chris@49
|
991 const uword offset = in_slice * n_elem_slice;
|
Chris@49
|
992 const uword j = i - offset;
|
Chris@49
|
993
|
Chris@49
|
994 const uword in_col = j / n_rows;
|
Chris@49
|
995 const uword in_row = j % n_rows;
|
Chris@49
|
996
|
Chris@49
|
997 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
998
|
Chris@49
|
999 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
|
Chris@49
|
1000 }
|
Chris@49
|
1001
|
Chris@49
|
1002
|
Chris@49
|
1003
|
Chris@49
|
1004 template<typename eT>
|
Chris@49
|
1005 inline
|
Chris@49
|
1006 eT
|
Chris@49
|
1007 subview_cube<eT>::operator[](const uword i) const
|
Chris@49
|
1008 {
|
Chris@49
|
1009 const uword in_slice = i / n_elem_slice;
|
Chris@49
|
1010 const uword offset = in_slice * n_elem_slice;
|
Chris@49
|
1011 const uword j = i - offset;
|
Chris@49
|
1012
|
Chris@49
|
1013 const uword in_col = j / n_rows;
|
Chris@49
|
1014 const uword in_row = j % n_rows;
|
Chris@49
|
1015
|
Chris@49
|
1016 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1017
|
Chris@49
|
1018 return m.mem[index];
|
Chris@49
|
1019 }
|
Chris@49
|
1020
|
Chris@49
|
1021
|
Chris@49
|
1022
|
Chris@49
|
1023 template<typename eT>
|
Chris@49
|
1024 inline
|
Chris@49
|
1025 eT&
|
Chris@49
|
1026 subview_cube<eT>::operator()(const uword i)
|
Chris@49
|
1027 {
|
Chris@49
|
1028 arma_debug_check( (i >= n_elem), "subview_cube::operator(): index out of bounds");
|
Chris@49
|
1029
|
Chris@49
|
1030 const uword in_slice = i / n_elem_slice;
|
Chris@49
|
1031 const uword offset = in_slice * n_elem_slice;
|
Chris@49
|
1032 const uword j = i - offset;
|
Chris@49
|
1033
|
Chris@49
|
1034 const uword in_col = j / n_rows;
|
Chris@49
|
1035 const uword in_row = j % n_rows;
|
Chris@49
|
1036
|
Chris@49
|
1037 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1038
|
Chris@49
|
1039 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
|
Chris@49
|
1040 }
|
Chris@49
|
1041
|
Chris@49
|
1042
|
Chris@49
|
1043
|
Chris@49
|
1044 template<typename eT>
|
Chris@49
|
1045 inline
|
Chris@49
|
1046 eT
|
Chris@49
|
1047 subview_cube<eT>::operator()(const uword i) const
|
Chris@49
|
1048 {
|
Chris@49
|
1049 arma_debug_check( (i >= n_elem), "subview_cube::operator(): index out of bounds");
|
Chris@49
|
1050
|
Chris@49
|
1051 const uword in_slice = i / n_elem_slice;
|
Chris@49
|
1052 const uword offset = in_slice * n_elem_slice;
|
Chris@49
|
1053 const uword j = i - offset;
|
Chris@49
|
1054
|
Chris@49
|
1055 const uword in_col = j / n_rows;
|
Chris@49
|
1056 const uword in_row = j % n_rows;
|
Chris@49
|
1057
|
Chris@49
|
1058 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1059
|
Chris@49
|
1060 return m.mem[index];
|
Chris@49
|
1061 }
|
Chris@49
|
1062
|
Chris@49
|
1063
|
Chris@49
|
1064
|
Chris@49
|
1065 template<typename eT>
|
Chris@49
|
1066 arma_inline
|
Chris@49
|
1067 eT&
|
Chris@49
|
1068 subview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice)
|
Chris@49
|
1069 {
|
Chris@49
|
1070 arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds");
|
Chris@49
|
1071
|
Chris@49
|
1072 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1073
|
Chris@49
|
1074 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
|
Chris@49
|
1075 }
|
Chris@49
|
1076
|
Chris@49
|
1077
|
Chris@49
|
1078
|
Chris@49
|
1079 template<typename eT>
|
Chris@49
|
1080 arma_inline
|
Chris@49
|
1081 eT
|
Chris@49
|
1082 subview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice) const
|
Chris@49
|
1083 {
|
Chris@49
|
1084 arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds");
|
Chris@49
|
1085
|
Chris@49
|
1086 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1087
|
Chris@49
|
1088 return m.mem[index];
|
Chris@49
|
1089 }
|
Chris@49
|
1090
|
Chris@49
|
1091
|
Chris@49
|
1092
|
Chris@49
|
1093 template<typename eT>
|
Chris@49
|
1094 arma_inline
|
Chris@49
|
1095 eT&
|
Chris@49
|
1096 subview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice)
|
Chris@49
|
1097 {
|
Chris@49
|
1098 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1099
|
Chris@49
|
1100 return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );
|
Chris@49
|
1101 }
|
Chris@49
|
1102
|
Chris@49
|
1103
|
Chris@49
|
1104
|
Chris@49
|
1105 template<typename eT>
|
Chris@49
|
1106 arma_inline
|
Chris@49
|
1107 eT
|
Chris@49
|
1108 subview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice) const
|
Chris@49
|
1109 {
|
Chris@49
|
1110 const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1111
|
Chris@49
|
1112 return m.mem[index];
|
Chris@49
|
1113 }
|
Chris@49
|
1114
|
Chris@49
|
1115
|
Chris@49
|
1116
|
Chris@49
|
1117 template<typename eT>
|
Chris@49
|
1118 arma_inline
|
Chris@49
|
1119 eT*
|
Chris@49
|
1120 subview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col)
|
Chris@49
|
1121 {
|
Chris@49
|
1122 return & access::rw((const_cast< Cube<eT>& >(m)).mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ]);
|
Chris@49
|
1123 }
|
Chris@49
|
1124
|
Chris@49
|
1125
|
Chris@49
|
1126
|
Chris@49
|
1127 template<typename eT>
|
Chris@49
|
1128 arma_inline
|
Chris@49
|
1129 const eT*
|
Chris@49
|
1130 subview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col) const
|
Chris@49
|
1131 {
|
Chris@49
|
1132 return & m.mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ];
|
Chris@49
|
1133 }
|
Chris@49
|
1134
|
Chris@49
|
1135
|
Chris@49
|
1136
|
Chris@49
|
1137 template<typename eT>
|
Chris@49
|
1138 inline
|
Chris@49
|
1139 bool
|
Chris@49
|
1140 subview_cube<eT>::check_overlap(const subview_cube<eT>& x) const
|
Chris@49
|
1141 {
|
Chris@49
|
1142 const subview_cube<eT>& t = *this;
|
Chris@49
|
1143
|
Chris@49
|
1144 if(&t.m != &x.m)
|
Chris@49
|
1145 {
|
Chris@49
|
1146 return false;
|
Chris@49
|
1147 }
|
Chris@49
|
1148 else
|
Chris@49
|
1149 {
|
Chris@49
|
1150 if( (t.n_elem == 0) || (x.n_elem == 0) )
|
Chris@49
|
1151 {
|
Chris@49
|
1152 return false;
|
Chris@49
|
1153 }
|
Chris@49
|
1154 else
|
Chris@49
|
1155 {
|
Chris@49
|
1156 const uword t_row_start = t.aux_row1;
|
Chris@49
|
1157 const uword t_row_end_p1 = t_row_start + t.n_rows;
|
Chris@49
|
1158
|
Chris@49
|
1159 const uword t_col_start = t.aux_col1;
|
Chris@49
|
1160 const uword t_col_end_p1 = t_col_start + t.n_cols;
|
Chris@49
|
1161
|
Chris@49
|
1162 const uword t_slice_start = t.aux_slice1;
|
Chris@49
|
1163 const uword t_slice_end_p1 = t_slice_start + t.n_slices;
|
Chris@49
|
1164
|
Chris@49
|
1165
|
Chris@49
|
1166 const uword x_row_start = x.aux_row1;
|
Chris@49
|
1167 const uword x_row_end_p1 = x_row_start + x.n_rows;
|
Chris@49
|
1168
|
Chris@49
|
1169 const uword x_col_start = x.aux_col1;
|
Chris@49
|
1170 const uword x_col_end_p1 = x_col_start + x.n_cols;
|
Chris@49
|
1171
|
Chris@49
|
1172 const uword x_slice_start = x.aux_slice1;
|
Chris@49
|
1173 const uword x_slice_end_p1 = x_slice_start + x.n_slices;
|
Chris@49
|
1174
|
Chris@49
|
1175
|
Chris@49
|
1176 const bool outside_rows = ( (x_row_start >= t_row_end_p1 ) || (t_row_start >= x_row_end_p1 ) );
|
Chris@49
|
1177 const bool outside_cols = ( (x_col_start >= t_col_end_p1 ) || (t_col_start >= x_col_end_p1 ) );
|
Chris@49
|
1178 const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) );
|
Chris@49
|
1179
|
Chris@49
|
1180 return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) );
|
Chris@49
|
1181 }
|
Chris@49
|
1182 }
|
Chris@49
|
1183 }
|
Chris@49
|
1184
|
Chris@49
|
1185
|
Chris@49
|
1186
|
Chris@49
|
1187 template<typename eT>
|
Chris@49
|
1188 inline
|
Chris@49
|
1189 bool
|
Chris@49
|
1190 subview_cube<eT>::check_overlap(const Mat<eT>& x) const
|
Chris@49
|
1191 {
|
Chris@49
|
1192 const subview_cube<eT>& t = *this;
|
Chris@49
|
1193
|
Chris@49
|
1194 const uword t_aux_slice1 = t.aux_slice1;
|
Chris@49
|
1195 const uword t_aux_slice2_plus_1 = t_aux_slice1 + t.n_slices;
|
Chris@49
|
1196
|
Chris@49
|
1197 for(uword slice = t_aux_slice1; slice < t_aux_slice2_plus_1; ++slice)
|
Chris@49
|
1198 {
|
Chris@49
|
1199 const Mat<eT>& y = *(t.m.mat_ptrs[slice]);
|
Chris@49
|
1200
|
Chris@49
|
1201 if( x.memptr() == y.memptr() )
|
Chris@49
|
1202 {
|
Chris@49
|
1203 return true;
|
Chris@49
|
1204 }
|
Chris@49
|
1205 }
|
Chris@49
|
1206
|
Chris@49
|
1207 return false;
|
Chris@49
|
1208 }
|
Chris@49
|
1209
|
Chris@49
|
1210
|
Chris@49
|
1211
|
Chris@49
|
1212 //! cube X = Y.subcube(...)
|
Chris@49
|
1213 template<typename eT>
|
Chris@49
|
1214 inline
|
Chris@49
|
1215 void
|
Chris@49
|
1216 subview_cube<eT>::extract(Cube<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1217 {
|
Chris@49
|
1218 arma_extra_debug_sigprint();
|
Chris@49
|
1219
|
Chris@49
|
1220 // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing;
|
Chris@49
|
1221 // size setting and alias checking is done by either the Cube contructor or operator=()
|
Chris@49
|
1222
|
Chris@49
|
1223 const uword n_rows = in.n_rows;
|
Chris@49
|
1224 const uword n_cols = in.n_cols;
|
Chris@49
|
1225 const uword n_slices = in.n_slices;
|
Chris@49
|
1226
|
Chris@49
|
1227 arma_extra_debug_print(arma_boost::format("out.n_rows = %d out.n_cols = %d out.n_slices = %d in.m.n_rows = %d in.m.n_cols = %d in.m.n_slices = %d") % out.n_rows % out.n_cols % out.n_slices % in.m.n_rows % in.m.n_cols % in.m.n_slices);
|
Chris@49
|
1228
|
Chris@49
|
1229
|
Chris@49
|
1230 for(uword slice = 0; slice < n_slices; ++slice)
|
Chris@49
|
1231 {
|
Chris@49
|
1232 for(uword col = 0; col < n_cols; ++col)
|
Chris@49
|
1233 {
|
Chris@49
|
1234 arrayops::copy( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
|
Chris@49
|
1235 }
|
Chris@49
|
1236 }
|
Chris@49
|
1237 }
|
Chris@49
|
1238
|
Chris@49
|
1239
|
Chris@49
|
1240
|
Chris@49
|
1241 //! cube X += Y.subcube(...)
|
Chris@49
|
1242 template<typename eT>
|
Chris@49
|
1243 inline
|
Chris@49
|
1244 void
|
Chris@49
|
1245 subview_cube<eT>::plus_inplace(Cube<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1246 {
|
Chris@49
|
1247 arma_extra_debug_sigprint();
|
Chris@49
|
1248
|
Chris@49
|
1249 arma_debug_assert_same_size(out, in, "addition");
|
Chris@49
|
1250
|
Chris@49
|
1251 const uword n_rows = out.n_rows;
|
Chris@49
|
1252 const uword n_cols = out.n_cols;
|
Chris@49
|
1253 const uword n_slices = out.n_slices;
|
Chris@49
|
1254
|
Chris@49
|
1255 for(uword slice = 0; slice<n_slices; ++slice)
|
Chris@49
|
1256 {
|
Chris@49
|
1257 for(uword col = 0; col<n_cols; ++col)
|
Chris@49
|
1258 {
|
Chris@49
|
1259 arrayops::inplace_plus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
|
Chris@49
|
1260 }
|
Chris@49
|
1261 }
|
Chris@49
|
1262 }
|
Chris@49
|
1263
|
Chris@49
|
1264
|
Chris@49
|
1265
|
Chris@49
|
1266 //! cube X -= Y.subcube(...)
|
Chris@49
|
1267 template<typename eT>
|
Chris@49
|
1268 inline
|
Chris@49
|
1269 void
|
Chris@49
|
1270 subview_cube<eT>::minus_inplace(Cube<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1271 {
|
Chris@49
|
1272 arma_extra_debug_sigprint();
|
Chris@49
|
1273
|
Chris@49
|
1274 arma_debug_assert_same_size(out, in, "subtraction");
|
Chris@49
|
1275
|
Chris@49
|
1276 const uword n_rows = out.n_rows;
|
Chris@49
|
1277 const uword n_cols = out.n_cols;
|
Chris@49
|
1278 const uword n_slices = out.n_slices;
|
Chris@49
|
1279
|
Chris@49
|
1280 for(uword slice = 0; slice<n_slices; ++slice)
|
Chris@49
|
1281 {
|
Chris@49
|
1282 for(uword col = 0; col<n_cols; ++col)
|
Chris@49
|
1283 {
|
Chris@49
|
1284 arrayops::inplace_minus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
|
Chris@49
|
1285 }
|
Chris@49
|
1286 }
|
Chris@49
|
1287 }
|
Chris@49
|
1288
|
Chris@49
|
1289
|
Chris@49
|
1290
|
Chris@49
|
1291 //! cube X %= Y.subcube(...)
|
Chris@49
|
1292 template<typename eT>
|
Chris@49
|
1293 inline
|
Chris@49
|
1294 void
|
Chris@49
|
1295 subview_cube<eT>::schur_inplace(Cube<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1296 {
|
Chris@49
|
1297 arma_extra_debug_sigprint();
|
Chris@49
|
1298
|
Chris@49
|
1299 arma_debug_assert_same_size(out, in, "element-wise multiplication");
|
Chris@49
|
1300
|
Chris@49
|
1301 const uword n_rows = out.n_rows;
|
Chris@49
|
1302 const uword n_cols = out.n_cols;
|
Chris@49
|
1303 const uword n_slices = out.n_slices;
|
Chris@49
|
1304
|
Chris@49
|
1305 for(uword slice = 0; slice<n_slices; ++slice)
|
Chris@49
|
1306 {
|
Chris@49
|
1307 for(uword col = 0; col<n_cols; ++col)
|
Chris@49
|
1308 {
|
Chris@49
|
1309 arrayops::inplace_mul( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
|
Chris@49
|
1310 }
|
Chris@49
|
1311 }
|
Chris@49
|
1312 }
|
Chris@49
|
1313
|
Chris@49
|
1314
|
Chris@49
|
1315
|
Chris@49
|
1316 //! cube X /= Y.subcube(...)
|
Chris@49
|
1317 template<typename eT>
|
Chris@49
|
1318 inline
|
Chris@49
|
1319 void
|
Chris@49
|
1320 subview_cube<eT>::div_inplace(Cube<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1321 {
|
Chris@49
|
1322 arma_extra_debug_sigprint();
|
Chris@49
|
1323
|
Chris@49
|
1324 arma_debug_assert_same_size(out, in, "element-wise division");
|
Chris@49
|
1325
|
Chris@49
|
1326 const uword n_rows = out.n_rows;
|
Chris@49
|
1327 const uword n_cols = out.n_cols;
|
Chris@49
|
1328 const uword n_slices = out.n_slices;
|
Chris@49
|
1329
|
Chris@49
|
1330 for(uword slice = 0; slice<n_slices; ++slice)
|
Chris@49
|
1331 {
|
Chris@49
|
1332 for(uword col = 0; col<n_cols; ++col)
|
Chris@49
|
1333 {
|
Chris@49
|
1334 arrayops::inplace_div( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );
|
Chris@49
|
1335 }
|
Chris@49
|
1336 }
|
Chris@49
|
1337 }
|
Chris@49
|
1338
|
Chris@49
|
1339
|
Chris@49
|
1340
|
Chris@49
|
1341 //! mat X = Y.subcube(...)
|
Chris@49
|
1342 template<typename eT>
|
Chris@49
|
1343 inline
|
Chris@49
|
1344 void
|
Chris@49
|
1345 subview_cube<eT>::extract(Mat<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1346 {
|
Chris@49
|
1347 arma_extra_debug_sigprint();
|
Chris@49
|
1348
|
Chris@49
|
1349 arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false);
|
Chris@49
|
1350
|
Chris@49
|
1351 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1352 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1353 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1354
|
Chris@49
|
1355 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1356
|
Chris@49
|
1357 if(in_n_slices == 1)
|
Chris@49
|
1358 {
|
Chris@49
|
1359 out.set_size(in_n_rows, in_n_cols);
|
Chris@49
|
1360
|
Chris@49
|
1361 for(uword col=0; col < in_n_cols; ++col)
|
Chris@49
|
1362 {
|
Chris@49
|
1363 arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
|
Chris@49
|
1364 }
|
Chris@49
|
1365 }
|
Chris@49
|
1366 else
|
Chris@49
|
1367 {
|
Chris@49
|
1368 if(out_vec_state == 0)
|
Chris@49
|
1369 {
|
Chris@49
|
1370 if(in_n_cols == 1)
|
Chris@49
|
1371 {
|
Chris@49
|
1372 out.set_size(in_n_rows, in_n_slices);
|
Chris@49
|
1373
|
Chris@49
|
1374 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1375 {
|
Chris@49
|
1376 arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1377 }
|
Chris@49
|
1378 }
|
Chris@49
|
1379 else
|
Chris@49
|
1380 if(in_n_rows == 1)
|
Chris@49
|
1381 {
|
Chris@49
|
1382 const Cube<eT>& Q = in.m;
|
Chris@49
|
1383
|
Chris@49
|
1384 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1385 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1386 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1387
|
Chris@49
|
1388 out.set_size(in_n_cols, in_n_slices);
|
Chris@49
|
1389
|
Chris@49
|
1390 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1391 {
|
Chris@49
|
1392 const uword mod_slice = in_aux_slice1 + slice;
|
Chris@49
|
1393
|
Chris@49
|
1394 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1395
|
Chris@49
|
1396 uword i,j;
|
Chris@49
|
1397 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1398 {
|
Chris@49
|
1399 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1400 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
|
Chris@49
|
1401
|
Chris@49
|
1402 out_colptr[i] = tmp_i;
|
Chris@49
|
1403 out_colptr[j] = tmp_j;
|
Chris@49
|
1404 }
|
Chris@49
|
1405
|
Chris@49
|
1406 if(i < in_n_cols)
|
Chris@49
|
1407 {
|
Chris@49
|
1408 out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1409 }
|
Chris@49
|
1410 }
|
Chris@49
|
1411 }
|
Chris@49
|
1412 }
|
Chris@49
|
1413 else
|
Chris@49
|
1414 {
|
Chris@49
|
1415 out.set_size(in_n_slices);
|
Chris@49
|
1416
|
Chris@49
|
1417 eT* out_mem = out.memptr();
|
Chris@49
|
1418
|
Chris@49
|
1419 const Cube<eT>& Q = in.m;
|
Chris@49
|
1420
|
Chris@49
|
1421 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1422 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1423 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1424
|
Chris@49
|
1425 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1426 {
|
Chris@49
|
1427 out_mem[i] = Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
|
Chris@49
|
1428 }
|
Chris@49
|
1429 }
|
Chris@49
|
1430 }
|
Chris@49
|
1431 }
|
Chris@49
|
1432
|
Chris@49
|
1433
|
Chris@49
|
1434
|
Chris@49
|
1435 //! mat X += Y.subcube(...)
|
Chris@49
|
1436 template<typename eT>
|
Chris@49
|
1437 inline
|
Chris@49
|
1438 void
|
Chris@49
|
1439 subview_cube<eT>::plus_inplace(Mat<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1440 {
|
Chris@49
|
1441 arma_extra_debug_sigprint();
|
Chris@49
|
1442
|
Chris@49
|
1443 arma_debug_assert_cube_as_mat(out, in, "addition", true);
|
Chris@49
|
1444
|
Chris@49
|
1445 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1446 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1447 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1448
|
Chris@49
|
1449 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1450 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1451 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1452
|
Chris@49
|
1453 if(in_n_slices == 1)
|
Chris@49
|
1454 {
|
Chris@49
|
1455 for(uword col=0; col < in_n_cols; ++col)
|
Chris@49
|
1456 {
|
Chris@49
|
1457 arrayops::inplace_plus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
|
Chris@49
|
1458 }
|
Chris@49
|
1459 }
|
Chris@49
|
1460 else
|
Chris@49
|
1461 {
|
Chris@49
|
1462 if(out_vec_state == 0)
|
Chris@49
|
1463 {
|
Chris@49
|
1464 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1465 {
|
Chris@49
|
1466 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1467 {
|
Chris@49
|
1468 arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1469 }
|
Chris@49
|
1470 }
|
Chris@49
|
1471 else
|
Chris@49
|
1472 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1473 {
|
Chris@49
|
1474 const Cube<eT>& Q = in.m;
|
Chris@49
|
1475
|
Chris@49
|
1476 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1477 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1478 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1479
|
Chris@49
|
1480 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1481 {
|
Chris@49
|
1482 const uword mod_slice = in_aux_slice1 + slice;
|
Chris@49
|
1483
|
Chris@49
|
1484 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1485
|
Chris@49
|
1486 uword i,j;
|
Chris@49
|
1487 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1488 {
|
Chris@49
|
1489 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1490 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
|
Chris@49
|
1491
|
Chris@49
|
1492 out_colptr[i] += tmp_i;
|
Chris@49
|
1493 out_colptr[j] += tmp_j;
|
Chris@49
|
1494 }
|
Chris@49
|
1495
|
Chris@49
|
1496 if(i < in_n_cols)
|
Chris@49
|
1497 {
|
Chris@49
|
1498 out_colptr[i] += Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1499 }
|
Chris@49
|
1500 }
|
Chris@49
|
1501 }
|
Chris@49
|
1502 }
|
Chris@49
|
1503 else
|
Chris@49
|
1504 {
|
Chris@49
|
1505 eT* out_mem = out.memptr();
|
Chris@49
|
1506
|
Chris@49
|
1507 const Cube<eT>& Q = in.m;
|
Chris@49
|
1508
|
Chris@49
|
1509 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1510 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1511 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1512
|
Chris@49
|
1513 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1514 {
|
Chris@49
|
1515 out_mem[i] += Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
|
Chris@49
|
1516 }
|
Chris@49
|
1517 }
|
Chris@49
|
1518 }
|
Chris@49
|
1519 }
|
Chris@49
|
1520
|
Chris@49
|
1521
|
Chris@49
|
1522
|
Chris@49
|
1523 //! mat X -= Y.subcube(...)
|
Chris@49
|
1524 template<typename eT>
|
Chris@49
|
1525 inline
|
Chris@49
|
1526 void
|
Chris@49
|
1527 subview_cube<eT>::minus_inplace(Mat<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1528 {
|
Chris@49
|
1529 arma_extra_debug_sigprint();
|
Chris@49
|
1530
|
Chris@49
|
1531 arma_debug_assert_cube_as_mat(out, in, "subtraction", true);
|
Chris@49
|
1532
|
Chris@49
|
1533 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1534 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1535 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1536
|
Chris@49
|
1537 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1538 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1539 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1540
|
Chris@49
|
1541 if(in_n_slices == 1)
|
Chris@49
|
1542 {
|
Chris@49
|
1543 for(uword col=0; col < in_n_cols; ++col)
|
Chris@49
|
1544 {
|
Chris@49
|
1545 arrayops::inplace_minus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
|
Chris@49
|
1546 }
|
Chris@49
|
1547 }
|
Chris@49
|
1548 else
|
Chris@49
|
1549 {
|
Chris@49
|
1550 if(out_vec_state == 0)
|
Chris@49
|
1551 {
|
Chris@49
|
1552 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1553 {
|
Chris@49
|
1554 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1555 {
|
Chris@49
|
1556 arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1557 }
|
Chris@49
|
1558 }
|
Chris@49
|
1559 else
|
Chris@49
|
1560 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1561 {
|
Chris@49
|
1562 const Cube<eT>& Q = in.m;
|
Chris@49
|
1563
|
Chris@49
|
1564 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1565 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1566 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1567
|
Chris@49
|
1568 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1569 {
|
Chris@49
|
1570 const uword mod_slice = in_aux_slice1 + slice;
|
Chris@49
|
1571
|
Chris@49
|
1572 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1573
|
Chris@49
|
1574 uword i,j;
|
Chris@49
|
1575 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1576 {
|
Chris@49
|
1577 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1578 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
|
Chris@49
|
1579
|
Chris@49
|
1580 out_colptr[i] -= tmp_i;
|
Chris@49
|
1581 out_colptr[j] -= tmp_j;
|
Chris@49
|
1582 }
|
Chris@49
|
1583
|
Chris@49
|
1584 if(i < in_n_cols)
|
Chris@49
|
1585 {
|
Chris@49
|
1586 out_colptr[i] -= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1587 }
|
Chris@49
|
1588 }
|
Chris@49
|
1589 }
|
Chris@49
|
1590 }
|
Chris@49
|
1591 else
|
Chris@49
|
1592 {
|
Chris@49
|
1593 eT* out_mem = out.memptr();
|
Chris@49
|
1594
|
Chris@49
|
1595 const Cube<eT>& Q = in.m;
|
Chris@49
|
1596
|
Chris@49
|
1597 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1598 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1599 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1600
|
Chris@49
|
1601 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1602 {
|
Chris@49
|
1603 out_mem[i] -= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
|
Chris@49
|
1604 }
|
Chris@49
|
1605 }
|
Chris@49
|
1606 }
|
Chris@49
|
1607 }
|
Chris@49
|
1608
|
Chris@49
|
1609
|
Chris@49
|
1610
|
Chris@49
|
1611 //! mat X %= Y.subcube(...)
|
Chris@49
|
1612 template<typename eT>
|
Chris@49
|
1613 inline
|
Chris@49
|
1614 void
|
Chris@49
|
1615 subview_cube<eT>::schur_inplace(Mat<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1616 {
|
Chris@49
|
1617 arma_extra_debug_sigprint();
|
Chris@49
|
1618
|
Chris@49
|
1619 arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true);
|
Chris@49
|
1620
|
Chris@49
|
1621 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1622 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1623 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1624
|
Chris@49
|
1625 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1626 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1627 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1628
|
Chris@49
|
1629 if(in_n_slices == 1)
|
Chris@49
|
1630 {
|
Chris@49
|
1631 for(uword col=0; col < in_n_cols; ++col)
|
Chris@49
|
1632 {
|
Chris@49
|
1633 arrayops::inplace_mul( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
|
Chris@49
|
1634 }
|
Chris@49
|
1635 }
|
Chris@49
|
1636 else
|
Chris@49
|
1637 {
|
Chris@49
|
1638 if(out_vec_state == 0)
|
Chris@49
|
1639 {
|
Chris@49
|
1640 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1641 {
|
Chris@49
|
1642 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1643 {
|
Chris@49
|
1644 arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1645 }
|
Chris@49
|
1646 }
|
Chris@49
|
1647 else
|
Chris@49
|
1648 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1649 {
|
Chris@49
|
1650 const Cube<eT>& Q = in.m;
|
Chris@49
|
1651
|
Chris@49
|
1652 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1653 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1654 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1655
|
Chris@49
|
1656 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1657 {
|
Chris@49
|
1658 const uword mod_slice = in_aux_slice1 + slice;
|
Chris@49
|
1659
|
Chris@49
|
1660 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1661
|
Chris@49
|
1662 uword i,j;
|
Chris@49
|
1663 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1664 {
|
Chris@49
|
1665 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1666 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
|
Chris@49
|
1667
|
Chris@49
|
1668 out_colptr[i] *= tmp_i;
|
Chris@49
|
1669 out_colptr[j] *= tmp_j;
|
Chris@49
|
1670 }
|
Chris@49
|
1671
|
Chris@49
|
1672 if(i < in_n_cols)
|
Chris@49
|
1673 {
|
Chris@49
|
1674 out_colptr[i] *= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1675 }
|
Chris@49
|
1676 }
|
Chris@49
|
1677 }
|
Chris@49
|
1678 }
|
Chris@49
|
1679 else
|
Chris@49
|
1680 {
|
Chris@49
|
1681 eT* out_mem = out.memptr();
|
Chris@49
|
1682
|
Chris@49
|
1683 const Cube<eT>& Q = in.m;
|
Chris@49
|
1684
|
Chris@49
|
1685 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1686 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1687 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1688
|
Chris@49
|
1689 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1690 {
|
Chris@49
|
1691 out_mem[i] *= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
|
Chris@49
|
1692 }
|
Chris@49
|
1693 }
|
Chris@49
|
1694 }
|
Chris@49
|
1695 }
|
Chris@49
|
1696
|
Chris@49
|
1697
|
Chris@49
|
1698
|
Chris@49
|
1699 //! mat X /= Y.subcube(...)
|
Chris@49
|
1700 template<typename eT>
|
Chris@49
|
1701 inline
|
Chris@49
|
1702 void
|
Chris@49
|
1703 subview_cube<eT>::div_inplace(Mat<eT>& out, const subview_cube<eT>& in)
|
Chris@49
|
1704 {
|
Chris@49
|
1705 arma_extra_debug_sigprint();
|
Chris@49
|
1706
|
Chris@49
|
1707 arma_debug_assert_cube_as_mat(out, in, "element-wise division", true);
|
Chris@49
|
1708
|
Chris@49
|
1709 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1710 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1711 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1712
|
Chris@49
|
1713 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1714 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1715 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1716
|
Chris@49
|
1717 if(in_n_slices == 1)
|
Chris@49
|
1718 {
|
Chris@49
|
1719 for(uword col=0; col < in_n_cols; ++col)
|
Chris@49
|
1720 {
|
Chris@49
|
1721 arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows );
|
Chris@49
|
1722 }
|
Chris@49
|
1723 }
|
Chris@49
|
1724 else
|
Chris@49
|
1725 {
|
Chris@49
|
1726 if(out_vec_state == 0)
|
Chris@49
|
1727 {
|
Chris@49
|
1728 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1729 {
|
Chris@49
|
1730 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1731 {
|
Chris@49
|
1732 arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1733 }
|
Chris@49
|
1734 }
|
Chris@49
|
1735 else
|
Chris@49
|
1736 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1737 {
|
Chris@49
|
1738 const Cube<eT>& Q = in.m;
|
Chris@49
|
1739
|
Chris@49
|
1740 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1741 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1742 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1743
|
Chris@49
|
1744 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1745 {
|
Chris@49
|
1746 const uword mod_slice = in_aux_slice1 + slice;
|
Chris@49
|
1747
|
Chris@49
|
1748 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1749
|
Chris@49
|
1750 uword i,j;
|
Chris@49
|
1751 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1752 {
|
Chris@49
|
1753 const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1754 const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);
|
Chris@49
|
1755
|
Chris@49
|
1756 out_colptr[i] /= tmp_i;
|
Chris@49
|
1757 out_colptr[j] /= tmp_j;
|
Chris@49
|
1758 }
|
Chris@49
|
1759
|
Chris@49
|
1760 if(i < in_n_cols)
|
Chris@49
|
1761 {
|
Chris@49
|
1762 out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);
|
Chris@49
|
1763 }
|
Chris@49
|
1764 }
|
Chris@49
|
1765 }
|
Chris@49
|
1766 }
|
Chris@49
|
1767 else
|
Chris@49
|
1768 {
|
Chris@49
|
1769 eT* out_mem = out.memptr();
|
Chris@49
|
1770
|
Chris@49
|
1771 const Cube<eT>& Q = in.m;
|
Chris@49
|
1772
|
Chris@49
|
1773 const uword in_aux_row1 = in.aux_row1;
|
Chris@49
|
1774 const uword in_aux_col1 = in.aux_col1;
|
Chris@49
|
1775 const uword in_aux_slice1 = in.aux_slice1;
|
Chris@49
|
1776
|
Chris@49
|
1777 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1778 {
|
Chris@49
|
1779 out_mem[i] /= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);
|
Chris@49
|
1780 }
|
Chris@49
|
1781 }
|
Chris@49
|
1782 }
|
Chris@49
|
1783 }
|
Chris@49
|
1784
|
Chris@49
|
1785
|
Chris@49
|
1786
|
Chris@49
|
1787 //! @}
|