Chris@49
|
1 // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2013 Conrad Sanderson
|
Chris@49
|
3 // Copyright (C) 2011 James Sanders
|
Chris@49
|
4 //
|
Chris@49
|
5 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
8
|
Chris@49
|
9
|
Chris@49
|
10 //! \addtogroup subview
|
Chris@49
|
11 //! @{
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename eT>
|
Chris@49
|
15 inline
|
Chris@49
|
16 subview<eT>::~subview()
|
Chris@49
|
17 {
|
Chris@49
|
18 arma_extra_debug_sigprint();
|
Chris@49
|
19 }
|
Chris@49
|
20
|
Chris@49
|
21
|
Chris@49
|
22 template<typename eT>
|
Chris@49
|
23 inline
|
Chris@49
|
24 subview<eT>::subview(const Mat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols)
|
Chris@49
|
25 : m(in_m)
|
Chris@49
|
26 , aux_row1(in_row1)
|
Chris@49
|
27 , aux_col1(in_col1)
|
Chris@49
|
28 , n_rows(in_n_rows)
|
Chris@49
|
29 , n_cols(in_n_cols)
|
Chris@49
|
30 , n_elem(in_n_rows*in_n_cols)
|
Chris@49
|
31 {
|
Chris@49
|
32 arma_extra_debug_sigprint();
|
Chris@49
|
33 }
|
Chris@49
|
34
|
Chris@49
|
35
|
Chris@49
|
36
|
Chris@49
|
37 template<typename eT>
|
Chris@49
|
38 inline
|
Chris@49
|
39 void
|
Chris@49
|
40 subview<eT>::operator+= (const eT val)
|
Chris@49
|
41 {
|
Chris@49
|
42 arma_extra_debug_sigprint();
|
Chris@49
|
43
|
Chris@49
|
44 const uword local_n_cols = n_cols;
|
Chris@49
|
45 const uword local_n_rows = n_rows;
|
Chris@49
|
46
|
Chris@49
|
47 if(local_n_rows == 1)
|
Chris@49
|
48 {
|
Chris@49
|
49 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
50
|
Chris@49
|
51 const uword urow = aux_row1;
|
Chris@49
|
52 const uword start_col = aux_col1;
|
Chris@49
|
53 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
54
|
Chris@49
|
55 uword ii,jj;
|
Chris@49
|
56 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
|
Chris@49
|
57 {
|
Chris@49
|
58 X.at(urow, ii) += val;
|
Chris@49
|
59 X.at(urow, jj) += val;
|
Chris@49
|
60 }
|
Chris@49
|
61
|
Chris@49
|
62 if(ii < end_col_plus1)
|
Chris@49
|
63 {
|
Chris@49
|
64 X.at(urow, ii) += val;
|
Chris@49
|
65 }
|
Chris@49
|
66 }
|
Chris@49
|
67 else
|
Chris@49
|
68 {
|
Chris@49
|
69 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
70 {
|
Chris@49
|
71 arrayops::inplace_plus( colptr(ucol), val, local_n_rows );
|
Chris@49
|
72 }
|
Chris@49
|
73 }
|
Chris@49
|
74 }
|
Chris@49
|
75
|
Chris@49
|
76
|
Chris@49
|
77
|
Chris@49
|
78 template<typename eT>
|
Chris@49
|
79 inline
|
Chris@49
|
80 void
|
Chris@49
|
81 subview<eT>::operator-= (const eT val)
|
Chris@49
|
82 {
|
Chris@49
|
83 arma_extra_debug_sigprint();
|
Chris@49
|
84
|
Chris@49
|
85 const uword local_n_cols = n_cols;
|
Chris@49
|
86 const uword local_n_rows = n_rows;
|
Chris@49
|
87
|
Chris@49
|
88 if(local_n_rows == 1)
|
Chris@49
|
89 {
|
Chris@49
|
90 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
91
|
Chris@49
|
92 const uword urow = aux_row1;
|
Chris@49
|
93 const uword start_col = aux_col1;
|
Chris@49
|
94 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
95
|
Chris@49
|
96 uword ii,jj;
|
Chris@49
|
97 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
|
Chris@49
|
98 {
|
Chris@49
|
99 X.at(urow, ii) -= val;
|
Chris@49
|
100 X.at(urow, jj) -= val;
|
Chris@49
|
101 }
|
Chris@49
|
102
|
Chris@49
|
103 if(ii < end_col_plus1)
|
Chris@49
|
104 {
|
Chris@49
|
105 X.at(urow, ii) -= val;
|
Chris@49
|
106 }
|
Chris@49
|
107 }
|
Chris@49
|
108 else
|
Chris@49
|
109 {
|
Chris@49
|
110 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
111 {
|
Chris@49
|
112 arrayops::inplace_minus( colptr(ucol), val, local_n_rows );
|
Chris@49
|
113 }
|
Chris@49
|
114 }
|
Chris@49
|
115 }
|
Chris@49
|
116
|
Chris@49
|
117
|
Chris@49
|
118
|
Chris@49
|
119 template<typename eT>
|
Chris@49
|
120 inline
|
Chris@49
|
121 void
|
Chris@49
|
122 subview<eT>::operator*= (const eT val)
|
Chris@49
|
123 {
|
Chris@49
|
124 arma_extra_debug_sigprint();
|
Chris@49
|
125
|
Chris@49
|
126 const uword local_n_cols = n_cols;
|
Chris@49
|
127 const uword local_n_rows = n_rows;
|
Chris@49
|
128
|
Chris@49
|
129 if(local_n_rows == 1)
|
Chris@49
|
130 {
|
Chris@49
|
131 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
132
|
Chris@49
|
133 const uword urow = aux_row1;
|
Chris@49
|
134 const uword start_col = aux_col1;
|
Chris@49
|
135 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
136
|
Chris@49
|
137 uword ii,jj;
|
Chris@49
|
138 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
|
Chris@49
|
139 {
|
Chris@49
|
140 X.at(urow, ii) *= val;
|
Chris@49
|
141 X.at(urow, jj) *= val;
|
Chris@49
|
142 }
|
Chris@49
|
143
|
Chris@49
|
144 if(ii < end_col_plus1)
|
Chris@49
|
145 {
|
Chris@49
|
146 X.at(urow, ii) *= val;
|
Chris@49
|
147 }
|
Chris@49
|
148 }
|
Chris@49
|
149 else
|
Chris@49
|
150 {
|
Chris@49
|
151 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
152 {
|
Chris@49
|
153 arrayops::inplace_mul( colptr(ucol), val, local_n_rows );
|
Chris@49
|
154 }
|
Chris@49
|
155 }
|
Chris@49
|
156 }
|
Chris@49
|
157
|
Chris@49
|
158
|
Chris@49
|
159
|
Chris@49
|
160 template<typename eT>
|
Chris@49
|
161 inline
|
Chris@49
|
162 void
|
Chris@49
|
163 subview<eT>::operator/= (const eT val)
|
Chris@49
|
164 {
|
Chris@49
|
165 arma_extra_debug_sigprint();
|
Chris@49
|
166
|
Chris@49
|
167 const uword local_n_cols = n_cols;
|
Chris@49
|
168 const uword local_n_rows = n_rows;
|
Chris@49
|
169
|
Chris@49
|
170 if(local_n_rows == 1)
|
Chris@49
|
171 {
|
Chris@49
|
172 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
173
|
Chris@49
|
174 const uword urow = aux_row1;
|
Chris@49
|
175 const uword start_col = aux_col1;
|
Chris@49
|
176 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
177
|
Chris@49
|
178 uword ii,jj;
|
Chris@49
|
179 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
|
Chris@49
|
180 {
|
Chris@49
|
181 X.at(urow, ii) /= val;
|
Chris@49
|
182 X.at(urow, jj) /= val;
|
Chris@49
|
183 }
|
Chris@49
|
184
|
Chris@49
|
185 if(ii < end_col_plus1)
|
Chris@49
|
186 {
|
Chris@49
|
187 X.at(urow, ii) /= val;
|
Chris@49
|
188 }
|
Chris@49
|
189 }
|
Chris@49
|
190 else
|
Chris@49
|
191 {
|
Chris@49
|
192 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
193 {
|
Chris@49
|
194 arrayops::inplace_div( colptr(ucol), val, local_n_rows );
|
Chris@49
|
195 }
|
Chris@49
|
196 }
|
Chris@49
|
197 }
|
Chris@49
|
198
|
Chris@49
|
199
|
Chris@49
|
200
|
Chris@49
|
201 template<typename eT>
|
Chris@49
|
202 template<typename T1>
|
Chris@49
|
203 inline
|
Chris@49
|
204 void
|
Chris@49
|
205 subview<eT>::operator= (const Base<eT,T1>& in)
|
Chris@49
|
206 {
|
Chris@49
|
207 arma_extra_debug_sigprint();
|
Chris@49
|
208
|
Chris@49
|
209 const Proxy<T1> P(in.get_ref());
|
Chris@49
|
210
|
Chris@49
|
211 subview<eT>& s = *this;
|
Chris@49
|
212
|
Chris@49
|
213 const uword s_n_rows = s.n_rows;
|
Chris@49
|
214 const uword s_n_cols = s.n_cols;
|
Chris@49
|
215
|
Chris@49
|
216 arma_debug_assert_same_size(s, P, "copy into submatrix");
|
Chris@49
|
217
|
Chris@49
|
218 const bool is_alias = P.is_alias(s.m);
|
Chris@49
|
219
|
Chris@49
|
220 arma_extra_debug_warn(is_alias, "aliasing detected");
|
Chris@49
|
221
|
Chris@49
|
222 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
|
Chris@49
|
223 {
|
Chris@49
|
224 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
|
Chris@49
|
225 const Mat<eT>& x = tmp.M;
|
Chris@49
|
226
|
Chris@49
|
227 if(s_n_rows == 1)
|
Chris@49
|
228 {
|
Chris@49
|
229 const eT* x_mem = x.memptr();
|
Chris@49
|
230
|
Chris@49
|
231 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
232
|
Chris@49
|
233 const uword urow = aux_row1;
|
Chris@49
|
234 const uword start_col = aux_col1;
|
Chris@49
|
235
|
Chris@49
|
236 uword ii,jj;
|
Chris@49
|
237 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
238 {
|
Chris@49
|
239 A.at(urow, start_col+ii) = x_mem[ii];
|
Chris@49
|
240 A.at(urow, start_col+jj) = x_mem[jj];
|
Chris@49
|
241 }
|
Chris@49
|
242
|
Chris@49
|
243 if(ii < s_n_cols)
|
Chris@49
|
244 {
|
Chris@49
|
245 A.at(urow, start_col+ii) = x_mem[ii];
|
Chris@49
|
246 }
|
Chris@49
|
247 }
|
Chris@49
|
248 else
|
Chris@49
|
249 {
|
Chris@49
|
250 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
251 {
|
Chris@49
|
252 arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
253 }
|
Chris@49
|
254 }
|
Chris@49
|
255 }
|
Chris@49
|
256 else
|
Chris@49
|
257 {
|
Chris@49
|
258 if(s_n_rows == 1)
|
Chris@49
|
259 {
|
Chris@49
|
260 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
261
|
Chris@49
|
262 const uword urow = aux_row1;
|
Chris@49
|
263 const uword start_col = aux_col1;
|
Chris@49
|
264
|
Chris@49
|
265 uword ii,jj;
|
Chris@49
|
266 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
267 {
|
Chris@49
|
268 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
269 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
|
Chris@49
|
270
|
Chris@49
|
271 A.at(urow, start_col+ii) = tmp1;
|
Chris@49
|
272 A.at(urow, start_col+jj) = tmp2;
|
Chris@49
|
273 }
|
Chris@49
|
274
|
Chris@49
|
275 if(ii < s_n_cols)
|
Chris@49
|
276 {
|
Chris@49
|
277 A.at(urow, start_col+ii) = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
278 }
|
Chris@49
|
279 }
|
Chris@49
|
280 else
|
Chris@49
|
281 {
|
Chris@49
|
282 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
283 {
|
Chris@49
|
284 eT* s_col_data = s.colptr(ucol);
|
Chris@49
|
285
|
Chris@49
|
286 uword ii,jj;
|
Chris@49
|
287 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
|
Chris@49
|
288 {
|
Chris@49
|
289 const eT tmp1 = P.at(ii,ucol);
|
Chris@49
|
290 const eT tmp2 = P.at(jj,ucol);
|
Chris@49
|
291
|
Chris@49
|
292 s_col_data[ii] = tmp1;
|
Chris@49
|
293 s_col_data[jj] = tmp2;
|
Chris@49
|
294 }
|
Chris@49
|
295
|
Chris@49
|
296 if(ii < s_n_rows)
|
Chris@49
|
297 {
|
Chris@49
|
298 s_col_data[ii] = P.at(ii,ucol);
|
Chris@49
|
299 }
|
Chris@49
|
300 }
|
Chris@49
|
301 }
|
Chris@49
|
302 }
|
Chris@49
|
303 }
|
Chris@49
|
304
|
Chris@49
|
305
|
Chris@49
|
306
|
Chris@49
|
307 template<typename eT>
|
Chris@49
|
308 template<typename T1>
|
Chris@49
|
309 inline
|
Chris@49
|
310 void
|
Chris@49
|
311 subview<eT>::operator+= (const Base<eT,T1>& in)
|
Chris@49
|
312 {
|
Chris@49
|
313 arma_extra_debug_sigprint();
|
Chris@49
|
314
|
Chris@49
|
315 const Proxy<T1> P(in.get_ref());
|
Chris@49
|
316
|
Chris@49
|
317 subview<eT>& s = *this;
|
Chris@49
|
318
|
Chris@49
|
319 const uword s_n_rows = s.n_rows;
|
Chris@49
|
320 const uword s_n_cols = s.n_cols;
|
Chris@49
|
321
|
Chris@49
|
322 arma_debug_assert_same_size(s, P, "addition");
|
Chris@49
|
323
|
Chris@49
|
324 const bool is_alias = P.is_alias(s.m);
|
Chris@49
|
325
|
Chris@49
|
326 arma_extra_debug_warn(is_alias, "aliasing detected");
|
Chris@49
|
327
|
Chris@49
|
328 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
|
Chris@49
|
329 {
|
Chris@49
|
330 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
|
Chris@49
|
331 const Mat<eT>& x = tmp.M;
|
Chris@49
|
332
|
Chris@49
|
333 if(s_n_rows == 1)
|
Chris@49
|
334 {
|
Chris@49
|
335 const eT* x_mem = x.memptr();
|
Chris@49
|
336
|
Chris@49
|
337 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
338
|
Chris@49
|
339 const uword urow = aux_row1;
|
Chris@49
|
340 const uword start_col = aux_col1;
|
Chris@49
|
341
|
Chris@49
|
342 uword ii,jj;
|
Chris@49
|
343 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
344 {
|
Chris@49
|
345 A.at(urow, start_col+ii) += x_mem[ii];
|
Chris@49
|
346 A.at(urow, start_col+jj) += x_mem[jj];
|
Chris@49
|
347 }
|
Chris@49
|
348
|
Chris@49
|
349 if(ii < s_n_cols)
|
Chris@49
|
350 {
|
Chris@49
|
351 A.at(urow, start_col+ii) += x_mem[ii];
|
Chris@49
|
352 }
|
Chris@49
|
353 }
|
Chris@49
|
354 else
|
Chris@49
|
355 {
|
Chris@49
|
356 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
357 {
|
Chris@49
|
358 arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
359 }
|
Chris@49
|
360 }
|
Chris@49
|
361 }
|
Chris@49
|
362 else
|
Chris@49
|
363 {
|
Chris@49
|
364 if(s_n_rows == 1)
|
Chris@49
|
365 {
|
Chris@49
|
366 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
367
|
Chris@49
|
368 const uword urow = aux_row1;
|
Chris@49
|
369 const uword start_col = aux_col1;
|
Chris@49
|
370
|
Chris@49
|
371 uword ii,jj;
|
Chris@49
|
372 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
373 {
|
Chris@49
|
374 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
375 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
|
Chris@49
|
376
|
Chris@49
|
377 A.at(urow, start_col+ii) += tmp1;
|
Chris@49
|
378 A.at(urow, start_col+jj) += tmp2;
|
Chris@49
|
379 }
|
Chris@49
|
380
|
Chris@49
|
381 if(ii < s_n_cols)
|
Chris@49
|
382 {
|
Chris@49
|
383 A.at(urow, start_col+ii) += (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
384 }
|
Chris@49
|
385 }
|
Chris@49
|
386 else
|
Chris@49
|
387 {
|
Chris@49
|
388 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
389 {
|
Chris@49
|
390 eT* s_col_data = s.colptr(ucol);
|
Chris@49
|
391
|
Chris@49
|
392 uword ii,jj;
|
Chris@49
|
393 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
|
Chris@49
|
394 {
|
Chris@49
|
395 const eT val1 = P.at(ii,ucol);
|
Chris@49
|
396 const eT val2 = P.at(jj,ucol);
|
Chris@49
|
397
|
Chris@49
|
398 s_col_data[ii] += val1;
|
Chris@49
|
399 s_col_data[jj] += val2;
|
Chris@49
|
400 }
|
Chris@49
|
401
|
Chris@49
|
402 if(ii < s_n_rows)
|
Chris@49
|
403 {
|
Chris@49
|
404 s_col_data[ii] += P.at(ii,ucol);
|
Chris@49
|
405 }
|
Chris@49
|
406 }
|
Chris@49
|
407 }
|
Chris@49
|
408 }
|
Chris@49
|
409 }
|
Chris@49
|
410
|
Chris@49
|
411
|
Chris@49
|
412
|
Chris@49
|
413 template<typename eT>
|
Chris@49
|
414 template<typename T1>
|
Chris@49
|
415 inline
|
Chris@49
|
416 void
|
Chris@49
|
417 subview<eT>::operator-= (const Base<eT,T1>& in)
|
Chris@49
|
418 {
|
Chris@49
|
419 arma_extra_debug_sigprint();
|
Chris@49
|
420
|
Chris@49
|
421 const Proxy<T1> P(in.get_ref());
|
Chris@49
|
422
|
Chris@49
|
423 subview<eT>& s = *this;
|
Chris@49
|
424
|
Chris@49
|
425 const uword s_n_rows = s.n_rows;
|
Chris@49
|
426 const uword s_n_cols = s.n_cols;
|
Chris@49
|
427
|
Chris@49
|
428 arma_debug_assert_same_size(s, P, "subtraction");
|
Chris@49
|
429
|
Chris@49
|
430 const bool is_alias = P.is_alias(s.m);
|
Chris@49
|
431
|
Chris@49
|
432 arma_extra_debug_warn(is_alias, "aliasing detected");
|
Chris@49
|
433
|
Chris@49
|
434 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
|
Chris@49
|
435 {
|
Chris@49
|
436 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
|
Chris@49
|
437 const Mat<eT>& x = tmp.M;
|
Chris@49
|
438
|
Chris@49
|
439 if(s_n_rows == 1)
|
Chris@49
|
440 {
|
Chris@49
|
441 const eT* x_mem = x.memptr();
|
Chris@49
|
442
|
Chris@49
|
443 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
444
|
Chris@49
|
445 const uword urow = aux_row1;
|
Chris@49
|
446 const uword start_col = aux_col1;
|
Chris@49
|
447
|
Chris@49
|
448 uword ii,jj;
|
Chris@49
|
449 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
450 {
|
Chris@49
|
451 A.at(urow, start_col+ii) -= x_mem[ii];
|
Chris@49
|
452 A.at(urow, start_col+jj) -= x_mem[jj];
|
Chris@49
|
453 }
|
Chris@49
|
454
|
Chris@49
|
455 if(ii < s_n_cols)
|
Chris@49
|
456 {
|
Chris@49
|
457 A.at(urow, start_col+ii) -= x_mem[ii];
|
Chris@49
|
458 }
|
Chris@49
|
459 }
|
Chris@49
|
460 else
|
Chris@49
|
461 {
|
Chris@49
|
462 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
463 {
|
Chris@49
|
464 arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
465 }
|
Chris@49
|
466 }
|
Chris@49
|
467 }
|
Chris@49
|
468 else
|
Chris@49
|
469 {
|
Chris@49
|
470 if(s_n_rows == 1)
|
Chris@49
|
471 {
|
Chris@49
|
472 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
473
|
Chris@49
|
474 const uword urow = aux_row1;
|
Chris@49
|
475 const uword start_col = aux_col1;
|
Chris@49
|
476
|
Chris@49
|
477 uword ii,jj;
|
Chris@49
|
478 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
479 {
|
Chris@49
|
480 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
481 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
|
Chris@49
|
482
|
Chris@49
|
483 A.at(urow, start_col+ii) -= tmp1;
|
Chris@49
|
484 A.at(urow, start_col+jj) -= tmp2;
|
Chris@49
|
485 }
|
Chris@49
|
486
|
Chris@49
|
487 if(ii < s_n_cols)
|
Chris@49
|
488 {
|
Chris@49
|
489 A.at(urow, start_col+ii) -= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
490 }
|
Chris@49
|
491 }
|
Chris@49
|
492 else
|
Chris@49
|
493 {
|
Chris@49
|
494 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
495 {
|
Chris@49
|
496 eT* s_col_data = s.colptr(ucol);
|
Chris@49
|
497
|
Chris@49
|
498 uword ii,jj;
|
Chris@49
|
499 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
|
Chris@49
|
500 {
|
Chris@49
|
501 const eT val1 = P.at(ii,ucol);
|
Chris@49
|
502 const eT val2 = P.at(jj,ucol);
|
Chris@49
|
503
|
Chris@49
|
504 s_col_data[ii] -= val1;
|
Chris@49
|
505 s_col_data[jj] -= val2;
|
Chris@49
|
506 }
|
Chris@49
|
507
|
Chris@49
|
508 if(ii < s_n_rows)
|
Chris@49
|
509 {
|
Chris@49
|
510 s_col_data[ii] -= P.at(ii,ucol);
|
Chris@49
|
511 }
|
Chris@49
|
512 }
|
Chris@49
|
513 }
|
Chris@49
|
514 }
|
Chris@49
|
515 }
|
Chris@49
|
516
|
Chris@49
|
517
|
Chris@49
|
518
|
Chris@49
|
519 template<typename eT>
|
Chris@49
|
520 template<typename T1>
|
Chris@49
|
521 inline
|
Chris@49
|
522 void
|
Chris@49
|
523 subview<eT>::operator%= (const Base<eT,T1>& in)
|
Chris@49
|
524 {
|
Chris@49
|
525 arma_extra_debug_sigprint();
|
Chris@49
|
526
|
Chris@49
|
527 const Proxy<T1> P(in.get_ref());
|
Chris@49
|
528
|
Chris@49
|
529 subview<eT>& s = *this;
|
Chris@49
|
530
|
Chris@49
|
531 const uword s_n_rows = s.n_rows;
|
Chris@49
|
532 const uword s_n_cols = s.n_cols;
|
Chris@49
|
533
|
Chris@49
|
534 arma_debug_assert_same_size(s, P, "element-wise multiplication");
|
Chris@49
|
535
|
Chris@49
|
536 const bool is_alias = P.is_alias(s.m);
|
Chris@49
|
537
|
Chris@49
|
538 arma_extra_debug_warn(is_alias, "aliasing detected");
|
Chris@49
|
539
|
Chris@49
|
540 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
|
Chris@49
|
541 {
|
Chris@49
|
542 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
|
Chris@49
|
543 const Mat<eT>& x = tmp.M;
|
Chris@49
|
544
|
Chris@49
|
545 if(s_n_rows == 1)
|
Chris@49
|
546 {
|
Chris@49
|
547 const eT* x_mem = x.memptr();
|
Chris@49
|
548
|
Chris@49
|
549 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
550
|
Chris@49
|
551 const uword urow = aux_row1;
|
Chris@49
|
552 const uword start_col = aux_col1;
|
Chris@49
|
553
|
Chris@49
|
554 uword ii,jj;
|
Chris@49
|
555 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
556 {
|
Chris@49
|
557 A.at(urow, start_col+ii) *= x_mem[ii];
|
Chris@49
|
558 A.at(urow, start_col+jj) *= x_mem[jj];
|
Chris@49
|
559 }
|
Chris@49
|
560
|
Chris@49
|
561 if(ii < s_n_cols)
|
Chris@49
|
562 {
|
Chris@49
|
563 A.at(urow, start_col+ii) *= x_mem[ii];
|
Chris@49
|
564 }
|
Chris@49
|
565 }
|
Chris@49
|
566 else
|
Chris@49
|
567 {
|
Chris@49
|
568 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
569 {
|
Chris@49
|
570 arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
571 }
|
Chris@49
|
572 }
|
Chris@49
|
573 }
|
Chris@49
|
574 else
|
Chris@49
|
575 {
|
Chris@49
|
576 if(s_n_rows == 1)
|
Chris@49
|
577 {
|
Chris@49
|
578 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
579
|
Chris@49
|
580 const uword urow = aux_row1;
|
Chris@49
|
581 const uword start_col = aux_col1;
|
Chris@49
|
582
|
Chris@49
|
583 uword ii,jj;
|
Chris@49
|
584 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
585 {
|
Chris@49
|
586 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
587 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
|
Chris@49
|
588
|
Chris@49
|
589 A.at(urow, start_col+ii) *= tmp1;
|
Chris@49
|
590 A.at(urow, start_col+jj) *= tmp2;
|
Chris@49
|
591 }
|
Chris@49
|
592
|
Chris@49
|
593 if(ii < s_n_cols)
|
Chris@49
|
594 {
|
Chris@49
|
595 A.at(urow, start_col+ii) *= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
596 }
|
Chris@49
|
597 }
|
Chris@49
|
598 else
|
Chris@49
|
599 {
|
Chris@49
|
600 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
601 {
|
Chris@49
|
602 eT* s_col_data = s.colptr(ucol);
|
Chris@49
|
603
|
Chris@49
|
604 uword ii,jj;
|
Chris@49
|
605 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
|
Chris@49
|
606 {
|
Chris@49
|
607 const eT val1 = P.at(ii,ucol);
|
Chris@49
|
608 const eT val2 = P.at(jj,ucol);
|
Chris@49
|
609
|
Chris@49
|
610 s_col_data[ii] *= val1;
|
Chris@49
|
611 s_col_data[jj] *= val2;
|
Chris@49
|
612 }
|
Chris@49
|
613
|
Chris@49
|
614 if(ii < s_n_rows)
|
Chris@49
|
615 {
|
Chris@49
|
616 s_col_data[ii] *= P.at(ii,ucol);
|
Chris@49
|
617 }
|
Chris@49
|
618 }
|
Chris@49
|
619 }
|
Chris@49
|
620 }
|
Chris@49
|
621 }
|
Chris@49
|
622
|
Chris@49
|
623
|
Chris@49
|
624
|
Chris@49
|
625 template<typename eT>
|
Chris@49
|
626 template<typename T1>
|
Chris@49
|
627 inline
|
Chris@49
|
628 void
|
Chris@49
|
629 subview<eT>::operator/= (const Base<eT,T1>& in)
|
Chris@49
|
630 {
|
Chris@49
|
631 arma_extra_debug_sigprint();
|
Chris@49
|
632
|
Chris@49
|
633 const Proxy<T1> P(in.get_ref());
|
Chris@49
|
634
|
Chris@49
|
635 subview<eT>& s = *this;
|
Chris@49
|
636
|
Chris@49
|
637 const uword s_n_rows = s.n_rows;
|
Chris@49
|
638 const uword s_n_cols = s.n_cols;
|
Chris@49
|
639
|
Chris@49
|
640 arma_debug_assert_same_size(s, P, "element-wise division");
|
Chris@49
|
641
|
Chris@49
|
642 const bool is_alias = P.is_alias(s.m);
|
Chris@49
|
643
|
Chris@49
|
644 arma_extra_debug_warn(is_alias, "aliasing detected");
|
Chris@49
|
645
|
Chris@49
|
646 if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) || (is_alias == true) )
|
Chris@49
|
647 {
|
Chris@49
|
648 const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);
|
Chris@49
|
649 const Mat<eT>& x = tmp.M;
|
Chris@49
|
650
|
Chris@49
|
651 if(s_n_rows == 1)
|
Chris@49
|
652 {
|
Chris@49
|
653 const eT* x_mem = x.memptr();
|
Chris@49
|
654
|
Chris@49
|
655 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
656
|
Chris@49
|
657 const uword urow = aux_row1;
|
Chris@49
|
658 const uword start_col = aux_col1;
|
Chris@49
|
659
|
Chris@49
|
660 uword ii,jj;
|
Chris@49
|
661 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
662 {
|
Chris@49
|
663 A.at(urow, start_col+ii) /= x_mem[ii];
|
Chris@49
|
664 A.at(urow, start_col+jj) /= x_mem[jj];
|
Chris@49
|
665 }
|
Chris@49
|
666
|
Chris@49
|
667 if(ii < s_n_cols)
|
Chris@49
|
668 {
|
Chris@49
|
669 A.at(urow, start_col+ii) /= x_mem[ii];
|
Chris@49
|
670 }
|
Chris@49
|
671 }
|
Chris@49
|
672 else
|
Chris@49
|
673 {
|
Chris@49
|
674 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
675 {
|
Chris@49
|
676 arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
677 }
|
Chris@49
|
678 }
|
Chris@49
|
679 }
|
Chris@49
|
680 else
|
Chris@49
|
681 {
|
Chris@49
|
682 if(s_n_rows == 1)
|
Chris@49
|
683 {
|
Chris@49
|
684 Mat<eT>& A = const_cast< Mat<eT>& >(m);
|
Chris@49
|
685
|
Chris@49
|
686 const uword urow = aux_row1;
|
Chris@49
|
687 const uword start_col = aux_col1;
|
Chris@49
|
688
|
Chris@49
|
689 uword ii,jj;
|
Chris@49
|
690 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
691 {
|
Chris@49
|
692 const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
693 const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];
|
Chris@49
|
694
|
Chris@49
|
695 A.at(urow, start_col+ii) /= tmp1;
|
Chris@49
|
696 A.at(urow, start_col+jj) /= tmp2;
|
Chris@49
|
697 }
|
Chris@49
|
698
|
Chris@49
|
699 if(ii < s_n_cols)
|
Chris@49
|
700 {
|
Chris@49
|
701 A.at(urow, start_col+ii) /= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];
|
Chris@49
|
702 }
|
Chris@49
|
703 }
|
Chris@49
|
704 else
|
Chris@49
|
705 {
|
Chris@49
|
706 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
707 {
|
Chris@49
|
708 eT* s_col_data = s.colptr(ucol);
|
Chris@49
|
709
|
Chris@49
|
710 uword ii,jj;
|
Chris@49
|
711 for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)
|
Chris@49
|
712 {
|
Chris@49
|
713 const eT val1 = P.at(ii,ucol);
|
Chris@49
|
714 const eT val2 = P.at(jj,ucol);
|
Chris@49
|
715
|
Chris@49
|
716 s_col_data[ii] /= val1;
|
Chris@49
|
717 s_col_data[jj] /= val2;
|
Chris@49
|
718 }
|
Chris@49
|
719
|
Chris@49
|
720 if(ii < s_n_rows)
|
Chris@49
|
721 {
|
Chris@49
|
722 s_col_data[ii] /= P.at(ii,ucol);
|
Chris@49
|
723 }
|
Chris@49
|
724 }
|
Chris@49
|
725 }
|
Chris@49
|
726 }
|
Chris@49
|
727 }
|
Chris@49
|
728
|
Chris@49
|
729
|
Chris@49
|
730
|
Chris@49
|
731 //! x.submat(...) = y.submat(...)
|
Chris@49
|
732 template<typename eT>
|
Chris@49
|
733 inline
|
Chris@49
|
734 void
|
Chris@49
|
735 subview<eT>::operator= (const subview<eT>& x_in)
|
Chris@49
|
736 {
|
Chris@49
|
737 arma_extra_debug_sigprint();
|
Chris@49
|
738
|
Chris@49
|
739 const bool overlap = check_overlap(x_in);
|
Chris@49
|
740
|
Chris@49
|
741 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
|
Chris@49
|
742 const subview<eT>* tmp_subview = overlap ? new subview<eT>(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
|
Chris@49
|
743 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
|
Chris@49
|
744
|
Chris@49
|
745 subview<eT>& s = *this;
|
Chris@49
|
746
|
Chris@49
|
747 arma_debug_assert_same_size(s, x, "copy into submatrix");
|
Chris@49
|
748
|
Chris@49
|
749 const uword s_n_cols = s.n_cols;
|
Chris@49
|
750 const uword s_n_rows = s.n_rows;
|
Chris@49
|
751
|
Chris@49
|
752 if(s_n_rows == 1)
|
Chris@49
|
753 {
|
Chris@49
|
754 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
|
Chris@49
|
755 const Mat<eT>& B = x.m;
|
Chris@49
|
756
|
Chris@49
|
757 const uword row_A = s.aux_row1;
|
Chris@49
|
758 const uword row_B = x.aux_row1;
|
Chris@49
|
759
|
Chris@49
|
760 const uword start_col_A = s.aux_col1;
|
Chris@49
|
761 const uword start_col_B = x.aux_col1;
|
Chris@49
|
762
|
Chris@49
|
763 uword ii,jj;
|
Chris@49
|
764 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
765 {
|
Chris@49
|
766 const eT tmp1 = B.at(row_B, start_col_B + ii);
|
Chris@49
|
767 const eT tmp2 = B.at(row_B, start_col_B + jj);
|
Chris@49
|
768
|
Chris@49
|
769 A.at(row_A, start_col_A + ii) = tmp1;
|
Chris@49
|
770 A.at(row_A, start_col_A + jj) = tmp2;
|
Chris@49
|
771 }
|
Chris@49
|
772
|
Chris@49
|
773 if(ii < s_n_cols)
|
Chris@49
|
774 {
|
Chris@49
|
775 A.at(row_A, start_col_A + ii) = B.at(row_B, start_col_B + ii);
|
Chris@49
|
776 }
|
Chris@49
|
777 }
|
Chris@49
|
778 else
|
Chris@49
|
779 {
|
Chris@49
|
780 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
781 {
|
Chris@49
|
782 arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
783 }
|
Chris@49
|
784 }
|
Chris@49
|
785
|
Chris@49
|
786 if(overlap)
|
Chris@49
|
787 {
|
Chris@49
|
788 delete tmp_subview;
|
Chris@49
|
789 delete tmp_mat;
|
Chris@49
|
790 }
|
Chris@49
|
791 }
|
Chris@49
|
792
|
Chris@49
|
793
|
Chris@49
|
794
|
Chris@49
|
795 template<typename eT>
|
Chris@49
|
796 inline
|
Chris@49
|
797 void
|
Chris@49
|
798 subview<eT>::operator+= (const subview<eT>& x_in)
|
Chris@49
|
799 {
|
Chris@49
|
800 arma_extra_debug_sigprint();
|
Chris@49
|
801
|
Chris@49
|
802 const bool overlap = check_overlap(x_in);
|
Chris@49
|
803
|
Chris@49
|
804 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
|
Chris@49
|
805 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
|
Chris@49
|
806 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
|
Chris@49
|
807
|
Chris@49
|
808 subview<eT>& s = *this;
|
Chris@49
|
809
|
Chris@49
|
810 arma_debug_assert_same_size(s, x, "addition");
|
Chris@49
|
811
|
Chris@49
|
812 const uword s_n_rows = s.n_rows;
|
Chris@49
|
813 const uword s_n_cols = s.n_cols;
|
Chris@49
|
814
|
Chris@49
|
815 if(s_n_rows == 1)
|
Chris@49
|
816 {
|
Chris@49
|
817 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
|
Chris@49
|
818 const Mat<eT>& B = x.m;
|
Chris@49
|
819
|
Chris@49
|
820 const uword row_A = s.aux_row1;
|
Chris@49
|
821 const uword row_B = x.aux_row1;
|
Chris@49
|
822
|
Chris@49
|
823 const uword start_col_A = s.aux_col1;
|
Chris@49
|
824 const uword start_col_B = x.aux_col1;
|
Chris@49
|
825
|
Chris@49
|
826 uword ii,jj;
|
Chris@49
|
827
|
Chris@49
|
828 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
829 {
|
Chris@49
|
830 const eT tmp1 = B.at(row_B, start_col_B + ii);
|
Chris@49
|
831 const eT tmp2 = B.at(row_B, start_col_B + jj);
|
Chris@49
|
832
|
Chris@49
|
833 A.at(row_A, start_col_A + ii) += tmp1;
|
Chris@49
|
834 A.at(row_A, start_col_A + jj) += tmp2;
|
Chris@49
|
835 }
|
Chris@49
|
836
|
Chris@49
|
837 if(ii < s_n_cols)
|
Chris@49
|
838 {
|
Chris@49
|
839 A.at(row_A, start_col_A + ii) += B.at(row_B, start_col_B + ii);
|
Chris@49
|
840 }
|
Chris@49
|
841 }
|
Chris@49
|
842 else
|
Chris@49
|
843 {
|
Chris@49
|
844 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
845 {
|
Chris@49
|
846 arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
847 }
|
Chris@49
|
848 }
|
Chris@49
|
849
|
Chris@49
|
850 if(overlap)
|
Chris@49
|
851 {
|
Chris@49
|
852 delete tmp_subview;
|
Chris@49
|
853 delete tmp_mat;
|
Chris@49
|
854 }
|
Chris@49
|
855 }
|
Chris@49
|
856
|
Chris@49
|
857
|
Chris@49
|
858
|
Chris@49
|
859 template<typename eT>
|
Chris@49
|
860 inline
|
Chris@49
|
861 void
|
Chris@49
|
862 subview<eT>::operator-= (const subview<eT>& x_in)
|
Chris@49
|
863 {
|
Chris@49
|
864 arma_extra_debug_sigprint();
|
Chris@49
|
865
|
Chris@49
|
866 const bool overlap = check_overlap(x_in);
|
Chris@49
|
867
|
Chris@49
|
868 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
|
Chris@49
|
869 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
|
Chris@49
|
870 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
|
Chris@49
|
871
|
Chris@49
|
872 subview<eT>& s = *this;
|
Chris@49
|
873
|
Chris@49
|
874 arma_debug_assert_same_size(s, x, "subtraction");
|
Chris@49
|
875
|
Chris@49
|
876 const uword s_n_rows = s.n_rows;
|
Chris@49
|
877 const uword s_n_cols = s.n_cols;
|
Chris@49
|
878
|
Chris@49
|
879 if(s_n_rows == 1)
|
Chris@49
|
880 {
|
Chris@49
|
881 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
|
Chris@49
|
882 const Mat<eT>& B = x.m;
|
Chris@49
|
883
|
Chris@49
|
884 const uword row_A = s.aux_row1;
|
Chris@49
|
885 const uword row_B = x.aux_row1;
|
Chris@49
|
886
|
Chris@49
|
887 const uword start_col_A = s.aux_col1;
|
Chris@49
|
888 const uword start_col_B = x.aux_col1;
|
Chris@49
|
889
|
Chris@49
|
890 uword ii,jj;
|
Chris@49
|
891 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
892 {
|
Chris@49
|
893 const eT tmp1 = B.at(row_B, start_col_B + ii);
|
Chris@49
|
894 const eT tmp2 = B.at(row_B, start_col_B + jj);
|
Chris@49
|
895
|
Chris@49
|
896 A.at(row_A, start_col_A + ii) -= tmp1;
|
Chris@49
|
897 A.at(row_A, start_col_A + jj) -= tmp2;
|
Chris@49
|
898 }
|
Chris@49
|
899
|
Chris@49
|
900 if(ii < s_n_cols)
|
Chris@49
|
901 {
|
Chris@49
|
902 A.at(row_A, start_col_A + ii) -= B.at(row_B, start_col_B + ii);
|
Chris@49
|
903 }
|
Chris@49
|
904 }
|
Chris@49
|
905 else
|
Chris@49
|
906 {
|
Chris@49
|
907 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
908 {
|
Chris@49
|
909 arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
910 }
|
Chris@49
|
911 }
|
Chris@49
|
912
|
Chris@49
|
913 if(overlap)
|
Chris@49
|
914 {
|
Chris@49
|
915 delete tmp_subview;
|
Chris@49
|
916 delete tmp_mat;
|
Chris@49
|
917 }
|
Chris@49
|
918
|
Chris@49
|
919 }
|
Chris@49
|
920
|
Chris@49
|
921
|
Chris@49
|
922
|
Chris@49
|
923 template<typename eT>
|
Chris@49
|
924 inline
|
Chris@49
|
925 void
|
Chris@49
|
926 subview<eT>::operator%= (const subview& x_in)
|
Chris@49
|
927 {
|
Chris@49
|
928 arma_extra_debug_sigprint();
|
Chris@49
|
929
|
Chris@49
|
930 const bool overlap = check_overlap(x_in);
|
Chris@49
|
931
|
Chris@49
|
932 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
|
Chris@49
|
933 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
|
Chris@49
|
934 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
|
Chris@49
|
935
|
Chris@49
|
936 subview<eT>& s = *this;
|
Chris@49
|
937
|
Chris@49
|
938 arma_debug_assert_same_size(s, x, "element-wise multiplication");
|
Chris@49
|
939
|
Chris@49
|
940 const uword s_n_rows = s.n_rows;
|
Chris@49
|
941 const uword s_n_cols = s.n_cols;
|
Chris@49
|
942
|
Chris@49
|
943 if(s_n_rows == 1)
|
Chris@49
|
944 {
|
Chris@49
|
945 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
|
Chris@49
|
946 const Mat<eT>& B = x.m;
|
Chris@49
|
947
|
Chris@49
|
948 const uword row_A = s.aux_row1;
|
Chris@49
|
949 const uword row_B = x.aux_row1;
|
Chris@49
|
950
|
Chris@49
|
951 const uword start_col_A = s.aux_col1;
|
Chris@49
|
952 const uword start_col_B = x.aux_col1;
|
Chris@49
|
953
|
Chris@49
|
954 uword ii,jj;
|
Chris@49
|
955 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
956 {
|
Chris@49
|
957 const eT tmp1 = B.at(row_B, start_col_B + ii);
|
Chris@49
|
958 const eT tmp2 = B.at(row_B, start_col_B + jj);
|
Chris@49
|
959
|
Chris@49
|
960 A.at(row_A, start_col_A + ii) *= tmp1;
|
Chris@49
|
961 A.at(row_A, start_col_A + jj) *= tmp2;
|
Chris@49
|
962 }
|
Chris@49
|
963
|
Chris@49
|
964 if(ii < s_n_cols)
|
Chris@49
|
965 {
|
Chris@49
|
966 A.at(row_A, start_col_A + ii) *= B.at(row_B, start_col_B + ii);
|
Chris@49
|
967 }
|
Chris@49
|
968 }
|
Chris@49
|
969 else
|
Chris@49
|
970 {
|
Chris@49
|
971 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
972 {
|
Chris@49
|
973 arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
974 }
|
Chris@49
|
975 }
|
Chris@49
|
976
|
Chris@49
|
977 if(overlap)
|
Chris@49
|
978 {
|
Chris@49
|
979 delete tmp_subview;
|
Chris@49
|
980 delete tmp_mat;
|
Chris@49
|
981 }
|
Chris@49
|
982
|
Chris@49
|
983 }
|
Chris@49
|
984
|
Chris@49
|
985
|
Chris@49
|
986
|
Chris@49
|
987 template<typename eT>
|
Chris@49
|
988 inline
|
Chris@49
|
989 void
|
Chris@49
|
990 subview<eT>::operator/= (const subview& x_in)
|
Chris@49
|
991 {
|
Chris@49
|
992 arma_extra_debug_sigprint();
|
Chris@49
|
993
|
Chris@49
|
994 const bool overlap = check_overlap(x_in);
|
Chris@49
|
995
|
Chris@49
|
996 Mat<eT>* tmp_mat = overlap ? new Mat<eT>(x_in.m) : 0;
|
Chris@49
|
997 const subview<eT>* tmp_subview = overlap ? new subview(*tmp_mat, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
|
Chris@49
|
998 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
|
Chris@49
|
999
|
Chris@49
|
1000 subview<eT>& s = *this;
|
Chris@49
|
1001
|
Chris@49
|
1002 arma_debug_assert_same_size(s, x, "element-wise division");
|
Chris@49
|
1003
|
Chris@49
|
1004 const uword s_n_rows = s.n_rows;
|
Chris@49
|
1005 const uword s_n_cols = s.n_cols;
|
Chris@49
|
1006
|
Chris@49
|
1007 if(s_n_rows == 1)
|
Chris@49
|
1008 {
|
Chris@49
|
1009 Mat<eT>& A = const_cast< Mat<eT>& >(s.m);
|
Chris@49
|
1010 const Mat<eT>& B = x.m;
|
Chris@49
|
1011
|
Chris@49
|
1012 const uword row_A = s.aux_row1;
|
Chris@49
|
1013 const uword row_B = x.aux_row1;
|
Chris@49
|
1014
|
Chris@49
|
1015 const uword start_col_A = s.aux_col1;
|
Chris@49
|
1016 const uword start_col_B = x.aux_col1;
|
Chris@49
|
1017
|
Chris@49
|
1018 uword ii,jj;
|
Chris@49
|
1019 for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)
|
Chris@49
|
1020 {
|
Chris@49
|
1021 const eT tmp1 = B.at(row_B, start_col_B + ii);
|
Chris@49
|
1022 const eT tmp2 = B.at(row_B, start_col_B + jj);
|
Chris@49
|
1023
|
Chris@49
|
1024 A.at(row_A, start_col_A + ii) /= tmp1;
|
Chris@49
|
1025 A.at(row_A, start_col_A + jj) /= tmp2;
|
Chris@49
|
1026 }
|
Chris@49
|
1027
|
Chris@49
|
1028 if(ii < s_n_cols)
|
Chris@49
|
1029 {
|
Chris@49
|
1030 A.at(row_A, start_col_A + ii) /= B.at(row_B, start_col_B + ii);
|
Chris@49
|
1031 }
|
Chris@49
|
1032 }
|
Chris@49
|
1033 else
|
Chris@49
|
1034 {
|
Chris@49
|
1035 for(uword ucol=0; ucol < s_n_cols; ++ucol)
|
Chris@49
|
1036 {
|
Chris@49
|
1037 arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows );
|
Chris@49
|
1038 }
|
Chris@49
|
1039 }
|
Chris@49
|
1040
|
Chris@49
|
1041 if(overlap)
|
Chris@49
|
1042 {
|
Chris@49
|
1043 delete tmp_subview;
|
Chris@49
|
1044 delete tmp_mat;
|
Chris@49
|
1045 }
|
Chris@49
|
1046
|
Chris@49
|
1047 }
|
Chris@49
|
1048
|
Chris@49
|
1049
|
Chris@49
|
1050
|
Chris@49
|
1051 //! transform each element in the subview using a functor
|
Chris@49
|
1052 template<typename eT>
|
Chris@49
|
1053 template<typename functor>
|
Chris@49
|
1054 inline
|
Chris@49
|
1055 void
|
Chris@49
|
1056 subview<eT>::transform(functor F)
|
Chris@49
|
1057 {
|
Chris@49
|
1058 arma_extra_debug_sigprint();
|
Chris@49
|
1059
|
Chris@49
|
1060 const uword local_n_cols = n_cols;
|
Chris@49
|
1061 const uword local_n_rows = n_rows;
|
Chris@49
|
1062
|
Chris@49
|
1063 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
1064
|
Chris@49
|
1065 if(local_n_rows == 1)
|
Chris@49
|
1066 {
|
Chris@49
|
1067 const uword urow = aux_row1;
|
Chris@49
|
1068 const uword start_col = aux_col1;
|
Chris@49
|
1069 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
1070
|
Chris@49
|
1071 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
|
Chris@49
|
1072 {
|
Chris@49
|
1073 X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) );
|
Chris@49
|
1074 }
|
Chris@49
|
1075 }
|
Chris@49
|
1076 else
|
Chris@49
|
1077 {
|
Chris@49
|
1078 const uword start_col = aux_col1;
|
Chris@49
|
1079 const uword start_row = aux_row1;
|
Chris@49
|
1080
|
Chris@49
|
1081 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
1082 const uword end_row_plus1 = start_row + local_n_rows;
|
Chris@49
|
1083
|
Chris@49
|
1084 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
|
Chris@49
|
1085 for(uword urow = start_row; urow < end_row_plus1; ++urow)
|
Chris@49
|
1086 {
|
Chris@49
|
1087 X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) );
|
Chris@49
|
1088 }
|
Chris@49
|
1089 }
|
Chris@49
|
1090 }
|
Chris@49
|
1091
|
Chris@49
|
1092
|
Chris@49
|
1093
|
Chris@49
|
1094 //! imbue (fill) the subview with values provided by a functor
|
Chris@49
|
1095 template<typename eT>
|
Chris@49
|
1096 template<typename functor>
|
Chris@49
|
1097 inline
|
Chris@49
|
1098 void
|
Chris@49
|
1099 subview<eT>::imbue(functor F)
|
Chris@49
|
1100 {
|
Chris@49
|
1101 arma_extra_debug_sigprint();
|
Chris@49
|
1102
|
Chris@49
|
1103 const uword local_n_cols = n_cols;
|
Chris@49
|
1104 const uword local_n_rows = n_rows;
|
Chris@49
|
1105
|
Chris@49
|
1106 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
1107
|
Chris@49
|
1108 if(local_n_rows == 1)
|
Chris@49
|
1109 {
|
Chris@49
|
1110 const uword urow = aux_row1;
|
Chris@49
|
1111 const uword start_col = aux_col1;
|
Chris@49
|
1112 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
1113
|
Chris@49
|
1114 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
|
Chris@49
|
1115 {
|
Chris@49
|
1116 X.at(urow, ucol) = eT( F() );
|
Chris@49
|
1117 }
|
Chris@49
|
1118 }
|
Chris@49
|
1119 else
|
Chris@49
|
1120 {
|
Chris@49
|
1121 const uword start_col = aux_col1;
|
Chris@49
|
1122 const uword start_row = aux_row1;
|
Chris@49
|
1123
|
Chris@49
|
1124 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
1125 const uword end_row_plus1 = start_row + local_n_rows;
|
Chris@49
|
1126
|
Chris@49
|
1127 for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)
|
Chris@49
|
1128 for(uword urow = start_row; urow < end_row_plus1; ++urow)
|
Chris@49
|
1129 {
|
Chris@49
|
1130 X.at(urow, ucol) = eT( F() );
|
Chris@49
|
1131 }
|
Chris@49
|
1132 }
|
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 void
|
Chris@49
|
1140 subview<eT>::fill(const eT val)
|
Chris@49
|
1141 {
|
Chris@49
|
1142 arma_extra_debug_sigprint();
|
Chris@49
|
1143
|
Chris@49
|
1144 const uword local_n_cols = n_cols;
|
Chris@49
|
1145 const uword local_n_rows = n_rows;
|
Chris@49
|
1146
|
Chris@49
|
1147 if(local_n_rows == 1)
|
Chris@49
|
1148 {
|
Chris@49
|
1149 Mat<eT>& X = const_cast< Mat<eT>& >(m);
|
Chris@49
|
1150
|
Chris@49
|
1151 const uword urow = aux_row1;
|
Chris@49
|
1152 const uword start_col = aux_col1;
|
Chris@49
|
1153 const uword end_col_plus1 = start_col + local_n_cols;
|
Chris@49
|
1154
|
Chris@49
|
1155 uword ii,jj;
|
Chris@49
|
1156 for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)
|
Chris@49
|
1157 {
|
Chris@49
|
1158 X.at(urow, ii) = val;
|
Chris@49
|
1159 X.at(urow, jj) = val;
|
Chris@49
|
1160 }
|
Chris@49
|
1161
|
Chris@49
|
1162 if(ii < end_col_plus1)
|
Chris@49
|
1163 {
|
Chris@49
|
1164 X.at(urow, ii) = val;
|
Chris@49
|
1165 }
|
Chris@49
|
1166 }
|
Chris@49
|
1167 else
|
Chris@49
|
1168 {
|
Chris@49
|
1169 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
1170 {
|
Chris@49
|
1171 arrayops::inplace_set( colptr(ucol), val, local_n_rows );
|
Chris@49
|
1172 }
|
Chris@49
|
1173 }
|
Chris@49
|
1174 }
|
Chris@49
|
1175
|
Chris@49
|
1176
|
Chris@49
|
1177
|
Chris@49
|
1178 template<typename eT>
|
Chris@49
|
1179 inline
|
Chris@49
|
1180 void
|
Chris@49
|
1181 subview<eT>::zeros()
|
Chris@49
|
1182 {
|
Chris@49
|
1183 arma_extra_debug_sigprint();
|
Chris@49
|
1184
|
Chris@49
|
1185 (*this).fill(eT(0));
|
Chris@49
|
1186 }
|
Chris@49
|
1187
|
Chris@49
|
1188
|
Chris@49
|
1189
|
Chris@49
|
1190 template<typename eT>
|
Chris@49
|
1191 inline
|
Chris@49
|
1192 void
|
Chris@49
|
1193 subview<eT>::ones()
|
Chris@49
|
1194 {
|
Chris@49
|
1195 arma_extra_debug_sigprint();
|
Chris@49
|
1196
|
Chris@49
|
1197 (*this).fill(eT(1));
|
Chris@49
|
1198 }
|
Chris@49
|
1199
|
Chris@49
|
1200
|
Chris@49
|
1201
|
Chris@49
|
1202 template<typename eT>
|
Chris@49
|
1203 inline
|
Chris@49
|
1204 void
|
Chris@49
|
1205 subview<eT>::eye()
|
Chris@49
|
1206 {
|
Chris@49
|
1207 arma_extra_debug_sigprint();
|
Chris@49
|
1208
|
Chris@49
|
1209 fill(eT(0));
|
Chris@49
|
1210
|
Chris@49
|
1211 const uword N = (std::min)(n_rows, n_cols);
|
Chris@49
|
1212
|
Chris@49
|
1213 for(uword ii=0; ii < N; ++ii)
|
Chris@49
|
1214 {
|
Chris@49
|
1215 at(ii,ii) = eT(1);
|
Chris@49
|
1216 }
|
Chris@49
|
1217 }
|
Chris@49
|
1218
|
Chris@49
|
1219
|
Chris@49
|
1220
|
Chris@49
|
1221 template<typename eT>
|
Chris@49
|
1222 inline
|
Chris@49
|
1223 eT
|
Chris@49
|
1224 subview<eT>::at_alt(const uword ii) const
|
Chris@49
|
1225 {
|
Chris@49
|
1226 return operator[](ii);
|
Chris@49
|
1227 }
|
Chris@49
|
1228
|
Chris@49
|
1229
|
Chris@49
|
1230
|
Chris@49
|
1231 template<typename eT>
|
Chris@49
|
1232 inline
|
Chris@49
|
1233 eT&
|
Chris@49
|
1234 subview<eT>::operator[](const uword ii)
|
Chris@49
|
1235 {
|
Chris@49
|
1236 const uword in_col = ii / n_rows;
|
Chris@49
|
1237 const uword in_row = ii % n_rows;
|
Chris@49
|
1238
|
Chris@49
|
1239 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1240
|
Chris@49
|
1241 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
|
Chris@49
|
1242 }
|
Chris@49
|
1243
|
Chris@49
|
1244
|
Chris@49
|
1245
|
Chris@49
|
1246 template<typename eT>
|
Chris@49
|
1247 inline
|
Chris@49
|
1248 eT
|
Chris@49
|
1249 subview<eT>::operator[](const uword ii) const
|
Chris@49
|
1250 {
|
Chris@49
|
1251 const uword in_col = ii / n_rows;
|
Chris@49
|
1252 const uword in_row = ii % n_rows;
|
Chris@49
|
1253
|
Chris@49
|
1254 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1255
|
Chris@49
|
1256 return m.mem[index];
|
Chris@49
|
1257 }
|
Chris@49
|
1258
|
Chris@49
|
1259
|
Chris@49
|
1260
|
Chris@49
|
1261 template<typename eT>
|
Chris@49
|
1262 inline
|
Chris@49
|
1263 eT&
|
Chris@49
|
1264 subview<eT>::operator()(const uword ii)
|
Chris@49
|
1265 {
|
Chris@49
|
1266 arma_debug_check( (ii >= n_elem), "subview::operator(): index out of bounds");
|
Chris@49
|
1267
|
Chris@49
|
1268 const uword in_col = ii / n_rows;
|
Chris@49
|
1269 const uword in_row = ii % n_rows;
|
Chris@49
|
1270
|
Chris@49
|
1271 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1272
|
Chris@49
|
1273 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
|
Chris@49
|
1274 }
|
Chris@49
|
1275
|
Chris@49
|
1276
|
Chris@49
|
1277
|
Chris@49
|
1278 template<typename eT>
|
Chris@49
|
1279 inline
|
Chris@49
|
1280 eT
|
Chris@49
|
1281 subview<eT>::operator()(const uword ii) const
|
Chris@49
|
1282 {
|
Chris@49
|
1283 arma_debug_check( (ii >= n_elem), "subview::operator(): index out of bounds");
|
Chris@49
|
1284
|
Chris@49
|
1285 const uword in_col = ii / n_rows;
|
Chris@49
|
1286 const uword in_row = ii % n_rows;
|
Chris@49
|
1287
|
Chris@49
|
1288 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1289
|
Chris@49
|
1290 return m.mem[index];
|
Chris@49
|
1291 }
|
Chris@49
|
1292
|
Chris@49
|
1293
|
Chris@49
|
1294
|
Chris@49
|
1295 template<typename eT>
|
Chris@49
|
1296 inline
|
Chris@49
|
1297 eT&
|
Chris@49
|
1298 subview<eT>::operator()(const uword in_row, const uword in_col)
|
Chris@49
|
1299 {
|
Chris@49
|
1300 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview::operator(): index out of bounds");
|
Chris@49
|
1301
|
Chris@49
|
1302 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1303
|
Chris@49
|
1304 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
|
Chris@49
|
1305 }
|
Chris@49
|
1306
|
Chris@49
|
1307
|
Chris@49
|
1308
|
Chris@49
|
1309 template<typename eT>
|
Chris@49
|
1310 inline
|
Chris@49
|
1311 eT
|
Chris@49
|
1312 subview<eT>::operator()(const uword in_row, const uword in_col) const
|
Chris@49
|
1313 {
|
Chris@49
|
1314 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview::operator(): index out of bounds");
|
Chris@49
|
1315
|
Chris@49
|
1316 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1317
|
Chris@49
|
1318 return m.mem[index];
|
Chris@49
|
1319 }
|
Chris@49
|
1320
|
Chris@49
|
1321
|
Chris@49
|
1322
|
Chris@49
|
1323 template<typename eT>
|
Chris@49
|
1324 inline
|
Chris@49
|
1325 eT&
|
Chris@49
|
1326 subview<eT>::at(const uword in_row, const uword in_col)
|
Chris@49
|
1327 {
|
Chris@49
|
1328 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1329
|
Chris@49
|
1330 return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );
|
Chris@49
|
1331 }
|
Chris@49
|
1332
|
Chris@49
|
1333
|
Chris@49
|
1334
|
Chris@49
|
1335 template<typename eT>
|
Chris@49
|
1336 inline
|
Chris@49
|
1337 eT
|
Chris@49
|
1338 subview<eT>::at(const uword in_row, const uword in_col) const
|
Chris@49
|
1339 {
|
Chris@49
|
1340 const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;
|
Chris@49
|
1341
|
Chris@49
|
1342 return m.mem[index];
|
Chris@49
|
1343 }
|
Chris@49
|
1344
|
Chris@49
|
1345
|
Chris@49
|
1346
|
Chris@49
|
1347 template<typename eT>
|
Chris@49
|
1348 arma_inline
|
Chris@49
|
1349 eT*
|
Chris@49
|
1350 subview<eT>::colptr(const uword in_col)
|
Chris@49
|
1351 {
|
Chris@49
|
1352 return & access::rw((const_cast< Mat<eT>& >(m)).mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]);
|
Chris@49
|
1353 }
|
Chris@49
|
1354
|
Chris@49
|
1355
|
Chris@49
|
1356
|
Chris@49
|
1357 template<typename eT>
|
Chris@49
|
1358 arma_inline
|
Chris@49
|
1359 const eT*
|
Chris@49
|
1360 subview<eT>::colptr(const uword in_col) const
|
Chris@49
|
1361 {
|
Chris@49
|
1362 return & m.mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ];
|
Chris@49
|
1363 }
|
Chris@49
|
1364
|
Chris@49
|
1365
|
Chris@49
|
1366
|
Chris@49
|
1367 template<typename eT>
|
Chris@49
|
1368 inline
|
Chris@49
|
1369 bool
|
Chris@49
|
1370 subview<eT>::check_overlap(const subview<eT>& x) const
|
Chris@49
|
1371 {
|
Chris@49
|
1372 const subview<eT>& s = *this;
|
Chris@49
|
1373
|
Chris@49
|
1374 if(&s.m != &x.m)
|
Chris@49
|
1375 {
|
Chris@49
|
1376 return false;
|
Chris@49
|
1377 }
|
Chris@49
|
1378 else
|
Chris@49
|
1379 {
|
Chris@49
|
1380 if( (s.n_elem == 0) || (x.n_elem == 0) )
|
Chris@49
|
1381 {
|
Chris@49
|
1382 return false;
|
Chris@49
|
1383 }
|
Chris@49
|
1384 else
|
Chris@49
|
1385 {
|
Chris@49
|
1386 const uword s_row_start = s.aux_row1;
|
Chris@49
|
1387 const uword s_row_end_p1 = s_row_start + s.n_rows;
|
Chris@49
|
1388
|
Chris@49
|
1389 const uword s_col_start = s.aux_col1;
|
Chris@49
|
1390 const uword s_col_end_p1 = s_col_start + s.n_cols;
|
Chris@49
|
1391
|
Chris@49
|
1392
|
Chris@49
|
1393 const uword x_row_start = x.aux_row1;
|
Chris@49
|
1394 const uword x_row_end_p1 = x_row_start + x.n_rows;
|
Chris@49
|
1395
|
Chris@49
|
1396 const uword x_col_start = x.aux_col1;
|
Chris@49
|
1397 const uword x_col_end_p1 = x_col_start + x.n_cols;
|
Chris@49
|
1398
|
Chris@49
|
1399
|
Chris@49
|
1400 const bool outside_rows = ( (x_row_start >= s_row_end_p1) || (s_row_start >= x_row_end_p1) );
|
Chris@49
|
1401 const bool outside_cols = ( (x_col_start >= s_col_end_p1) || (s_col_start >= x_col_end_p1) );
|
Chris@49
|
1402
|
Chris@49
|
1403 return ( (outside_rows == false) && (outside_cols == false) );
|
Chris@49
|
1404 }
|
Chris@49
|
1405 }
|
Chris@49
|
1406 }
|
Chris@49
|
1407
|
Chris@49
|
1408
|
Chris@49
|
1409
|
Chris@49
|
1410 template<typename eT>
|
Chris@49
|
1411 inline
|
Chris@49
|
1412 bool
|
Chris@49
|
1413 subview<eT>::is_vec() const
|
Chris@49
|
1414 {
|
Chris@49
|
1415 return ( (n_rows == 1) || (n_cols == 1) );
|
Chris@49
|
1416 }
|
Chris@49
|
1417
|
Chris@49
|
1418
|
Chris@49
|
1419
|
Chris@49
|
1420 //! X = Y.submat(...)
|
Chris@49
|
1421 template<typename eT>
|
Chris@49
|
1422 inline
|
Chris@49
|
1423 void
|
Chris@49
|
1424 subview<eT>::extract(Mat<eT>& out, const subview<eT>& in)
|
Chris@49
|
1425 {
|
Chris@49
|
1426 arma_extra_debug_sigprint();
|
Chris@49
|
1427
|
Chris@49
|
1428 // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;
|
Chris@49
|
1429 // size setting and alias checking is done by either the Mat contructor or operator=()
|
Chris@49
|
1430
|
Chris@49
|
1431 const uword n_rows = in.n_rows; // number of rows in the subview
|
Chris@49
|
1432 const uword n_cols = in.n_cols; // number of columns in the subview
|
Chris@49
|
1433
|
Chris@49
|
1434 arma_extra_debug_print(arma_boost::format("out.n_rows = %d out.n_cols = %d in.m.n_rows = %d in.m.n_cols = %d") % out.n_rows % out.n_cols % in.m.n_rows % in.m.n_cols );
|
Chris@49
|
1435
|
Chris@49
|
1436
|
Chris@49
|
1437 if(in.is_vec() == true)
|
Chris@49
|
1438 {
|
Chris@49
|
1439 if(n_cols == 1) // a column vector
|
Chris@49
|
1440 {
|
Chris@49
|
1441 arma_extra_debug_print("subview::extract(): copying col (going across rows)");
|
Chris@49
|
1442
|
Chris@49
|
1443 // in.colptr(0) the first column of the subview, taking into account any row offset
|
Chris@49
|
1444 arrayops::copy( out.memptr(), in.colptr(0), n_rows );
|
Chris@49
|
1445 }
|
Chris@49
|
1446 else // a row vector (possibly empty)
|
Chris@49
|
1447 {
|
Chris@49
|
1448 arma_extra_debug_print("subview::extract(): copying row (going across columns)");
|
Chris@49
|
1449
|
Chris@49
|
1450 const Mat<eT>& X = in.m;
|
Chris@49
|
1451
|
Chris@49
|
1452 eT* out_mem = out.memptr();
|
Chris@49
|
1453
|
Chris@49
|
1454 const uword row = in.aux_row1;
|
Chris@49
|
1455 const uword start_col = in.aux_col1;
|
Chris@49
|
1456
|
Chris@49
|
1457 uword i,j;
|
Chris@49
|
1458
|
Chris@49
|
1459 for(i=0, j=1; j < n_cols; i+=2, j+=2)
|
Chris@49
|
1460 {
|
Chris@49
|
1461 const eT tmp1 = X.at(row, start_col+i);
|
Chris@49
|
1462 const eT tmp2 = X.at(row, start_col+j);
|
Chris@49
|
1463
|
Chris@49
|
1464 out_mem[i] = tmp1;
|
Chris@49
|
1465 out_mem[j] = tmp2;
|
Chris@49
|
1466 }
|
Chris@49
|
1467
|
Chris@49
|
1468 if(i < n_cols)
|
Chris@49
|
1469 {
|
Chris@49
|
1470 out_mem[i] = X.at(row, start_col+i);
|
Chris@49
|
1471 }
|
Chris@49
|
1472 }
|
Chris@49
|
1473 }
|
Chris@49
|
1474 else // general submatrix
|
Chris@49
|
1475 {
|
Chris@49
|
1476 arma_extra_debug_print("subview::extract(): general submatrix");
|
Chris@49
|
1477
|
Chris@49
|
1478 for(uword col=0; col < n_cols; ++col)
|
Chris@49
|
1479 {
|
Chris@49
|
1480 arrayops::copy( out.colptr(col), in.colptr(col), n_rows );
|
Chris@49
|
1481 }
|
Chris@49
|
1482 }
|
Chris@49
|
1483 }
|
Chris@49
|
1484
|
Chris@49
|
1485
|
Chris@49
|
1486
|
Chris@49
|
1487 //! X += Y.submat(...)
|
Chris@49
|
1488 template<typename eT>
|
Chris@49
|
1489 inline
|
Chris@49
|
1490 void
|
Chris@49
|
1491 subview<eT>::plus_inplace(Mat<eT>& out, const subview<eT>& in)
|
Chris@49
|
1492 {
|
Chris@49
|
1493 arma_extra_debug_sigprint();
|
Chris@49
|
1494
|
Chris@49
|
1495 arma_debug_assert_same_size(out, in, "addition");
|
Chris@49
|
1496
|
Chris@49
|
1497 const uword n_rows = in.n_rows;
|
Chris@49
|
1498 const uword n_cols = in.n_cols;
|
Chris@49
|
1499
|
Chris@49
|
1500 if(n_rows == 1)
|
Chris@49
|
1501 {
|
Chris@49
|
1502 eT* out_mem = out.memptr();
|
Chris@49
|
1503
|
Chris@49
|
1504 const Mat<eT>& X = in.m;
|
Chris@49
|
1505
|
Chris@49
|
1506 const uword row = in.aux_row1;
|
Chris@49
|
1507 const uword start_col = in.aux_col1;
|
Chris@49
|
1508
|
Chris@49
|
1509 uword i,j;
|
Chris@49
|
1510 for(i=0, j=1; j < n_cols; i+=2, j+=2)
|
Chris@49
|
1511 {
|
Chris@49
|
1512 const eT tmp1 = X.at(row, start_col+i);
|
Chris@49
|
1513 const eT tmp2 = X.at(row, start_col+j);
|
Chris@49
|
1514
|
Chris@49
|
1515 out_mem[i] += tmp1;
|
Chris@49
|
1516 out_mem[j] += tmp2;
|
Chris@49
|
1517 }
|
Chris@49
|
1518
|
Chris@49
|
1519 if(i < n_cols)
|
Chris@49
|
1520 {
|
Chris@49
|
1521 out_mem[i] += X.at(row, start_col+i);
|
Chris@49
|
1522 }
|
Chris@49
|
1523 }
|
Chris@49
|
1524 else
|
Chris@49
|
1525 {
|
Chris@49
|
1526 for(uword col=0; col < n_cols; ++col)
|
Chris@49
|
1527 {
|
Chris@49
|
1528 arrayops::inplace_plus(out.colptr(col), in.colptr(col), n_rows);
|
Chris@49
|
1529 }
|
Chris@49
|
1530 }
|
Chris@49
|
1531 }
|
Chris@49
|
1532
|
Chris@49
|
1533
|
Chris@49
|
1534
|
Chris@49
|
1535 //! X -= Y.submat(...)
|
Chris@49
|
1536 template<typename eT>
|
Chris@49
|
1537 inline
|
Chris@49
|
1538 void
|
Chris@49
|
1539 subview<eT>::minus_inplace(Mat<eT>& out, const subview<eT>& in)
|
Chris@49
|
1540 {
|
Chris@49
|
1541 arma_extra_debug_sigprint();
|
Chris@49
|
1542
|
Chris@49
|
1543 arma_debug_assert_same_size(out, in, "subtraction");
|
Chris@49
|
1544
|
Chris@49
|
1545 const uword n_rows = in.n_rows;
|
Chris@49
|
1546 const uword n_cols = in.n_cols;
|
Chris@49
|
1547
|
Chris@49
|
1548 if(n_rows == 1)
|
Chris@49
|
1549 {
|
Chris@49
|
1550 eT* out_mem = out.memptr();
|
Chris@49
|
1551
|
Chris@49
|
1552 const Mat<eT>& X = in.m;
|
Chris@49
|
1553
|
Chris@49
|
1554 const uword row = in.aux_row1;
|
Chris@49
|
1555 const uword start_col = in.aux_col1;
|
Chris@49
|
1556
|
Chris@49
|
1557 uword i,j;
|
Chris@49
|
1558 for(i=0, j=1; j < n_cols; i+=2, j+=2)
|
Chris@49
|
1559 {
|
Chris@49
|
1560 const eT tmp1 = X.at(row, start_col+i);
|
Chris@49
|
1561 const eT tmp2 = X.at(row, start_col+j);
|
Chris@49
|
1562
|
Chris@49
|
1563 out_mem[i] -= tmp1;
|
Chris@49
|
1564 out_mem[j] -= tmp2;
|
Chris@49
|
1565 }
|
Chris@49
|
1566
|
Chris@49
|
1567 if(i < n_cols)
|
Chris@49
|
1568 {
|
Chris@49
|
1569 out_mem[i] -= X.at(row, start_col+i);
|
Chris@49
|
1570 }
|
Chris@49
|
1571 }
|
Chris@49
|
1572 else
|
Chris@49
|
1573 {
|
Chris@49
|
1574 for(uword col=0; col < n_cols; ++col)
|
Chris@49
|
1575 {
|
Chris@49
|
1576 arrayops::inplace_minus(out.colptr(col), in.colptr(col), n_rows);
|
Chris@49
|
1577 }
|
Chris@49
|
1578 }
|
Chris@49
|
1579 }
|
Chris@49
|
1580
|
Chris@49
|
1581
|
Chris@49
|
1582
|
Chris@49
|
1583 //! X %= Y.submat(...)
|
Chris@49
|
1584 template<typename eT>
|
Chris@49
|
1585 inline
|
Chris@49
|
1586 void
|
Chris@49
|
1587 subview<eT>::schur_inplace(Mat<eT>& out, const subview<eT>& in)
|
Chris@49
|
1588 {
|
Chris@49
|
1589 arma_extra_debug_sigprint();
|
Chris@49
|
1590
|
Chris@49
|
1591 arma_debug_assert_same_size(out, in, "element-wise multiplication");
|
Chris@49
|
1592
|
Chris@49
|
1593 const uword n_rows = in.n_rows;
|
Chris@49
|
1594 const uword n_cols = in.n_cols;
|
Chris@49
|
1595
|
Chris@49
|
1596 if(n_rows == 1)
|
Chris@49
|
1597 {
|
Chris@49
|
1598 eT* out_mem = out.memptr();
|
Chris@49
|
1599
|
Chris@49
|
1600 const Mat<eT>& X = in.m;
|
Chris@49
|
1601
|
Chris@49
|
1602 const uword row = in.aux_row1;
|
Chris@49
|
1603 const uword start_col = in.aux_col1;
|
Chris@49
|
1604
|
Chris@49
|
1605 uword i,j;
|
Chris@49
|
1606 for(i=0, j=1; j < n_cols; i+=2, j+=2)
|
Chris@49
|
1607 {
|
Chris@49
|
1608 const eT tmp1 = X.at(row, start_col+i);
|
Chris@49
|
1609 const eT tmp2 = X.at(row, start_col+j);
|
Chris@49
|
1610
|
Chris@49
|
1611 out_mem[i] *= tmp1;
|
Chris@49
|
1612 out_mem[j] *= tmp2;
|
Chris@49
|
1613 }
|
Chris@49
|
1614
|
Chris@49
|
1615 if(i < n_cols)
|
Chris@49
|
1616 {
|
Chris@49
|
1617 out_mem[i] *= X.at(row, start_col+i);
|
Chris@49
|
1618 }
|
Chris@49
|
1619 }
|
Chris@49
|
1620 else
|
Chris@49
|
1621 {
|
Chris@49
|
1622 for(uword col=0; col < n_cols; ++col)
|
Chris@49
|
1623 {
|
Chris@49
|
1624 arrayops::inplace_mul(out.colptr(col), in.colptr(col), n_rows);
|
Chris@49
|
1625 }
|
Chris@49
|
1626 }
|
Chris@49
|
1627 }
|
Chris@49
|
1628
|
Chris@49
|
1629
|
Chris@49
|
1630
|
Chris@49
|
1631 //! X /= Y.submat(...)
|
Chris@49
|
1632 template<typename eT>
|
Chris@49
|
1633 inline
|
Chris@49
|
1634 void
|
Chris@49
|
1635 subview<eT>::div_inplace(Mat<eT>& out, const subview<eT>& in)
|
Chris@49
|
1636 {
|
Chris@49
|
1637 arma_extra_debug_sigprint();
|
Chris@49
|
1638
|
Chris@49
|
1639 arma_debug_assert_same_size(out, in, "element-wise division");
|
Chris@49
|
1640
|
Chris@49
|
1641 const uword n_rows = in.n_rows;
|
Chris@49
|
1642 const uword n_cols = in.n_cols;
|
Chris@49
|
1643
|
Chris@49
|
1644 if(n_rows == 1)
|
Chris@49
|
1645 {
|
Chris@49
|
1646 eT* out_mem = out.memptr();
|
Chris@49
|
1647
|
Chris@49
|
1648 const Mat<eT>& X = in.m;
|
Chris@49
|
1649
|
Chris@49
|
1650 const uword row = in.aux_row1;
|
Chris@49
|
1651 const uword start_col = in.aux_col1;
|
Chris@49
|
1652
|
Chris@49
|
1653 uword i,j;
|
Chris@49
|
1654 for(i=0, j=1; j < n_cols; i+=2, j+=2)
|
Chris@49
|
1655 {
|
Chris@49
|
1656 const eT tmp1 = X.at(row, start_col+i);
|
Chris@49
|
1657 const eT tmp2 = X.at(row, start_col+j);
|
Chris@49
|
1658
|
Chris@49
|
1659 out_mem[i] /= tmp1;
|
Chris@49
|
1660 out_mem[j] /= tmp2;
|
Chris@49
|
1661 }
|
Chris@49
|
1662
|
Chris@49
|
1663 if(i < n_cols)
|
Chris@49
|
1664 {
|
Chris@49
|
1665 out_mem[i] /= X.at(row, start_col+i);
|
Chris@49
|
1666 }
|
Chris@49
|
1667 }
|
Chris@49
|
1668 else
|
Chris@49
|
1669 {
|
Chris@49
|
1670 for(uword col=0; col < n_cols; ++col)
|
Chris@49
|
1671 {
|
Chris@49
|
1672 arrayops::inplace_div(out.colptr(col), in.colptr(col), n_rows);
|
Chris@49
|
1673 }
|
Chris@49
|
1674 }
|
Chris@49
|
1675 }
|
Chris@49
|
1676
|
Chris@49
|
1677
|
Chris@49
|
1678
|
Chris@49
|
1679 //! creation of subview (row vector)
|
Chris@49
|
1680 template<typename eT>
|
Chris@49
|
1681 inline
|
Chris@49
|
1682 subview_row<eT>
|
Chris@49
|
1683 subview<eT>::row(const uword row_num)
|
Chris@49
|
1684 {
|
Chris@49
|
1685 arma_extra_debug_sigprint();
|
Chris@49
|
1686
|
Chris@49
|
1687 arma_debug_check( row_num >= n_rows, "subview::row(): out of bounds" );
|
Chris@49
|
1688
|
Chris@49
|
1689 const uword base_row = aux_row1 + row_num;
|
Chris@49
|
1690
|
Chris@49
|
1691 return subview_row<eT>(m, base_row, aux_col1, n_cols);
|
Chris@49
|
1692 }
|
Chris@49
|
1693
|
Chris@49
|
1694
|
Chris@49
|
1695
|
Chris@49
|
1696 //! creation of subview (row vector)
|
Chris@49
|
1697 template<typename eT>
|
Chris@49
|
1698 inline
|
Chris@49
|
1699 const subview_row<eT>
|
Chris@49
|
1700 subview<eT>::row(const uword row_num) const
|
Chris@49
|
1701 {
|
Chris@49
|
1702 arma_extra_debug_sigprint();
|
Chris@49
|
1703
|
Chris@49
|
1704 arma_debug_check( row_num >= n_rows, "subview::row(): out of bounds" );
|
Chris@49
|
1705
|
Chris@49
|
1706 const uword base_row = aux_row1 + row_num;
|
Chris@49
|
1707
|
Chris@49
|
1708 return subview_row<eT>(m, base_row, aux_col1, n_cols);
|
Chris@49
|
1709 }
|
Chris@49
|
1710
|
Chris@49
|
1711
|
Chris@49
|
1712
|
Chris@49
|
1713 template<typename eT>
|
Chris@49
|
1714 inline
|
Chris@49
|
1715 subview_row<eT>
|
Chris@49
|
1716 subview<eT>::operator()(const uword row_num, const span& col_span)
|
Chris@49
|
1717 {
|
Chris@49
|
1718 arma_extra_debug_sigprint();
|
Chris@49
|
1719
|
Chris@49
|
1720 const bool col_all = col_span.whole;
|
Chris@49
|
1721
|
Chris@49
|
1722 const uword local_n_cols = n_cols;
|
Chris@49
|
1723
|
Chris@49
|
1724 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
1725 const uword in_col2 = col_span.b;
|
Chris@49
|
1726 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
1727
|
Chris@49
|
1728 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
1729 const uword base_row = aux_row1 + row_num;
|
Chris@49
|
1730
|
Chris@49
|
1731 arma_debug_check
|
Chris@49
|
1732 (
|
Chris@49
|
1733 (row_num >= n_rows)
|
Chris@49
|
1734 ||
|
Chris@49
|
1735 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
1736 ,
|
Chris@49
|
1737 "subview::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
1738 );
|
Chris@49
|
1739
|
Chris@49
|
1740 return subview_row<eT>(m, base_row, base_col1, submat_n_cols);
|
Chris@49
|
1741 }
|
Chris@49
|
1742
|
Chris@49
|
1743
|
Chris@49
|
1744
|
Chris@49
|
1745 template<typename eT>
|
Chris@49
|
1746 inline
|
Chris@49
|
1747 const subview_row<eT>
|
Chris@49
|
1748 subview<eT>::operator()(const uword row_num, const span& col_span) const
|
Chris@49
|
1749 {
|
Chris@49
|
1750 arma_extra_debug_sigprint();
|
Chris@49
|
1751
|
Chris@49
|
1752 const bool col_all = col_span.whole;
|
Chris@49
|
1753
|
Chris@49
|
1754 const uword local_n_cols = n_cols;
|
Chris@49
|
1755
|
Chris@49
|
1756 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
1757 const uword in_col2 = col_span.b;
|
Chris@49
|
1758 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
1759
|
Chris@49
|
1760 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
1761 const uword base_row = aux_row1 + row_num;
|
Chris@49
|
1762
|
Chris@49
|
1763 arma_debug_check
|
Chris@49
|
1764 (
|
Chris@49
|
1765 (row_num >= n_rows)
|
Chris@49
|
1766 ||
|
Chris@49
|
1767 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
1768 ,
|
Chris@49
|
1769 "subview::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
1770 );
|
Chris@49
|
1771
|
Chris@49
|
1772 return subview_row<eT>(m, base_row, base_col1, submat_n_cols);
|
Chris@49
|
1773 }
|
Chris@49
|
1774
|
Chris@49
|
1775
|
Chris@49
|
1776
|
Chris@49
|
1777 //! creation of subview (column vector)
|
Chris@49
|
1778 template<typename eT>
|
Chris@49
|
1779 inline
|
Chris@49
|
1780 subview_col<eT>
|
Chris@49
|
1781 subview<eT>::col(const uword col_num)
|
Chris@49
|
1782 {
|
Chris@49
|
1783 arma_extra_debug_sigprint();
|
Chris@49
|
1784
|
Chris@49
|
1785 arma_debug_check( col_num >= n_cols, "subview::col(): out of bounds");
|
Chris@49
|
1786
|
Chris@49
|
1787 const uword base_col = aux_col1 + col_num;
|
Chris@49
|
1788
|
Chris@49
|
1789 return subview_col<eT>(m, base_col, aux_row1, n_rows);
|
Chris@49
|
1790 }
|
Chris@49
|
1791
|
Chris@49
|
1792
|
Chris@49
|
1793
|
Chris@49
|
1794 //! creation of subview (column vector)
|
Chris@49
|
1795 template<typename eT>
|
Chris@49
|
1796 inline
|
Chris@49
|
1797 const subview_col<eT>
|
Chris@49
|
1798 subview<eT>::col(const uword col_num) const
|
Chris@49
|
1799 {
|
Chris@49
|
1800 arma_extra_debug_sigprint();
|
Chris@49
|
1801
|
Chris@49
|
1802 arma_debug_check( col_num >= n_cols, "subview::col(): out of bounds");
|
Chris@49
|
1803
|
Chris@49
|
1804 const uword base_col = aux_col1 + col_num;
|
Chris@49
|
1805
|
Chris@49
|
1806 return subview_col<eT>(m, base_col, aux_row1, n_rows);
|
Chris@49
|
1807 }
|
Chris@49
|
1808
|
Chris@49
|
1809
|
Chris@49
|
1810
|
Chris@49
|
1811 template<typename eT>
|
Chris@49
|
1812 inline
|
Chris@49
|
1813 subview_col<eT>
|
Chris@49
|
1814 subview<eT>::operator()(const span& row_span, const uword col_num)
|
Chris@49
|
1815 {
|
Chris@49
|
1816 arma_extra_debug_sigprint();
|
Chris@49
|
1817
|
Chris@49
|
1818 const bool row_all = row_span.whole;
|
Chris@49
|
1819
|
Chris@49
|
1820 const uword local_n_rows = n_rows;
|
Chris@49
|
1821
|
Chris@49
|
1822 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
1823 const uword in_row2 = row_span.b;
|
Chris@49
|
1824 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
1825
|
Chris@49
|
1826 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
1827 const uword base_col = aux_col1 + col_num;
|
Chris@49
|
1828
|
Chris@49
|
1829 arma_debug_check
|
Chris@49
|
1830 (
|
Chris@49
|
1831 (col_num >= n_cols)
|
Chris@49
|
1832 ||
|
Chris@49
|
1833 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
1834 ,
|
Chris@49
|
1835 "subview::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
1836 );
|
Chris@49
|
1837
|
Chris@49
|
1838 return subview_col<eT>(m, base_col, base_row1, submat_n_rows);
|
Chris@49
|
1839 }
|
Chris@49
|
1840
|
Chris@49
|
1841
|
Chris@49
|
1842
|
Chris@49
|
1843 template<typename eT>
|
Chris@49
|
1844 inline
|
Chris@49
|
1845 const subview_col<eT>
|
Chris@49
|
1846 subview<eT>::operator()(const span& row_span, const uword col_num) const
|
Chris@49
|
1847 {
|
Chris@49
|
1848 arma_extra_debug_sigprint();
|
Chris@49
|
1849
|
Chris@49
|
1850 const bool row_all = row_span.whole;
|
Chris@49
|
1851
|
Chris@49
|
1852 const uword local_n_rows = n_rows;
|
Chris@49
|
1853
|
Chris@49
|
1854 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
1855 const uword in_row2 = row_span.b;
|
Chris@49
|
1856 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
1857
|
Chris@49
|
1858 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
1859 const uword base_col = aux_col1 + col_num;
|
Chris@49
|
1860
|
Chris@49
|
1861 arma_debug_check
|
Chris@49
|
1862 (
|
Chris@49
|
1863 (col_num >= n_cols)
|
Chris@49
|
1864 ||
|
Chris@49
|
1865 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
1866 ,
|
Chris@49
|
1867 "subview::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
1868 );
|
Chris@49
|
1869
|
Chris@49
|
1870 return subview_col<eT>(m, base_col, base_row1, submat_n_rows);
|
Chris@49
|
1871 }
|
Chris@49
|
1872
|
Chris@49
|
1873
|
Chris@49
|
1874
|
Chris@49
|
1875 //! create a Col object which uses memory from an existing matrix object.
|
Chris@49
|
1876 //! this approach is currently not alias safe
|
Chris@49
|
1877 //! and does not take into account that the parent matrix object could be deleted.
|
Chris@49
|
1878 //! if deleted memory is accessed by the created Col object,
|
Chris@49
|
1879 //! it will cause memory corruption and/or a crash
|
Chris@49
|
1880 template<typename eT>
|
Chris@49
|
1881 inline
|
Chris@49
|
1882 Col<eT>
|
Chris@49
|
1883 subview<eT>::unsafe_col(const uword col_num)
|
Chris@49
|
1884 {
|
Chris@49
|
1885 arma_extra_debug_sigprint();
|
Chris@49
|
1886
|
Chris@49
|
1887 arma_debug_check( col_num >= n_cols, "subview::unsafe_col(): out of bounds");
|
Chris@49
|
1888
|
Chris@49
|
1889 return Col<eT>(colptr(col_num), n_rows, false, true);
|
Chris@49
|
1890 }
|
Chris@49
|
1891
|
Chris@49
|
1892
|
Chris@49
|
1893
|
Chris@49
|
1894 //! create a Col object which uses memory from an existing matrix object.
|
Chris@49
|
1895 //! this approach is currently not alias safe
|
Chris@49
|
1896 //! and does not take into account that the parent matrix object could be deleted.
|
Chris@49
|
1897 //! if deleted memory is accessed by the created Col object,
|
Chris@49
|
1898 //! it will cause memory corruption and/or a crash
|
Chris@49
|
1899 template<typename eT>
|
Chris@49
|
1900 inline
|
Chris@49
|
1901 const Col<eT>
|
Chris@49
|
1902 subview<eT>::unsafe_col(const uword col_num) const
|
Chris@49
|
1903 {
|
Chris@49
|
1904 arma_extra_debug_sigprint();
|
Chris@49
|
1905
|
Chris@49
|
1906 arma_debug_check( col_num >= n_cols, "subview::unsafe_col(): out of bounds");
|
Chris@49
|
1907
|
Chris@49
|
1908 return Col<eT>(const_cast<eT*>(colptr(col_num)), n_rows, false, true);
|
Chris@49
|
1909 }
|
Chris@49
|
1910
|
Chris@49
|
1911
|
Chris@49
|
1912
|
Chris@49
|
1913 //! creation of subview (submatrix comprised of specified row vectors)
|
Chris@49
|
1914 template<typename eT>
|
Chris@49
|
1915 inline
|
Chris@49
|
1916 subview<eT>
|
Chris@49
|
1917 subview<eT>::rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
1918 {
|
Chris@49
|
1919 arma_extra_debug_sigprint();
|
Chris@49
|
1920
|
Chris@49
|
1921 arma_debug_check
|
Chris@49
|
1922 (
|
Chris@49
|
1923 (in_row1 > in_row2) || (in_row2 >= n_rows),
|
Chris@49
|
1924 "subview::rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
1925 );
|
Chris@49
|
1926
|
Chris@49
|
1927 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
1928 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
1929
|
Chris@49
|
1930 return subview<eT>(m, base_row1, aux_col1, subview_n_rows, n_cols );
|
Chris@49
|
1931 }
|
Chris@49
|
1932
|
Chris@49
|
1933
|
Chris@49
|
1934
|
Chris@49
|
1935 //! creation of subview (submatrix comprised of specified row vectors)
|
Chris@49
|
1936 template<typename eT>
|
Chris@49
|
1937 inline
|
Chris@49
|
1938 const subview<eT>
|
Chris@49
|
1939 subview<eT>::rows(const uword in_row1, const uword in_row2) const
|
Chris@49
|
1940 {
|
Chris@49
|
1941 arma_extra_debug_sigprint();
|
Chris@49
|
1942
|
Chris@49
|
1943 arma_debug_check
|
Chris@49
|
1944 (
|
Chris@49
|
1945 (in_row1 > in_row2) || (in_row2 >= n_rows),
|
Chris@49
|
1946 "subview::rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
1947 );
|
Chris@49
|
1948
|
Chris@49
|
1949 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
1950 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
1951
|
Chris@49
|
1952 return subview<eT>(m, base_row1, aux_col1, subview_n_rows, n_cols );
|
Chris@49
|
1953 }
|
Chris@49
|
1954
|
Chris@49
|
1955
|
Chris@49
|
1956
|
Chris@49
|
1957 //! creation of subview (submatrix comprised of specified column vectors)
|
Chris@49
|
1958 template<typename eT>
|
Chris@49
|
1959 inline
|
Chris@49
|
1960 subview<eT>
|
Chris@49
|
1961 subview<eT>::cols(const uword in_col1, const uword in_col2)
|
Chris@49
|
1962 {
|
Chris@49
|
1963 arma_extra_debug_sigprint();
|
Chris@49
|
1964
|
Chris@49
|
1965 arma_debug_check
|
Chris@49
|
1966 (
|
Chris@49
|
1967 (in_col1 > in_col2) || (in_col2 >= n_cols),
|
Chris@49
|
1968 "subview::cols(): indices out of bounds or incorrectly used"
|
Chris@49
|
1969 );
|
Chris@49
|
1970
|
Chris@49
|
1971 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
1972 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
1973
|
Chris@49
|
1974 return subview<eT>(m, aux_row1, base_col1, n_rows, subview_n_cols);
|
Chris@49
|
1975 }
|
Chris@49
|
1976
|
Chris@49
|
1977
|
Chris@49
|
1978
|
Chris@49
|
1979 //! creation of subview (submatrix comprised of specified column vectors)
|
Chris@49
|
1980 template<typename eT>
|
Chris@49
|
1981 inline
|
Chris@49
|
1982 const subview<eT>
|
Chris@49
|
1983 subview<eT>::cols(const uword in_col1, const uword in_col2) const
|
Chris@49
|
1984 {
|
Chris@49
|
1985 arma_extra_debug_sigprint();
|
Chris@49
|
1986
|
Chris@49
|
1987 arma_debug_check
|
Chris@49
|
1988 (
|
Chris@49
|
1989 (in_col1 > in_col2) || (in_col2 >= n_cols),
|
Chris@49
|
1990 "subview::cols(): indices out of bounds or incorrectly used"
|
Chris@49
|
1991 );
|
Chris@49
|
1992
|
Chris@49
|
1993 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
1994 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
1995
|
Chris@49
|
1996 return subview<eT>(m, aux_row1, base_col1, n_rows, subview_n_cols);
|
Chris@49
|
1997 }
|
Chris@49
|
1998
|
Chris@49
|
1999
|
Chris@49
|
2000
|
Chris@49
|
2001 //! creation of subview (submatrix)
|
Chris@49
|
2002 template<typename eT>
|
Chris@49
|
2003 inline
|
Chris@49
|
2004 subview<eT>
|
Chris@49
|
2005 subview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)
|
Chris@49
|
2006 {
|
Chris@49
|
2007 arma_extra_debug_sigprint();
|
Chris@49
|
2008
|
Chris@49
|
2009 arma_debug_check
|
Chris@49
|
2010 (
|
Chris@49
|
2011 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
|
Chris@49
|
2012 "subview::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2013 );
|
Chris@49
|
2014
|
Chris@49
|
2015 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2016 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2017
|
Chris@49
|
2018 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
2019 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
2020
|
Chris@49
|
2021 return subview<eT>(m, base_row1, base_col1, subview_n_rows, subview_n_cols);
|
Chris@49
|
2022 }
|
Chris@49
|
2023
|
Chris@49
|
2024
|
Chris@49
|
2025
|
Chris@49
|
2026 //! creation of subview (generic submatrix)
|
Chris@49
|
2027 template<typename eT>
|
Chris@49
|
2028 inline
|
Chris@49
|
2029 const subview<eT>
|
Chris@49
|
2030 subview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const
|
Chris@49
|
2031 {
|
Chris@49
|
2032 arma_extra_debug_sigprint();
|
Chris@49
|
2033
|
Chris@49
|
2034 arma_debug_check
|
Chris@49
|
2035 (
|
Chris@49
|
2036 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
|
Chris@49
|
2037 "subview::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2038 );
|
Chris@49
|
2039
|
Chris@49
|
2040 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2041 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2042
|
Chris@49
|
2043 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
2044 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
2045
|
Chris@49
|
2046 return subview<eT>(m, base_row1, base_col1, subview_n_rows, subview_n_cols);
|
Chris@49
|
2047 }
|
Chris@49
|
2048
|
Chris@49
|
2049
|
Chris@49
|
2050
|
Chris@49
|
2051 //! creation of subview (submatrix)
|
Chris@49
|
2052 template<typename eT>
|
Chris@49
|
2053 inline
|
Chris@49
|
2054 subview<eT>
|
Chris@49
|
2055 subview<eT>::submat(const span& row_span, const span& col_span)
|
Chris@49
|
2056 {
|
Chris@49
|
2057 arma_extra_debug_sigprint();
|
Chris@49
|
2058
|
Chris@49
|
2059 const bool row_all = row_span.whole;
|
Chris@49
|
2060 const bool col_all = col_span.whole;
|
Chris@49
|
2061
|
Chris@49
|
2062 const uword local_n_rows = n_rows;
|
Chris@49
|
2063 const uword local_n_cols = n_cols;
|
Chris@49
|
2064
|
Chris@49
|
2065 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
2066 const uword in_row2 = row_span.b;
|
Chris@49
|
2067 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
2068
|
Chris@49
|
2069 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
2070 const uword in_col2 = col_span.b;
|
Chris@49
|
2071 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
2072
|
Chris@49
|
2073 arma_debug_check
|
Chris@49
|
2074 (
|
Chris@49
|
2075 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
2076 ||
|
Chris@49
|
2077 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
2078 ,
|
Chris@49
|
2079 "subview::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2080 );
|
Chris@49
|
2081
|
Chris@49
|
2082 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
2083 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
2084
|
Chris@49
|
2085 return subview<eT>(m, base_row1, base_col1, submat_n_rows, submat_n_cols);
|
Chris@49
|
2086 }
|
Chris@49
|
2087
|
Chris@49
|
2088
|
Chris@49
|
2089
|
Chris@49
|
2090 //! creation of subview (generic submatrix)
|
Chris@49
|
2091 template<typename eT>
|
Chris@49
|
2092 inline
|
Chris@49
|
2093 const subview<eT>
|
Chris@49
|
2094 subview<eT>::submat(const span& row_span, const span& col_span) const
|
Chris@49
|
2095 {
|
Chris@49
|
2096 arma_extra_debug_sigprint();
|
Chris@49
|
2097
|
Chris@49
|
2098 const bool row_all = row_span.whole;
|
Chris@49
|
2099 const bool col_all = col_span.whole;
|
Chris@49
|
2100
|
Chris@49
|
2101 const uword local_n_rows = n_rows;
|
Chris@49
|
2102 const uword local_n_cols = n_cols;
|
Chris@49
|
2103
|
Chris@49
|
2104 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
2105 const uword in_row2 = row_span.b;
|
Chris@49
|
2106 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
2107
|
Chris@49
|
2108 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
2109 const uword in_col2 = col_span.b;
|
Chris@49
|
2110 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
2111
|
Chris@49
|
2112 arma_debug_check
|
Chris@49
|
2113 (
|
Chris@49
|
2114 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
2115 ||
|
Chris@49
|
2116 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
2117 ,
|
Chris@49
|
2118 "subview::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2119 );
|
Chris@49
|
2120
|
Chris@49
|
2121 const uword base_row1 = aux_row1 + in_row1;
|
Chris@49
|
2122 const uword base_col1 = aux_col1 + in_col1;
|
Chris@49
|
2123
|
Chris@49
|
2124 return subview<eT>(m, base_row1, base_col1, submat_n_rows, submat_n_cols);
|
Chris@49
|
2125 }
|
Chris@49
|
2126
|
Chris@49
|
2127
|
Chris@49
|
2128
|
Chris@49
|
2129 template<typename eT>
|
Chris@49
|
2130 inline
|
Chris@49
|
2131 subview<eT>
|
Chris@49
|
2132 subview<eT>::operator()(const span& row_span, const span& col_span)
|
Chris@49
|
2133 {
|
Chris@49
|
2134 arma_extra_debug_sigprint();
|
Chris@49
|
2135
|
Chris@49
|
2136 return (*this).submat(row_span, col_span);
|
Chris@49
|
2137 }
|
Chris@49
|
2138
|
Chris@49
|
2139
|
Chris@49
|
2140
|
Chris@49
|
2141 template<typename eT>
|
Chris@49
|
2142 inline
|
Chris@49
|
2143 const subview<eT>
|
Chris@49
|
2144 subview<eT>::operator()(const span& row_span, const span& col_span) const
|
Chris@49
|
2145 {
|
Chris@49
|
2146 arma_extra_debug_sigprint();
|
Chris@49
|
2147
|
Chris@49
|
2148 return (*this).submat(row_span, col_span);
|
Chris@49
|
2149 }
|
Chris@49
|
2150
|
Chris@49
|
2151
|
Chris@49
|
2152
|
Chris@49
|
2153 template<typename eT>
|
Chris@49
|
2154 inline
|
Chris@49
|
2155 subview_each1< subview<eT>, 0 >
|
Chris@49
|
2156 subview<eT>::each_col()
|
Chris@49
|
2157 {
|
Chris@49
|
2158 arma_extra_debug_sigprint();
|
Chris@49
|
2159
|
Chris@49
|
2160 return subview_each1< subview<eT>, 0 >(*this);
|
Chris@49
|
2161 }
|
Chris@49
|
2162
|
Chris@49
|
2163
|
Chris@49
|
2164
|
Chris@49
|
2165 template<typename eT>
|
Chris@49
|
2166 inline
|
Chris@49
|
2167 subview_each1< subview<eT>, 1 >
|
Chris@49
|
2168 subview<eT>::each_row()
|
Chris@49
|
2169 {
|
Chris@49
|
2170 arma_extra_debug_sigprint();
|
Chris@49
|
2171
|
Chris@49
|
2172 return subview_each1< subview<eT>, 1 >(*this);
|
Chris@49
|
2173 }
|
Chris@49
|
2174
|
Chris@49
|
2175
|
Chris@49
|
2176
|
Chris@49
|
2177 template<typename eT>
|
Chris@49
|
2178 template<typename T1>
|
Chris@49
|
2179 inline
|
Chris@49
|
2180 subview_each2< subview<eT>, 0, T1 >
|
Chris@49
|
2181 subview<eT>::each_col(const Base<uword,T1>& indices)
|
Chris@49
|
2182 {
|
Chris@49
|
2183 arma_extra_debug_sigprint();
|
Chris@49
|
2184
|
Chris@49
|
2185 return subview_each2< subview<eT>, 0, T1 >(*this, indices);
|
Chris@49
|
2186 }
|
Chris@49
|
2187
|
Chris@49
|
2188
|
Chris@49
|
2189
|
Chris@49
|
2190 template<typename eT>
|
Chris@49
|
2191 template<typename T1>
|
Chris@49
|
2192 inline
|
Chris@49
|
2193 subview_each2< subview<eT>, 1, T1 >
|
Chris@49
|
2194 subview<eT>::each_row(const Base<uword,T1>& indices)
|
Chris@49
|
2195 {
|
Chris@49
|
2196 arma_extra_debug_sigprint();
|
Chris@49
|
2197
|
Chris@49
|
2198 return subview_each2< subview<eT>, 1, T1 >(*this, indices);
|
Chris@49
|
2199 }
|
Chris@49
|
2200
|
Chris@49
|
2201
|
Chris@49
|
2202
|
Chris@49
|
2203 //! creation of diagview (diagonal)
|
Chris@49
|
2204 template<typename eT>
|
Chris@49
|
2205 inline
|
Chris@49
|
2206 diagview<eT>
|
Chris@49
|
2207 subview<eT>::diag(const sword in_id)
|
Chris@49
|
2208 {
|
Chris@49
|
2209 arma_extra_debug_sigprint();
|
Chris@49
|
2210
|
Chris@49
|
2211 const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;
|
Chris@49
|
2212 const uword col_offset = (in_id > 0) ? uword( in_id) : 0;
|
Chris@49
|
2213
|
Chris@49
|
2214 arma_debug_check
|
Chris@49
|
2215 (
|
Chris@49
|
2216 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
|
Chris@49
|
2217 "subview::diag(): requested diagonal out of bounds"
|
Chris@49
|
2218 );
|
Chris@49
|
2219
|
Chris@49
|
2220 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
|
Chris@49
|
2221
|
Chris@49
|
2222 const uword base_row_offset = aux_row1 + row_offset;
|
Chris@49
|
2223 const uword base_col_offset = aux_col1 + col_offset;
|
Chris@49
|
2224
|
Chris@49
|
2225 return diagview<eT>(m, base_row_offset, base_col_offset, len);
|
Chris@49
|
2226 }
|
Chris@49
|
2227
|
Chris@49
|
2228
|
Chris@49
|
2229
|
Chris@49
|
2230 //! creation of diagview (diagonal)
|
Chris@49
|
2231 template<typename eT>
|
Chris@49
|
2232 inline
|
Chris@49
|
2233 const diagview<eT>
|
Chris@49
|
2234 subview<eT>::diag(const sword in_id) const
|
Chris@49
|
2235 {
|
Chris@49
|
2236 arma_extra_debug_sigprint();
|
Chris@49
|
2237
|
Chris@49
|
2238 const uword row_offset = (in_id < 0) ? -in_id : 0;
|
Chris@49
|
2239 const uword col_offset = (in_id > 0) ? in_id : 0;
|
Chris@49
|
2240
|
Chris@49
|
2241 arma_debug_check
|
Chris@49
|
2242 (
|
Chris@49
|
2243 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
|
Chris@49
|
2244 "subview::diag(): requested diagonal out of bounds"
|
Chris@49
|
2245 );
|
Chris@49
|
2246
|
Chris@49
|
2247 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
|
Chris@49
|
2248
|
Chris@49
|
2249 const uword base_row_offset = aux_row1 + row_offset;
|
Chris@49
|
2250 const uword base_col_offset = aux_col1 + col_offset;
|
Chris@49
|
2251
|
Chris@49
|
2252 return diagview<eT>(m, base_row_offset, base_col_offset, len);
|
Chris@49
|
2253 }
|
Chris@49
|
2254
|
Chris@49
|
2255
|
Chris@49
|
2256
|
Chris@49
|
2257 template<typename eT>
|
Chris@49
|
2258 inline
|
Chris@49
|
2259 void
|
Chris@49
|
2260 subview<eT>::swap_rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
2261 {
|
Chris@49
|
2262 arma_extra_debug_sigprint();
|
Chris@49
|
2263
|
Chris@49
|
2264 arma_debug_check
|
Chris@49
|
2265 (
|
Chris@49
|
2266 (in_row1 >= n_rows) || (in_row2 >= n_rows),
|
Chris@49
|
2267 "subview::swap_rows(): out of bounds"
|
Chris@49
|
2268 );
|
Chris@49
|
2269
|
Chris@49
|
2270 eT* mem = (const_cast< Mat<eT>& >(m)).memptr();
|
Chris@49
|
2271
|
Chris@49
|
2272 if(n_elem > 0)
|
Chris@49
|
2273 {
|
Chris@49
|
2274 const uword m_n_rows = m.n_rows;
|
Chris@49
|
2275
|
Chris@49
|
2276 for(uword ucol=0; ucol < n_cols; ++ucol)
|
Chris@49
|
2277 {
|
Chris@49
|
2278 const uword offset = (aux_col1 + ucol) * m_n_rows;
|
Chris@49
|
2279 const uword pos1 = aux_row1 + in_row1 + offset;
|
Chris@49
|
2280 const uword pos2 = aux_row1 + in_row2 + offset;
|
Chris@49
|
2281
|
Chris@49
|
2282 std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) );
|
Chris@49
|
2283 }
|
Chris@49
|
2284 }
|
Chris@49
|
2285 }
|
Chris@49
|
2286
|
Chris@49
|
2287
|
Chris@49
|
2288
|
Chris@49
|
2289 template<typename eT>
|
Chris@49
|
2290 inline
|
Chris@49
|
2291 void
|
Chris@49
|
2292 subview<eT>::swap_cols(const uword in_col1, const uword in_col2)
|
Chris@49
|
2293 {
|
Chris@49
|
2294 arma_extra_debug_sigprint();
|
Chris@49
|
2295
|
Chris@49
|
2296 arma_debug_check
|
Chris@49
|
2297 (
|
Chris@49
|
2298 (in_col1 >= n_cols) || (in_col2 >= n_cols),
|
Chris@49
|
2299 "subview::swap_cols(): out of bounds"
|
Chris@49
|
2300 );
|
Chris@49
|
2301
|
Chris@49
|
2302 if(n_elem > 0)
|
Chris@49
|
2303 {
|
Chris@49
|
2304 eT* ptr1 = colptr(in_col1);
|
Chris@49
|
2305 eT* ptr2 = colptr(in_col2);
|
Chris@49
|
2306
|
Chris@49
|
2307 for(uword urow=0; urow < n_rows; ++urow)
|
Chris@49
|
2308 {
|
Chris@49
|
2309 std::swap( ptr1[urow], ptr2[urow] );
|
Chris@49
|
2310 }
|
Chris@49
|
2311 }
|
Chris@49
|
2312 }
|
Chris@49
|
2313
|
Chris@49
|
2314
|
Chris@49
|
2315
|
Chris@49
|
2316 // template<typename eT>
|
Chris@49
|
2317 // inline
|
Chris@49
|
2318 // subview<eT>::iter::iter(const subview<eT>& S)
|
Chris@49
|
2319 // : mem (S.m.mem)
|
Chris@49
|
2320 // , n_rows (S.m.n_rows)
|
Chris@49
|
2321 // , row_start (S.aux_row1)
|
Chris@49
|
2322 // , row_end_p1(row_start + S.n_rows)
|
Chris@49
|
2323 // , row (row_start)
|
Chris@49
|
2324 // , col (S.aux_col1)
|
Chris@49
|
2325 // , i (row + col*n_rows)
|
Chris@49
|
2326 // {
|
Chris@49
|
2327 // arma_extra_debug_sigprint();
|
Chris@49
|
2328 // }
|
Chris@49
|
2329 //
|
Chris@49
|
2330 //
|
Chris@49
|
2331 //
|
Chris@49
|
2332 // template<typename eT>
|
Chris@49
|
2333 // arma_inline
|
Chris@49
|
2334 // eT
|
Chris@49
|
2335 // subview<eT>::iter::operator*() const
|
Chris@49
|
2336 // {
|
Chris@49
|
2337 // return mem[i];
|
Chris@49
|
2338 // }
|
Chris@49
|
2339 //
|
Chris@49
|
2340 //
|
Chris@49
|
2341 //
|
Chris@49
|
2342 // template<typename eT>
|
Chris@49
|
2343 // inline
|
Chris@49
|
2344 // void
|
Chris@49
|
2345 // subview<eT>::iter::operator++()
|
Chris@49
|
2346 // {
|
Chris@49
|
2347 // ++row;
|
Chris@49
|
2348 //
|
Chris@49
|
2349 // if(row < row_end_p1)
|
Chris@49
|
2350 // {
|
Chris@49
|
2351 // ++i;
|
Chris@49
|
2352 // }
|
Chris@49
|
2353 // else
|
Chris@49
|
2354 // {
|
Chris@49
|
2355 // row = row_start;
|
Chris@49
|
2356 // ++col;
|
Chris@49
|
2357 //
|
Chris@49
|
2358 // i = row + col*n_rows;
|
Chris@49
|
2359 // }
|
Chris@49
|
2360 // }
|
Chris@49
|
2361 //
|
Chris@49
|
2362 //
|
Chris@49
|
2363 //
|
Chris@49
|
2364 // template<typename eT>
|
Chris@49
|
2365 // inline
|
Chris@49
|
2366 // void
|
Chris@49
|
2367 // subview<eT>::iter::operator++(int)
|
Chris@49
|
2368 // {
|
Chris@49
|
2369 // operator++();
|
Chris@49
|
2370 // }
|
Chris@49
|
2371
|
Chris@49
|
2372
|
Chris@49
|
2373
|
Chris@49
|
2374 //
|
Chris@49
|
2375 //
|
Chris@49
|
2376 //
|
Chris@49
|
2377
|
Chris@49
|
2378
|
Chris@49
|
2379
|
Chris@49
|
2380 template<typename eT>
|
Chris@49
|
2381 inline
|
Chris@49
|
2382 subview_col<eT>::subview_col(const Mat<eT>& in_m, const uword in_col)
|
Chris@49
|
2383 : subview<eT>(in_m, 0, in_col, in_m.n_rows, 1)
|
Chris@49
|
2384 , colmem(subview<eT>::colptr(0))
|
Chris@49
|
2385 {
|
Chris@49
|
2386 arma_extra_debug_sigprint();
|
Chris@49
|
2387 }
|
Chris@49
|
2388
|
Chris@49
|
2389
|
Chris@49
|
2390
|
Chris@49
|
2391 template<typename eT>
|
Chris@49
|
2392 inline
|
Chris@49
|
2393 subview_col<eT>::subview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows)
|
Chris@49
|
2394 : subview<eT>(in_m, in_row1, in_col, in_n_rows, 1)
|
Chris@49
|
2395 , colmem(subview<eT>::colptr(0))
|
Chris@49
|
2396 {
|
Chris@49
|
2397 arma_extra_debug_sigprint();
|
Chris@49
|
2398 }
|
Chris@49
|
2399
|
Chris@49
|
2400
|
Chris@49
|
2401
|
Chris@49
|
2402 template<typename eT>
|
Chris@49
|
2403 inline
|
Chris@49
|
2404 void
|
Chris@49
|
2405 subview_col<eT>::operator=(const subview<eT>& X)
|
Chris@49
|
2406 {
|
Chris@49
|
2407 arma_extra_debug_sigprint();
|
Chris@49
|
2408
|
Chris@49
|
2409 subview<eT>::operator=(X);
|
Chris@49
|
2410
|
Chris@49
|
2411 access::rw(colmem) = subview<eT>::colptr(0);
|
Chris@49
|
2412
|
Chris@49
|
2413 arma_debug_check( (subview<eT>::n_cols > 1), "subview_col(): incompatible dimensions" );
|
Chris@49
|
2414 }
|
Chris@49
|
2415
|
Chris@49
|
2416
|
Chris@49
|
2417
|
Chris@49
|
2418 template<typename eT>
|
Chris@49
|
2419 inline
|
Chris@49
|
2420 void
|
Chris@49
|
2421 subview_col<eT>::operator=(const subview_col<eT>& X)
|
Chris@49
|
2422 {
|
Chris@49
|
2423 arma_extra_debug_sigprint();
|
Chris@49
|
2424
|
Chris@49
|
2425 subview<eT>::operator=(X); // interprets 'subview_col' as 'subview'
|
Chris@49
|
2426
|
Chris@49
|
2427 access::rw(colmem) = subview<eT>::colptr(0);
|
Chris@49
|
2428
|
Chris@49
|
2429 arma_debug_check( (subview<eT>::n_cols > 1), "subview_col(): incompatible dimensions" );
|
Chris@49
|
2430 }
|
Chris@49
|
2431
|
Chris@49
|
2432
|
Chris@49
|
2433
|
Chris@49
|
2434 template<typename eT>
|
Chris@49
|
2435 template<typename T1>
|
Chris@49
|
2436 inline
|
Chris@49
|
2437 void
|
Chris@49
|
2438 subview_col<eT>::operator=(const Base<eT,T1>& X)
|
Chris@49
|
2439 {
|
Chris@49
|
2440 arma_extra_debug_sigprint();
|
Chris@49
|
2441
|
Chris@49
|
2442 subview<eT>::operator=(X);
|
Chris@49
|
2443
|
Chris@49
|
2444 access::rw(colmem) = subview<eT>::colptr(0);
|
Chris@49
|
2445
|
Chris@49
|
2446 arma_debug_check( (subview<eT>::n_cols > 1), "subview_col(): incompatible dimensions" );
|
Chris@49
|
2447 }
|
Chris@49
|
2448
|
Chris@49
|
2449
|
Chris@49
|
2450
|
Chris@49
|
2451 template<typename eT>
|
Chris@49
|
2452 arma_inline
|
Chris@49
|
2453 const Op<subview_col<eT>,op_htrans>
|
Chris@49
|
2454 subview_col<eT>::t() const
|
Chris@49
|
2455 {
|
Chris@49
|
2456 return Op<subview_col<eT>,op_htrans>(*this);
|
Chris@49
|
2457 }
|
Chris@49
|
2458
|
Chris@49
|
2459
|
Chris@49
|
2460
|
Chris@49
|
2461 template<typename eT>
|
Chris@49
|
2462 arma_inline
|
Chris@49
|
2463 const Op<subview_col<eT>,op_htrans>
|
Chris@49
|
2464 subview_col<eT>::ht() const
|
Chris@49
|
2465 {
|
Chris@49
|
2466 return Op<subview_col<eT>,op_htrans>(*this);
|
Chris@49
|
2467 }
|
Chris@49
|
2468
|
Chris@49
|
2469
|
Chris@49
|
2470
|
Chris@49
|
2471 template<typename eT>
|
Chris@49
|
2472 arma_inline
|
Chris@49
|
2473 const Op<subview_col<eT>,op_strans>
|
Chris@49
|
2474 subview_col<eT>::st() const
|
Chris@49
|
2475 {
|
Chris@49
|
2476 return Op<subview_col<eT>,op_strans>(*this);
|
Chris@49
|
2477 }
|
Chris@49
|
2478
|
Chris@49
|
2479
|
Chris@49
|
2480
|
Chris@49
|
2481 template<typename eT>
|
Chris@49
|
2482 arma_inline
|
Chris@49
|
2483 eT
|
Chris@49
|
2484 subview_col<eT>::at_alt(const uword ii) const
|
Chris@49
|
2485 {
|
Chris@49
|
2486 const eT* colmem_aligned = colmem;
|
Chris@49
|
2487 memory::mark_as_aligned(colmem_aligned);
|
Chris@49
|
2488
|
Chris@49
|
2489 return colmem_aligned[ii];
|
Chris@49
|
2490 }
|
Chris@49
|
2491
|
Chris@49
|
2492
|
Chris@49
|
2493
|
Chris@49
|
2494 template<typename eT>
|
Chris@49
|
2495 arma_inline
|
Chris@49
|
2496 eT&
|
Chris@49
|
2497 subview_col<eT>::operator[](const uword ii)
|
Chris@49
|
2498 {
|
Chris@49
|
2499 return access::rw( colmem[ii] );
|
Chris@49
|
2500 }
|
Chris@49
|
2501
|
Chris@49
|
2502
|
Chris@49
|
2503
|
Chris@49
|
2504 template<typename eT>
|
Chris@49
|
2505 arma_inline
|
Chris@49
|
2506 eT
|
Chris@49
|
2507 subview_col<eT>::operator[](const uword ii) const
|
Chris@49
|
2508 {
|
Chris@49
|
2509 return colmem[ii];
|
Chris@49
|
2510 }
|
Chris@49
|
2511
|
Chris@49
|
2512
|
Chris@49
|
2513
|
Chris@49
|
2514 template<typename eT>
|
Chris@49
|
2515 inline
|
Chris@49
|
2516 eT&
|
Chris@49
|
2517 subview_col<eT>::operator()(const uword ii)
|
Chris@49
|
2518 {
|
Chris@49
|
2519 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
|
Chris@49
|
2520
|
Chris@49
|
2521 return access::rw( colmem[ii] );
|
Chris@49
|
2522 }
|
Chris@49
|
2523
|
Chris@49
|
2524
|
Chris@49
|
2525
|
Chris@49
|
2526 template<typename eT>
|
Chris@49
|
2527 inline
|
Chris@49
|
2528 eT
|
Chris@49
|
2529 subview_col<eT>::operator()(const uword ii) const
|
Chris@49
|
2530 {
|
Chris@49
|
2531 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
|
Chris@49
|
2532
|
Chris@49
|
2533 return colmem[ii];
|
Chris@49
|
2534 }
|
Chris@49
|
2535
|
Chris@49
|
2536
|
Chris@49
|
2537
|
Chris@49
|
2538 template<typename eT>
|
Chris@49
|
2539 inline
|
Chris@49
|
2540 eT&
|
Chris@49
|
2541 subview_col<eT>::operator()(const uword in_row, const uword in_col)
|
Chris@49
|
2542 {
|
Chris@49
|
2543 arma_debug_check( ((in_row >= subview<eT>::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds");
|
Chris@49
|
2544
|
Chris@49
|
2545 return access::rw( colmem[in_row] );
|
Chris@49
|
2546 }
|
Chris@49
|
2547
|
Chris@49
|
2548
|
Chris@49
|
2549
|
Chris@49
|
2550 template<typename eT>
|
Chris@49
|
2551 inline
|
Chris@49
|
2552 eT
|
Chris@49
|
2553 subview_col<eT>::operator()(const uword in_row, const uword in_col) const
|
Chris@49
|
2554 {
|
Chris@49
|
2555 arma_debug_check( ((in_row >= subview<eT>::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds");
|
Chris@49
|
2556
|
Chris@49
|
2557 return colmem[in_row];
|
Chris@49
|
2558 }
|
Chris@49
|
2559
|
Chris@49
|
2560
|
Chris@49
|
2561
|
Chris@49
|
2562 template<typename eT>
|
Chris@49
|
2563 inline
|
Chris@49
|
2564 eT&
|
Chris@49
|
2565 subview_col<eT>::at(const uword in_row, const uword)
|
Chris@49
|
2566 {
|
Chris@49
|
2567 return access::rw( colmem[in_row] );
|
Chris@49
|
2568 }
|
Chris@49
|
2569
|
Chris@49
|
2570
|
Chris@49
|
2571
|
Chris@49
|
2572 template<typename eT>
|
Chris@49
|
2573 inline
|
Chris@49
|
2574 eT
|
Chris@49
|
2575 subview_col<eT>::at(const uword in_row, const uword) const
|
Chris@49
|
2576 {
|
Chris@49
|
2577 return colmem[in_row];
|
Chris@49
|
2578 }
|
Chris@49
|
2579
|
Chris@49
|
2580
|
Chris@49
|
2581
|
Chris@49
|
2582 template<typename eT>
|
Chris@49
|
2583 arma_inline
|
Chris@49
|
2584 eT*
|
Chris@49
|
2585 subview_col<eT>::colptr(const uword)
|
Chris@49
|
2586 {
|
Chris@49
|
2587 return const_cast<eT*>(colmem);
|
Chris@49
|
2588 }
|
Chris@49
|
2589
|
Chris@49
|
2590
|
Chris@49
|
2591 template<typename eT>
|
Chris@49
|
2592 arma_inline
|
Chris@49
|
2593 const eT*
|
Chris@49
|
2594 subview_col<eT>::colptr(const uword) const
|
Chris@49
|
2595 {
|
Chris@49
|
2596 return colmem;
|
Chris@49
|
2597 }
|
Chris@49
|
2598
|
Chris@49
|
2599
|
Chris@49
|
2600 template<typename eT>
|
Chris@49
|
2601 inline
|
Chris@49
|
2602 subview_col<eT>
|
Chris@49
|
2603 subview_col<eT>::rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
2604 {
|
Chris@49
|
2605 arma_extra_debug_sigprint();
|
Chris@49
|
2606
|
Chris@49
|
2607 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used");
|
Chris@49
|
2608
|
Chris@49
|
2609 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2610
|
Chris@49
|
2611 const uword base_row1 = this->aux_row1 + in_row1;
|
Chris@49
|
2612
|
Chris@49
|
2613 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
|
Chris@49
|
2614 }
|
Chris@49
|
2615
|
Chris@49
|
2616
|
Chris@49
|
2617
|
Chris@49
|
2618 template<typename eT>
|
Chris@49
|
2619 inline
|
Chris@49
|
2620 const subview_col<eT>
|
Chris@49
|
2621 subview_col<eT>::rows(const uword in_row1, const uword in_row2) const
|
Chris@49
|
2622 {
|
Chris@49
|
2623 arma_extra_debug_sigprint();
|
Chris@49
|
2624
|
Chris@49
|
2625 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used");
|
Chris@49
|
2626
|
Chris@49
|
2627 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2628
|
Chris@49
|
2629 const uword base_row1 = this->aux_row1 + in_row1;
|
Chris@49
|
2630
|
Chris@49
|
2631 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
|
Chris@49
|
2632 }
|
Chris@49
|
2633
|
Chris@49
|
2634
|
Chris@49
|
2635
|
Chris@49
|
2636 template<typename eT>
|
Chris@49
|
2637 inline
|
Chris@49
|
2638 subview_col<eT>
|
Chris@49
|
2639 subview_col<eT>::subvec(const uword in_row1, const uword in_row2)
|
Chris@49
|
2640 {
|
Chris@49
|
2641 arma_extra_debug_sigprint();
|
Chris@49
|
2642
|
Chris@49
|
2643 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
2644
|
Chris@49
|
2645 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2646
|
Chris@49
|
2647 const uword base_row1 = this->aux_row1 + in_row1;
|
Chris@49
|
2648
|
Chris@49
|
2649 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
|
Chris@49
|
2650 }
|
Chris@49
|
2651
|
Chris@49
|
2652
|
Chris@49
|
2653
|
Chris@49
|
2654 template<typename eT>
|
Chris@49
|
2655 inline
|
Chris@49
|
2656 const subview_col<eT>
|
Chris@49
|
2657 subview_col<eT>::subvec(const uword in_row1, const uword in_row2) const
|
Chris@49
|
2658 {
|
Chris@49
|
2659 arma_extra_debug_sigprint();
|
Chris@49
|
2660
|
Chris@49
|
2661 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
2662
|
Chris@49
|
2663 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2664
|
Chris@49
|
2665 const uword base_row1 = this->aux_row1 + in_row1;
|
Chris@49
|
2666
|
Chris@49
|
2667 return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);
|
Chris@49
|
2668 }
|
Chris@49
|
2669
|
Chris@49
|
2670
|
Chris@49
|
2671
|
Chris@49
|
2672 //
|
Chris@49
|
2673 //
|
Chris@49
|
2674 //
|
Chris@49
|
2675
|
Chris@49
|
2676
|
Chris@49
|
2677
|
Chris@49
|
2678 template<typename eT>
|
Chris@49
|
2679 inline
|
Chris@49
|
2680 subview_row<eT>::subview_row(const Mat<eT>& in_m, const uword in_row)
|
Chris@49
|
2681 : subview<eT>(in_m, in_row, 0, 1, in_m.n_cols)
|
Chris@49
|
2682 {
|
Chris@49
|
2683 arma_extra_debug_sigprint();
|
Chris@49
|
2684 }
|
Chris@49
|
2685
|
Chris@49
|
2686
|
Chris@49
|
2687
|
Chris@49
|
2688 template<typename eT>
|
Chris@49
|
2689 inline
|
Chris@49
|
2690 subview_row<eT>::subview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols)
|
Chris@49
|
2691 : subview<eT>(in_m, in_row, in_col1, 1, in_n_cols)
|
Chris@49
|
2692 {
|
Chris@49
|
2693 arma_extra_debug_sigprint();
|
Chris@49
|
2694 }
|
Chris@49
|
2695
|
Chris@49
|
2696
|
Chris@49
|
2697
|
Chris@49
|
2698 template<typename eT>
|
Chris@49
|
2699 inline
|
Chris@49
|
2700 void
|
Chris@49
|
2701 subview_row<eT>::operator=(const subview<eT>& X)
|
Chris@49
|
2702 {
|
Chris@49
|
2703 arma_extra_debug_sigprint();
|
Chris@49
|
2704
|
Chris@49
|
2705 subview<eT>::operator=(X);
|
Chris@49
|
2706 arma_debug_check( (subview<eT>::n_rows > 1), "subview_row(): incompatible dimensions" );
|
Chris@49
|
2707 }
|
Chris@49
|
2708
|
Chris@49
|
2709
|
Chris@49
|
2710
|
Chris@49
|
2711 template<typename eT>
|
Chris@49
|
2712 inline
|
Chris@49
|
2713 void
|
Chris@49
|
2714 subview_row<eT>::operator=(const subview_row<eT>& X)
|
Chris@49
|
2715 {
|
Chris@49
|
2716 arma_extra_debug_sigprint();
|
Chris@49
|
2717
|
Chris@49
|
2718 subview<eT>::operator=(X); // interprets 'subview_row' as 'subview'
|
Chris@49
|
2719 arma_debug_check( (subview<eT>::n_rows > 1), "subview_row(): incompatible dimensions" );
|
Chris@49
|
2720 }
|
Chris@49
|
2721
|
Chris@49
|
2722
|
Chris@49
|
2723
|
Chris@49
|
2724 template<typename eT>
|
Chris@49
|
2725 template<typename T1>
|
Chris@49
|
2726 inline
|
Chris@49
|
2727 void
|
Chris@49
|
2728 subview_row<eT>::operator=(const Base<eT,T1>& X)
|
Chris@49
|
2729 {
|
Chris@49
|
2730 arma_extra_debug_sigprint();
|
Chris@49
|
2731
|
Chris@49
|
2732 subview<eT>::operator=(X);
|
Chris@49
|
2733 arma_debug_check( (subview<eT>::n_rows > 1), "subview_row(): incompatible dimensions" );
|
Chris@49
|
2734 }
|
Chris@49
|
2735
|
Chris@49
|
2736
|
Chris@49
|
2737
|
Chris@49
|
2738 template<typename eT>
|
Chris@49
|
2739 arma_inline
|
Chris@49
|
2740 const Op<subview_row<eT>,op_htrans>
|
Chris@49
|
2741 subview_row<eT>::t() const
|
Chris@49
|
2742 {
|
Chris@49
|
2743 return Op<subview_row<eT>,op_htrans>(*this);
|
Chris@49
|
2744 }
|
Chris@49
|
2745
|
Chris@49
|
2746
|
Chris@49
|
2747
|
Chris@49
|
2748 template<typename eT>
|
Chris@49
|
2749 arma_inline
|
Chris@49
|
2750 const Op<subview_row<eT>,op_htrans>
|
Chris@49
|
2751 subview_row<eT>::ht() const
|
Chris@49
|
2752 {
|
Chris@49
|
2753 return Op<subview_row<eT>,op_htrans>(*this);
|
Chris@49
|
2754 }
|
Chris@49
|
2755
|
Chris@49
|
2756
|
Chris@49
|
2757
|
Chris@49
|
2758 template<typename eT>
|
Chris@49
|
2759 arma_inline
|
Chris@49
|
2760 const Op<subview_row<eT>,op_strans>
|
Chris@49
|
2761 subview_row<eT>::st() const
|
Chris@49
|
2762 {
|
Chris@49
|
2763 return Op<subview_row<eT>,op_strans>(*this);
|
Chris@49
|
2764 }
|
Chris@49
|
2765
|
Chris@49
|
2766
|
Chris@49
|
2767
|
Chris@49
|
2768 template<typename eT>
|
Chris@49
|
2769 inline
|
Chris@49
|
2770 eT
|
Chris@49
|
2771 subview_row<eT>::at_alt(const uword ii) const
|
Chris@49
|
2772 {
|
Chris@49
|
2773 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2774
|
Chris@49
|
2775 return subview<eT>::m.mem[index];
|
Chris@49
|
2776 }
|
Chris@49
|
2777
|
Chris@49
|
2778
|
Chris@49
|
2779
|
Chris@49
|
2780 template<typename eT>
|
Chris@49
|
2781 inline
|
Chris@49
|
2782 eT&
|
Chris@49
|
2783 subview_row<eT>::operator[](const uword ii)
|
Chris@49
|
2784 {
|
Chris@49
|
2785 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2786
|
Chris@49
|
2787 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
|
Chris@49
|
2788 }
|
Chris@49
|
2789
|
Chris@49
|
2790
|
Chris@49
|
2791
|
Chris@49
|
2792 template<typename eT>
|
Chris@49
|
2793 inline
|
Chris@49
|
2794 eT
|
Chris@49
|
2795 subview_row<eT>::operator[](const uword ii) const
|
Chris@49
|
2796 {
|
Chris@49
|
2797 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2798
|
Chris@49
|
2799 return subview<eT>::m.mem[index];
|
Chris@49
|
2800 }
|
Chris@49
|
2801
|
Chris@49
|
2802
|
Chris@49
|
2803
|
Chris@49
|
2804 template<typename eT>
|
Chris@49
|
2805 inline
|
Chris@49
|
2806 eT&
|
Chris@49
|
2807 subview_row<eT>::operator()(const uword ii)
|
Chris@49
|
2808 {
|
Chris@49
|
2809 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
|
Chris@49
|
2810
|
Chris@49
|
2811 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2812
|
Chris@49
|
2813 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
|
Chris@49
|
2814 }
|
Chris@49
|
2815
|
Chris@49
|
2816
|
Chris@49
|
2817
|
Chris@49
|
2818 template<typename eT>
|
Chris@49
|
2819 inline
|
Chris@49
|
2820 eT
|
Chris@49
|
2821 subview_row<eT>::operator()(const uword ii) const
|
Chris@49
|
2822 {
|
Chris@49
|
2823 arma_debug_check( (ii >= subview<eT>::n_elem), "subview::operator(): index out of bounds");
|
Chris@49
|
2824
|
Chris@49
|
2825 const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2826
|
Chris@49
|
2827 return subview<eT>::m.mem[index];
|
Chris@49
|
2828 }
|
Chris@49
|
2829
|
Chris@49
|
2830
|
Chris@49
|
2831
|
Chris@49
|
2832 template<typename eT>
|
Chris@49
|
2833 inline
|
Chris@49
|
2834 eT&
|
Chris@49
|
2835 subview_row<eT>::operator()(const uword in_row, const uword in_col)
|
Chris@49
|
2836 {
|
Chris@49
|
2837 arma_debug_check( ((in_row > 0) || (in_col >= subview<eT>::n_cols)), "subview::operator(): index out of bounds");
|
Chris@49
|
2838
|
Chris@49
|
2839 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2840
|
Chris@49
|
2841 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
|
Chris@49
|
2842 }
|
Chris@49
|
2843
|
Chris@49
|
2844
|
Chris@49
|
2845
|
Chris@49
|
2846 template<typename eT>
|
Chris@49
|
2847 inline
|
Chris@49
|
2848 eT
|
Chris@49
|
2849 subview_row<eT>::operator()(const uword in_row, const uword in_col) const
|
Chris@49
|
2850 {
|
Chris@49
|
2851 arma_debug_check( ((in_row > 0) || (in_col >= subview<eT>::n_cols)), "subview::operator(): index out of bounds");
|
Chris@49
|
2852
|
Chris@49
|
2853 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2854
|
Chris@49
|
2855 return subview<eT>::m.mem[index];
|
Chris@49
|
2856 }
|
Chris@49
|
2857
|
Chris@49
|
2858
|
Chris@49
|
2859
|
Chris@49
|
2860 template<typename eT>
|
Chris@49
|
2861 inline
|
Chris@49
|
2862 eT&
|
Chris@49
|
2863 subview_row<eT>::at(const uword, const uword in_col)
|
Chris@49
|
2864 {
|
Chris@49
|
2865 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2866
|
Chris@49
|
2867 return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );
|
Chris@49
|
2868 }
|
Chris@49
|
2869
|
Chris@49
|
2870
|
Chris@49
|
2871
|
Chris@49
|
2872 template<typename eT>
|
Chris@49
|
2873 inline
|
Chris@49
|
2874 eT
|
Chris@49
|
2875 subview_row<eT>::at(const uword, const uword in_col) const
|
Chris@49
|
2876 {
|
Chris@49
|
2877 const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);
|
Chris@49
|
2878
|
Chris@49
|
2879 return subview<eT>::m.mem[index];
|
Chris@49
|
2880 }
|
Chris@49
|
2881
|
Chris@49
|
2882
|
Chris@49
|
2883
|
Chris@49
|
2884 template<typename eT>
|
Chris@49
|
2885 inline
|
Chris@49
|
2886 subview_row<eT>
|
Chris@49
|
2887 subview_row<eT>::cols(const uword in_col1, const uword in_col2)
|
Chris@49
|
2888 {
|
Chris@49
|
2889 arma_extra_debug_sigprint();
|
Chris@49
|
2890
|
Chris@49
|
2891 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used" );
|
Chris@49
|
2892
|
Chris@49
|
2893 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2894
|
Chris@49
|
2895 const uword base_col1 = this->aux_col1 + in_col1;
|
Chris@49
|
2896
|
Chris@49
|
2897 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
|
Chris@49
|
2898 }
|
Chris@49
|
2899
|
Chris@49
|
2900
|
Chris@49
|
2901
|
Chris@49
|
2902 template<typename eT>
|
Chris@49
|
2903 inline
|
Chris@49
|
2904 const subview_row<eT>
|
Chris@49
|
2905 subview_row<eT>::cols(const uword in_col1, const uword in_col2) const
|
Chris@49
|
2906 {
|
Chris@49
|
2907 arma_extra_debug_sigprint();
|
Chris@49
|
2908
|
Chris@49
|
2909 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used");
|
Chris@49
|
2910
|
Chris@49
|
2911 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2912
|
Chris@49
|
2913 const uword base_col1 = this->aux_col1 + in_col1;
|
Chris@49
|
2914
|
Chris@49
|
2915 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
|
Chris@49
|
2916 }
|
Chris@49
|
2917
|
Chris@49
|
2918
|
Chris@49
|
2919
|
Chris@49
|
2920 template<typename eT>
|
Chris@49
|
2921 inline
|
Chris@49
|
2922 subview_row<eT>
|
Chris@49
|
2923 subview_row<eT>::subvec(const uword in_col1, const uword in_col2)
|
Chris@49
|
2924 {
|
Chris@49
|
2925 arma_extra_debug_sigprint();
|
Chris@49
|
2926
|
Chris@49
|
2927 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
2928
|
Chris@49
|
2929 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2930
|
Chris@49
|
2931 const uword base_col1 = this->aux_col1 + in_col1;
|
Chris@49
|
2932
|
Chris@49
|
2933 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
|
Chris@49
|
2934 }
|
Chris@49
|
2935
|
Chris@49
|
2936
|
Chris@49
|
2937
|
Chris@49
|
2938 template<typename eT>
|
Chris@49
|
2939 inline
|
Chris@49
|
2940 const subview_row<eT>
|
Chris@49
|
2941 subview_row<eT>::subvec(const uword in_col1, const uword in_col2) const
|
Chris@49
|
2942 {
|
Chris@49
|
2943 arma_extra_debug_sigprint();
|
Chris@49
|
2944
|
Chris@49
|
2945 arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
2946
|
Chris@49
|
2947 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2948
|
Chris@49
|
2949 const uword base_col1 = this->aux_col1 + in_col1;
|
Chris@49
|
2950
|
Chris@49
|
2951 return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);
|
Chris@49
|
2952 }
|
Chris@49
|
2953
|
Chris@49
|
2954
|
Chris@49
|
2955
|
Chris@49
|
2956 //
|
Chris@49
|
2957 //
|
Chris@49
|
2958 //
|
Chris@49
|
2959
|
Chris@49
|
2960
|
Chris@49
|
2961
|
Chris@49
|
2962 template<typename eT>
|
Chris@49
|
2963 inline
|
Chris@49
|
2964 subview_row_strans<eT>::subview_row_strans(const subview_row<eT>& in_sv_row)
|
Chris@49
|
2965 : sv_row(in_sv_row )
|
Chris@49
|
2966 , n_rows(in_sv_row.n_cols)
|
Chris@49
|
2967 , n_elem(in_sv_row.n_elem)
|
Chris@49
|
2968 {
|
Chris@49
|
2969 arma_extra_debug_sigprint();
|
Chris@49
|
2970 }
|
Chris@49
|
2971
|
Chris@49
|
2972
|
Chris@49
|
2973
|
Chris@49
|
2974 template<typename eT>
|
Chris@49
|
2975 inline
|
Chris@49
|
2976 void
|
Chris@49
|
2977 subview_row_strans<eT>::extract(Mat<eT>& out) const
|
Chris@49
|
2978 {
|
Chris@49
|
2979 arma_extra_debug_sigprint();
|
Chris@49
|
2980
|
Chris@49
|
2981 // NOTE: this function assumes that matrix 'out' has already been set to the correct size
|
Chris@49
|
2982
|
Chris@49
|
2983 const Mat<eT>& X = sv_row.m;
|
Chris@49
|
2984
|
Chris@49
|
2985 eT* out_mem = out.memptr();
|
Chris@49
|
2986
|
Chris@49
|
2987 const uword row = sv_row.aux_row1;
|
Chris@49
|
2988 const uword start_col = sv_row.aux_col1;
|
Chris@49
|
2989 const uword sv_row_n_cols = sv_row.n_cols;
|
Chris@49
|
2990
|
Chris@49
|
2991 uword ii,jj;
|
Chris@49
|
2992
|
Chris@49
|
2993 for(ii=0, jj=1; jj < sv_row_n_cols; ii+=2, jj+=2)
|
Chris@49
|
2994 {
|
Chris@49
|
2995 const eT tmp1 = X.at(row, start_col+ii);
|
Chris@49
|
2996 const eT tmp2 = X.at(row, start_col+jj);
|
Chris@49
|
2997
|
Chris@49
|
2998 out_mem[ii] = tmp1;
|
Chris@49
|
2999 out_mem[jj] = tmp2;
|
Chris@49
|
3000 }
|
Chris@49
|
3001
|
Chris@49
|
3002 if(ii < sv_row_n_cols)
|
Chris@49
|
3003 {
|
Chris@49
|
3004 out_mem[ii] = X.at(row, start_col+ii);
|
Chris@49
|
3005 }
|
Chris@49
|
3006 }
|
Chris@49
|
3007
|
Chris@49
|
3008
|
Chris@49
|
3009
|
Chris@49
|
3010 template<typename eT>
|
Chris@49
|
3011 inline
|
Chris@49
|
3012 eT
|
Chris@49
|
3013 subview_row_strans<eT>::at_alt(const uword ii) const
|
Chris@49
|
3014 {
|
Chris@49
|
3015 return sv_row[ii];
|
Chris@49
|
3016 }
|
Chris@49
|
3017
|
Chris@49
|
3018
|
Chris@49
|
3019
|
Chris@49
|
3020 template<typename eT>
|
Chris@49
|
3021 inline
|
Chris@49
|
3022 eT
|
Chris@49
|
3023 subview_row_strans<eT>::operator[](const uword ii) const
|
Chris@49
|
3024 {
|
Chris@49
|
3025 return sv_row[ii];
|
Chris@49
|
3026 }
|
Chris@49
|
3027
|
Chris@49
|
3028
|
Chris@49
|
3029
|
Chris@49
|
3030 template<typename eT>
|
Chris@49
|
3031 inline
|
Chris@49
|
3032 eT
|
Chris@49
|
3033 subview_row_strans<eT>::operator()(const uword ii) const
|
Chris@49
|
3034 {
|
Chris@49
|
3035 return sv_row(ii);
|
Chris@49
|
3036 }
|
Chris@49
|
3037
|
Chris@49
|
3038
|
Chris@49
|
3039
|
Chris@49
|
3040 template<typename eT>
|
Chris@49
|
3041 inline
|
Chris@49
|
3042 eT
|
Chris@49
|
3043 subview_row_strans<eT>::operator()(const uword in_row, const uword in_col) const
|
Chris@49
|
3044 {
|
Chris@49
|
3045 return sv_row(in_col, in_row); // deliberately swapped
|
Chris@49
|
3046 }
|
Chris@49
|
3047
|
Chris@49
|
3048
|
Chris@49
|
3049
|
Chris@49
|
3050 template<typename eT>
|
Chris@49
|
3051 inline
|
Chris@49
|
3052 eT
|
Chris@49
|
3053 subview_row_strans<eT>::at(const uword in_row, const uword) const
|
Chris@49
|
3054 {
|
Chris@49
|
3055 return sv_row.at(0, in_row); // deliberately swapped
|
Chris@49
|
3056 }
|
Chris@49
|
3057
|
Chris@49
|
3058
|
Chris@49
|
3059
|
Chris@49
|
3060 //
|
Chris@49
|
3061 //
|
Chris@49
|
3062 //
|
Chris@49
|
3063
|
Chris@49
|
3064
|
Chris@49
|
3065
|
Chris@49
|
3066 template<typename eT>
|
Chris@49
|
3067 inline
|
Chris@49
|
3068 subview_row_htrans<eT>::subview_row_htrans(const subview_row<eT>& in_sv_row)
|
Chris@49
|
3069 : sv_row(in_sv_row )
|
Chris@49
|
3070 , n_rows(in_sv_row.n_cols)
|
Chris@49
|
3071 , n_elem(in_sv_row.n_elem)
|
Chris@49
|
3072 {
|
Chris@49
|
3073 arma_extra_debug_sigprint();
|
Chris@49
|
3074 }
|
Chris@49
|
3075
|
Chris@49
|
3076
|
Chris@49
|
3077
|
Chris@49
|
3078 template<typename eT>
|
Chris@49
|
3079 inline
|
Chris@49
|
3080 void
|
Chris@49
|
3081 subview_row_htrans<eT>::extract(Mat<eT>& out) const
|
Chris@49
|
3082 {
|
Chris@49
|
3083 arma_extra_debug_sigprint();
|
Chris@49
|
3084
|
Chris@49
|
3085 // NOTE: this function assumes that matrix 'out' has already been set to the correct size
|
Chris@49
|
3086
|
Chris@49
|
3087 const Mat<eT>& X = sv_row.m;
|
Chris@49
|
3088
|
Chris@49
|
3089 eT* out_mem = out.memptr();
|
Chris@49
|
3090
|
Chris@49
|
3091 const uword row = sv_row.aux_row1;
|
Chris@49
|
3092 const uword start_col = sv_row.aux_col1;
|
Chris@49
|
3093 const uword sv_row_n_cols = sv_row.n_cols;
|
Chris@49
|
3094
|
Chris@49
|
3095 for(uword ii=0; ii < sv_row_n_cols; ++ii)
|
Chris@49
|
3096 {
|
Chris@49
|
3097 out_mem[ii] = access::alt_conj( X.at(row, start_col+ii) );
|
Chris@49
|
3098 }
|
Chris@49
|
3099 }
|
Chris@49
|
3100
|
Chris@49
|
3101
|
Chris@49
|
3102
|
Chris@49
|
3103 template<typename eT>
|
Chris@49
|
3104 inline
|
Chris@49
|
3105 eT
|
Chris@49
|
3106 subview_row_htrans<eT>::at_alt(const uword ii) const
|
Chris@49
|
3107 {
|
Chris@49
|
3108 return access::alt_conj( sv_row[ii] );
|
Chris@49
|
3109 }
|
Chris@49
|
3110
|
Chris@49
|
3111
|
Chris@49
|
3112
|
Chris@49
|
3113 template<typename eT>
|
Chris@49
|
3114 inline
|
Chris@49
|
3115 eT
|
Chris@49
|
3116 subview_row_htrans<eT>::operator[](const uword ii) const
|
Chris@49
|
3117 {
|
Chris@49
|
3118 return access::alt_conj( sv_row[ii] );
|
Chris@49
|
3119 }
|
Chris@49
|
3120
|
Chris@49
|
3121
|
Chris@49
|
3122
|
Chris@49
|
3123 template<typename eT>
|
Chris@49
|
3124 inline
|
Chris@49
|
3125 eT
|
Chris@49
|
3126 subview_row_htrans<eT>::operator()(const uword ii) const
|
Chris@49
|
3127 {
|
Chris@49
|
3128 return access::alt_conj( sv_row(ii) );
|
Chris@49
|
3129 }
|
Chris@49
|
3130
|
Chris@49
|
3131
|
Chris@49
|
3132
|
Chris@49
|
3133 template<typename eT>
|
Chris@49
|
3134 inline
|
Chris@49
|
3135 eT
|
Chris@49
|
3136 subview_row_htrans<eT>::operator()(const uword in_row, const uword in_col) const
|
Chris@49
|
3137 {
|
Chris@49
|
3138 return access::alt_conj( sv_row(in_col, in_row) ); // deliberately swapped
|
Chris@49
|
3139 }
|
Chris@49
|
3140
|
Chris@49
|
3141
|
Chris@49
|
3142
|
Chris@49
|
3143 template<typename eT>
|
Chris@49
|
3144 inline
|
Chris@49
|
3145 eT
|
Chris@49
|
3146 subview_row_htrans<eT>::at(const uword in_row, const uword) const
|
Chris@49
|
3147 {
|
Chris@49
|
3148 return access::alt_conj( sv_row.at(0, in_row) ); // deliberately swapped
|
Chris@49
|
3149 }
|
Chris@49
|
3150
|
Chris@49
|
3151
|
Chris@49
|
3152
|
Chris@49
|
3153 //! @}
|