Chris@49
|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2012 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup diagmat_proxy
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename T1>
|
Chris@49
|
15 class diagmat_proxy_default
|
Chris@49
|
16 {
|
Chris@49
|
17 public:
|
Chris@49
|
18
|
Chris@49
|
19 typedef typename T1::elem_type elem_type;
|
Chris@49
|
20 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
21
|
Chris@49
|
22 inline
|
Chris@49
|
23 diagmat_proxy_default(const T1& X)
|
Chris@49
|
24 : P ( X )
|
Chris@49
|
25 , P_is_vec( (resolves_to_vector<T1>::value) || (P.get_n_rows() == 1) || (P.get_n_cols() == 1) )
|
Chris@49
|
26 , P_is_col( T1::is_col || (P.get_n_cols() == 1) )
|
Chris@49
|
27 , n_elem ( P_is_vec ? P.get_n_elem() : (std::min)(P.get_n_elem(), P.get_n_rows()) )
|
Chris@49
|
28 {
|
Chris@49
|
29 arma_extra_debug_sigprint();
|
Chris@49
|
30
|
Chris@49
|
31 arma_debug_check
|
Chris@49
|
32 (
|
Chris@49
|
33 (P_is_vec == false) && (P.get_n_rows() != P.get_n_cols()),
|
Chris@49
|
34 "diagmat(): only vectors and square matrices are accepted"
|
Chris@49
|
35 );
|
Chris@49
|
36 }
|
Chris@49
|
37
|
Chris@49
|
38
|
Chris@49
|
39 arma_inline
|
Chris@49
|
40 elem_type
|
Chris@49
|
41 operator[](const uword i) const
|
Chris@49
|
42 {
|
Chris@49
|
43 if(Proxy<T1>::prefer_at_accessor == false)
|
Chris@49
|
44 {
|
Chris@49
|
45 return P_is_vec ? P[i] : P.at(i,i);
|
Chris@49
|
46 }
|
Chris@49
|
47 else
|
Chris@49
|
48 {
|
Chris@49
|
49 if(P_is_vec)
|
Chris@49
|
50 {
|
Chris@49
|
51 return (P_is_col) ? P.at(i,0) : P.at(0,i);
|
Chris@49
|
52 }
|
Chris@49
|
53 else
|
Chris@49
|
54 {
|
Chris@49
|
55 return P.at(i,i);
|
Chris@49
|
56 }
|
Chris@49
|
57 }
|
Chris@49
|
58 }
|
Chris@49
|
59
|
Chris@49
|
60
|
Chris@49
|
61 arma_inline
|
Chris@49
|
62 elem_type
|
Chris@49
|
63 at(const uword row, const uword col) const
|
Chris@49
|
64 {
|
Chris@49
|
65 if(row == col)
|
Chris@49
|
66 {
|
Chris@49
|
67 if(Proxy<T1>::prefer_at_accessor == false)
|
Chris@49
|
68 {
|
Chris@49
|
69 return (P_is_vec) ? P[row] : P.at(row,row);
|
Chris@49
|
70 }
|
Chris@49
|
71 else
|
Chris@49
|
72 {
|
Chris@49
|
73 if(P_is_vec)
|
Chris@49
|
74 {
|
Chris@49
|
75 return (P_is_col) ? P.at(row,0) : P.at(0,row);
|
Chris@49
|
76 }
|
Chris@49
|
77 else
|
Chris@49
|
78 {
|
Chris@49
|
79 return P.at(row,row);
|
Chris@49
|
80 }
|
Chris@49
|
81 }
|
Chris@49
|
82 }
|
Chris@49
|
83 else
|
Chris@49
|
84 {
|
Chris@49
|
85 return elem_type(0);
|
Chris@49
|
86 }
|
Chris@49
|
87 }
|
Chris@49
|
88
|
Chris@49
|
89
|
Chris@49
|
90 const Proxy<T1> P;
|
Chris@49
|
91 const bool P_is_vec;
|
Chris@49
|
92 const bool P_is_col;
|
Chris@49
|
93 const uword n_elem;
|
Chris@49
|
94 };
|
Chris@49
|
95
|
Chris@49
|
96
|
Chris@49
|
97
|
Chris@49
|
98 template<typename T1>
|
Chris@49
|
99 class diagmat_proxy_fixed
|
Chris@49
|
100 {
|
Chris@49
|
101 public:
|
Chris@49
|
102
|
Chris@49
|
103 typedef typename T1::elem_type elem_type;
|
Chris@49
|
104 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
105
|
Chris@49
|
106 inline
|
Chris@49
|
107 diagmat_proxy_fixed(const T1& X)
|
Chris@49
|
108 : P(X)
|
Chris@49
|
109 {
|
Chris@49
|
110 arma_extra_debug_sigprint();
|
Chris@49
|
111
|
Chris@49
|
112 arma_debug_check
|
Chris@49
|
113 (
|
Chris@49
|
114 (P_is_vec == false) && (T1::n_rows != T1::n_cols),
|
Chris@49
|
115 "diagmat(): only vectors and square matrices are accepted"
|
Chris@49
|
116 );
|
Chris@49
|
117 }
|
Chris@49
|
118
|
Chris@49
|
119
|
Chris@49
|
120 arma_inline
|
Chris@49
|
121 elem_type
|
Chris@49
|
122 operator[](const uword i) const
|
Chris@49
|
123 {
|
Chris@49
|
124 return (P_is_vec) ? P[i] : P.at(i,i);
|
Chris@49
|
125 }
|
Chris@49
|
126
|
Chris@49
|
127
|
Chris@49
|
128 arma_inline
|
Chris@49
|
129 elem_type
|
Chris@49
|
130 at(const uword row, const uword col) const
|
Chris@49
|
131 {
|
Chris@49
|
132 if(row == col)
|
Chris@49
|
133 {
|
Chris@49
|
134 return (P_is_vec) ? P[row] : P.at(row,row);
|
Chris@49
|
135 }
|
Chris@49
|
136 else
|
Chris@49
|
137 {
|
Chris@49
|
138 return elem_type(0);
|
Chris@49
|
139 }
|
Chris@49
|
140 }
|
Chris@49
|
141
|
Chris@49
|
142 const T1& P;
|
Chris@49
|
143
|
Chris@49
|
144 static const bool P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1);
|
Chris@49
|
145 static const uword n_elem = P_is_vec ? T1::n_elem : ( (T1::n_elem < T1::n_rows) ? T1::n_elem : T1::n_rows );
|
Chris@49
|
146 };
|
Chris@49
|
147
|
Chris@49
|
148
|
Chris@49
|
149
|
Chris@49
|
150 template<typename T1, bool condition>
|
Chris@49
|
151 struct diagmat_proxy_redirect {};
|
Chris@49
|
152
|
Chris@49
|
153 template<typename T1>
|
Chris@49
|
154 struct diagmat_proxy_redirect<T1, false> { typedef diagmat_proxy_default<T1> result; };
|
Chris@49
|
155
|
Chris@49
|
156 template<typename T1>
|
Chris@49
|
157 struct diagmat_proxy_redirect<T1, true> { typedef diagmat_proxy_fixed<T1> result; };
|
Chris@49
|
158
|
Chris@49
|
159
|
Chris@49
|
160 template<typename T1>
|
Chris@49
|
161 class diagmat_proxy : public diagmat_proxy_redirect<T1, is_Mat_fixed<T1>::value >::result
|
Chris@49
|
162 {
|
Chris@49
|
163 public:
|
Chris@49
|
164 inline diagmat_proxy(const T1& X)
|
Chris@49
|
165 : diagmat_proxy_redirect< T1, is_Mat_fixed<T1>::value >::result(X)
|
Chris@49
|
166 {
|
Chris@49
|
167 }
|
Chris@49
|
168 };
|
Chris@49
|
169
|
Chris@49
|
170
|
Chris@49
|
171
|
Chris@49
|
172 template<typename eT>
|
Chris@49
|
173 class diagmat_proxy< Mat<eT> >
|
Chris@49
|
174 {
|
Chris@49
|
175 public:
|
Chris@49
|
176
|
Chris@49
|
177 typedef eT elem_type;
|
Chris@49
|
178 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
179
|
Chris@49
|
180 inline
|
Chris@49
|
181 diagmat_proxy(const Mat<eT>& X)
|
Chris@49
|
182 : P ( X )
|
Chris@49
|
183 , P_is_vec( (X.n_rows == 1) || (X.n_cols == 1) )
|
Chris@49
|
184 , n_elem ( P_is_vec ? X.n_elem : (std::min)(X.n_elem, X.n_rows) )
|
Chris@49
|
185 {
|
Chris@49
|
186 arma_extra_debug_sigprint();
|
Chris@49
|
187
|
Chris@49
|
188 arma_debug_check
|
Chris@49
|
189 (
|
Chris@49
|
190 (P_is_vec == false) && (P.n_rows != P.n_cols),
|
Chris@49
|
191 "diagmat(): only vectors and square matrices are accepted"
|
Chris@49
|
192 );
|
Chris@49
|
193 }
|
Chris@49
|
194
|
Chris@49
|
195 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
|
Chris@49
|
196 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
|
Chris@49
|
197
|
Chris@49
|
198 const Mat<eT>& P;
|
Chris@49
|
199 const bool P_is_vec;
|
Chris@49
|
200 const uword n_elem;
|
Chris@49
|
201 };
|
Chris@49
|
202
|
Chris@49
|
203
|
Chris@49
|
204
|
Chris@49
|
205 template<typename eT>
|
Chris@49
|
206 class diagmat_proxy< Row<eT> >
|
Chris@49
|
207 {
|
Chris@49
|
208 public:
|
Chris@49
|
209
|
Chris@49
|
210 typedef eT elem_type;
|
Chris@49
|
211 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
212
|
Chris@49
|
213
|
Chris@49
|
214 inline
|
Chris@49
|
215 diagmat_proxy(const Row<eT>& X)
|
Chris@49
|
216 : P(X)
|
Chris@49
|
217 , n_elem(X.n_elem)
|
Chris@49
|
218 {
|
Chris@49
|
219 arma_extra_debug_sigprint();
|
Chris@49
|
220 }
|
Chris@49
|
221
|
Chris@49
|
222 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
223 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
224
|
Chris@49
|
225 static const bool P_is_vec = true;
|
Chris@49
|
226
|
Chris@49
|
227 const Row<eT>& P;
|
Chris@49
|
228 const uword n_elem;
|
Chris@49
|
229 };
|
Chris@49
|
230
|
Chris@49
|
231
|
Chris@49
|
232
|
Chris@49
|
233 template<typename eT>
|
Chris@49
|
234 class diagmat_proxy< Col<eT> >
|
Chris@49
|
235 {
|
Chris@49
|
236 public:
|
Chris@49
|
237
|
Chris@49
|
238 typedef eT elem_type;
|
Chris@49
|
239 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
240
|
Chris@49
|
241
|
Chris@49
|
242 inline
|
Chris@49
|
243 diagmat_proxy(const Col<eT>& X)
|
Chris@49
|
244 : P(X)
|
Chris@49
|
245 , n_elem(X.n_elem)
|
Chris@49
|
246 {
|
Chris@49
|
247 arma_extra_debug_sigprint();
|
Chris@49
|
248 }
|
Chris@49
|
249
|
Chris@49
|
250 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
251 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
252
|
Chris@49
|
253 static const bool P_is_vec = true;
|
Chris@49
|
254
|
Chris@49
|
255 const Col<eT>& P;
|
Chris@49
|
256 const uword n_elem;
|
Chris@49
|
257 };
|
Chris@49
|
258
|
Chris@49
|
259
|
Chris@49
|
260
|
Chris@49
|
261 template<typename eT>
|
Chris@49
|
262 class diagmat_proxy< subview_row<eT> >
|
Chris@49
|
263 {
|
Chris@49
|
264 public:
|
Chris@49
|
265
|
Chris@49
|
266 typedef eT elem_type;
|
Chris@49
|
267 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
268
|
Chris@49
|
269
|
Chris@49
|
270 inline
|
Chris@49
|
271 diagmat_proxy(const subview_row<eT>& X)
|
Chris@49
|
272 : P(X)
|
Chris@49
|
273 , n_elem(X.n_elem)
|
Chris@49
|
274 {
|
Chris@49
|
275 arma_extra_debug_sigprint();
|
Chris@49
|
276 }
|
Chris@49
|
277
|
Chris@49
|
278 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
279 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
280
|
Chris@49
|
281 static const bool P_is_vec = true;
|
Chris@49
|
282
|
Chris@49
|
283 const subview_row<eT>& P;
|
Chris@49
|
284 const uword n_elem;
|
Chris@49
|
285 };
|
Chris@49
|
286
|
Chris@49
|
287
|
Chris@49
|
288
|
Chris@49
|
289 template<typename eT>
|
Chris@49
|
290 class diagmat_proxy< subview_col<eT> >
|
Chris@49
|
291 {
|
Chris@49
|
292 public:
|
Chris@49
|
293
|
Chris@49
|
294 typedef eT elem_type;
|
Chris@49
|
295 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
296
|
Chris@49
|
297
|
Chris@49
|
298 inline
|
Chris@49
|
299 diagmat_proxy(const subview_col<eT>& X)
|
Chris@49
|
300 : P(X)
|
Chris@49
|
301 , n_elem(X.n_elem)
|
Chris@49
|
302 {
|
Chris@49
|
303 arma_extra_debug_sigprint();
|
Chris@49
|
304 }
|
Chris@49
|
305
|
Chris@49
|
306 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
307 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
308
|
Chris@49
|
309 static const bool P_is_vec = true;
|
Chris@49
|
310
|
Chris@49
|
311 const subview_col<eT>& P;
|
Chris@49
|
312 const uword n_elem;
|
Chris@49
|
313 };
|
Chris@49
|
314
|
Chris@49
|
315
|
Chris@49
|
316
|
Chris@49
|
317 //
|
Chris@49
|
318 //
|
Chris@49
|
319 //
|
Chris@49
|
320
|
Chris@49
|
321
|
Chris@49
|
322
|
Chris@49
|
323 template<typename T1>
|
Chris@49
|
324 class diagmat_proxy_check_default
|
Chris@49
|
325 {
|
Chris@49
|
326 public:
|
Chris@49
|
327
|
Chris@49
|
328 typedef typename T1::elem_type elem_type;
|
Chris@49
|
329 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
330
|
Chris@49
|
331 inline
|
Chris@49
|
332 diagmat_proxy_check_default(const T1& X, const Mat<typename T1::elem_type>&)
|
Chris@49
|
333 : P(X)
|
Chris@49
|
334 , P_is_vec( (resolves_to_vector<T1>::value) || (P.n_rows == 1) || (P.n_cols == 1) )
|
Chris@49
|
335 , n_elem( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
|
Chris@49
|
336 {
|
Chris@49
|
337 arma_extra_debug_sigprint();
|
Chris@49
|
338
|
Chris@49
|
339 arma_debug_check
|
Chris@49
|
340 (
|
Chris@49
|
341 (P_is_vec == false) && (P.n_rows != P.n_cols),
|
Chris@49
|
342 "diagmat(): only vectors and square matrices are accepted"
|
Chris@49
|
343 );
|
Chris@49
|
344 }
|
Chris@49
|
345
|
Chris@49
|
346 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
|
Chris@49
|
347 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
|
Chris@49
|
348
|
Chris@49
|
349 const Mat<elem_type> P;
|
Chris@49
|
350 const bool P_is_vec;
|
Chris@49
|
351 const uword n_elem;
|
Chris@49
|
352 };
|
Chris@49
|
353
|
Chris@49
|
354
|
Chris@49
|
355
|
Chris@49
|
356 template<typename T1>
|
Chris@49
|
357 class diagmat_proxy_check_fixed
|
Chris@49
|
358 {
|
Chris@49
|
359 public:
|
Chris@49
|
360
|
Chris@49
|
361 typedef typename T1::elem_type eT;
|
Chris@49
|
362 typedef typename T1::elem_type elem_type;
|
Chris@49
|
363 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
364
|
Chris@49
|
365 inline
|
Chris@49
|
366 diagmat_proxy_check_fixed(const T1& X, const Mat<eT>& out)
|
Chris@49
|
367 : P( const_cast<eT*>(X.memptr()), T1::n_rows, T1::n_cols, (&X == &out), false )
|
Chris@49
|
368 {
|
Chris@49
|
369 arma_extra_debug_sigprint();
|
Chris@49
|
370
|
Chris@49
|
371 arma_debug_check
|
Chris@49
|
372 (
|
Chris@49
|
373 (P_is_vec == false) && (T1::n_rows != T1::n_cols),
|
Chris@49
|
374 "diagmat(): only vectors and square matrices are accepted"
|
Chris@49
|
375 );
|
Chris@49
|
376 }
|
Chris@49
|
377
|
Chris@49
|
378
|
Chris@49
|
379 arma_inline eT operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
|
Chris@49
|
380 arma_inline eT at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
|
Chris@49
|
381
|
Chris@49
|
382 const Mat<eT> P; // TODO: why not just store X directly as T1& ? test with fixed size vectors and matrices
|
Chris@49
|
383
|
Chris@49
|
384 static const bool P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1);
|
Chris@49
|
385 static const uword n_elem = P_is_vec ? T1::n_elem : ( (T1::n_elem < T1::n_rows) ? T1::n_elem : T1::n_rows );
|
Chris@49
|
386 };
|
Chris@49
|
387
|
Chris@49
|
388
|
Chris@49
|
389
|
Chris@49
|
390 template<typename T1, bool condition>
|
Chris@49
|
391 struct diagmat_proxy_check_redirect {};
|
Chris@49
|
392
|
Chris@49
|
393 template<typename T1>
|
Chris@49
|
394 struct diagmat_proxy_check_redirect<T1, false> { typedef diagmat_proxy_check_default<T1> result; };
|
Chris@49
|
395
|
Chris@49
|
396 template<typename T1>
|
Chris@49
|
397 struct diagmat_proxy_check_redirect<T1, true> { typedef diagmat_proxy_check_fixed<T1> result; };
|
Chris@49
|
398
|
Chris@49
|
399
|
Chris@49
|
400 template<typename T1>
|
Chris@49
|
401 class diagmat_proxy_check : public diagmat_proxy_check_redirect<T1, is_Mat_fixed<T1>::value >::result
|
Chris@49
|
402 {
|
Chris@49
|
403 public:
|
Chris@49
|
404 inline diagmat_proxy_check(const T1& X, const Mat<typename T1::elem_type>& out)
|
Chris@49
|
405 : diagmat_proxy_check_redirect< T1, is_Mat_fixed<T1>::value >::result(X, out)
|
Chris@49
|
406 {
|
Chris@49
|
407 }
|
Chris@49
|
408 };
|
Chris@49
|
409
|
Chris@49
|
410
|
Chris@49
|
411
|
Chris@49
|
412 template<typename eT>
|
Chris@49
|
413 class diagmat_proxy_check< Mat<eT> >
|
Chris@49
|
414 {
|
Chris@49
|
415 public:
|
Chris@49
|
416
|
Chris@49
|
417 typedef eT elem_type;
|
Chris@49
|
418 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
419
|
Chris@49
|
420
|
Chris@49
|
421 inline
|
Chris@49
|
422 diagmat_proxy_check(const Mat<eT>& X, const Mat<eT>& out)
|
Chris@49
|
423 : P_local ( (&X == &out) ? new Mat<eT>(X) : 0 )
|
Chris@49
|
424 , P ( (&X == &out) ? (*P_local) : X )
|
Chris@49
|
425 , P_is_vec( (P.n_rows == 1) || (P.n_cols == 1) )
|
Chris@49
|
426 , n_elem ( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
|
Chris@49
|
427 {
|
Chris@49
|
428 arma_extra_debug_sigprint();
|
Chris@49
|
429
|
Chris@49
|
430 arma_debug_check
|
Chris@49
|
431 (
|
Chris@49
|
432 (P_is_vec == false) && (P.n_rows != P.n_cols),
|
Chris@49
|
433 "diagmat(): only vectors and square matrices are accepted"
|
Chris@49
|
434 );
|
Chris@49
|
435 }
|
Chris@49
|
436
|
Chris@49
|
437 inline ~diagmat_proxy_check()
|
Chris@49
|
438 {
|
Chris@49
|
439 if(P_local) { delete P_local; }
|
Chris@49
|
440 }
|
Chris@49
|
441
|
Chris@49
|
442 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
|
Chris@49
|
443 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
|
Chris@49
|
444
|
Chris@49
|
445 const Mat<eT>* P_local;
|
Chris@49
|
446 const Mat<eT>& P;
|
Chris@49
|
447 const bool P_is_vec;
|
Chris@49
|
448 const uword n_elem;
|
Chris@49
|
449 };
|
Chris@49
|
450
|
Chris@49
|
451
|
Chris@49
|
452
|
Chris@49
|
453 template<typename eT>
|
Chris@49
|
454 class diagmat_proxy_check< Row<eT> >
|
Chris@49
|
455 {
|
Chris@49
|
456 public:
|
Chris@49
|
457
|
Chris@49
|
458 typedef eT elem_type;
|
Chris@49
|
459 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
460
|
Chris@49
|
461 inline
|
Chris@49
|
462 diagmat_proxy_check(const Row<eT>& X, const Mat<eT>& out)
|
Chris@49
|
463 : P_local ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? new Row<eT>(X) : 0 )
|
Chris@49
|
464 , P ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? (*P_local) : X )
|
Chris@49
|
465 , n_elem (X.n_elem)
|
Chris@49
|
466 {
|
Chris@49
|
467 arma_extra_debug_sigprint();
|
Chris@49
|
468 }
|
Chris@49
|
469
|
Chris@49
|
470 inline ~diagmat_proxy_check()
|
Chris@49
|
471 {
|
Chris@49
|
472 if(P_local) { delete P_local; }
|
Chris@49
|
473 }
|
Chris@49
|
474
|
Chris@49
|
475 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
476 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
477
|
Chris@49
|
478 static const bool P_is_vec = true;
|
Chris@49
|
479
|
Chris@49
|
480 const Row<eT>* P_local;
|
Chris@49
|
481 const Row<eT>& P;
|
Chris@49
|
482 const uword n_elem;
|
Chris@49
|
483 };
|
Chris@49
|
484
|
Chris@49
|
485
|
Chris@49
|
486
|
Chris@49
|
487 template<typename eT>
|
Chris@49
|
488 class diagmat_proxy_check< Col<eT> >
|
Chris@49
|
489 {
|
Chris@49
|
490 public:
|
Chris@49
|
491
|
Chris@49
|
492 typedef eT elem_type;
|
Chris@49
|
493 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
494
|
Chris@49
|
495 inline
|
Chris@49
|
496 diagmat_proxy_check(const Col<eT>& X, const Mat<eT>& out)
|
Chris@49
|
497 : P_local ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? new Col<eT>(X) : 0 )
|
Chris@49
|
498 , P ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? (*P_local) : X )
|
Chris@49
|
499 , n_elem (X.n_elem)
|
Chris@49
|
500 {
|
Chris@49
|
501 arma_extra_debug_sigprint();
|
Chris@49
|
502 }
|
Chris@49
|
503
|
Chris@49
|
504 inline ~diagmat_proxy_check()
|
Chris@49
|
505 {
|
Chris@49
|
506 if(P_local) { delete P_local; }
|
Chris@49
|
507 }
|
Chris@49
|
508
|
Chris@49
|
509 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
510 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
511
|
Chris@49
|
512 static const bool P_is_vec = true;
|
Chris@49
|
513
|
Chris@49
|
514 const Col<eT>* P_local;
|
Chris@49
|
515 const Col<eT>& P;
|
Chris@49
|
516 const uword n_elem;
|
Chris@49
|
517 };
|
Chris@49
|
518
|
Chris@49
|
519
|
Chris@49
|
520
|
Chris@49
|
521 template<typename eT>
|
Chris@49
|
522 class diagmat_proxy_check< subview_row<eT> >
|
Chris@49
|
523 {
|
Chris@49
|
524 public:
|
Chris@49
|
525
|
Chris@49
|
526 typedef eT elem_type;
|
Chris@49
|
527 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
528
|
Chris@49
|
529 inline
|
Chris@49
|
530 diagmat_proxy_check(const subview_row<eT>& X, const Mat<eT>&)
|
Chris@49
|
531 : P ( X )
|
Chris@49
|
532 , n_elem ( X.n_elem )
|
Chris@49
|
533 {
|
Chris@49
|
534 arma_extra_debug_sigprint();
|
Chris@49
|
535 }
|
Chris@49
|
536
|
Chris@49
|
537 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
538 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
539
|
Chris@49
|
540 static const bool P_is_vec = true;
|
Chris@49
|
541
|
Chris@49
|
542 const Row<eT> P;
|
Chris@49
|
543 const uword n_elem;
|
Chris@49
|
544 };
|
Chris@49
|
545
|
Chris@49
|
546
|
Chris@49
|
547
|
Chris@49
|
548 template<typename eT>
|
Chris@49
|
549 class diagmat_proxy_check< subview_col<eT> >
|
Chris@49
|
550 {
|
Chris@49
|
551 public:
|
Chris@49
|
552
|
Chris@49
|
553 typedef eT elem_type;
|
Chris@49
|
554 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
555
|
Chris@49
|
556 inline
|
Chris@49
|
557 diagmat_proxy_check(const subview_col<eT>& X, const Mat<eT>& out)
|
Chris@49
|
558 : P ( const_cast<eT*>(X.colptr(0)), X.n_rows, (&(X.m) == &out), false )
|
Chris@49
|
559 , n_elem( X.n_elem )
|
Chris@49
|
560 //, X_ref ( X )
|
Chris@49
|
561 {
|
Chris@49
|
562 arma_extra_debug_sigprint();
|
Chris@49
|
563 }
|
Chris@49
|
564
|
Chris@49
|
565 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
|
Chris@49
|
566 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
|
Chris@49
|
567
|
Chris@49
|
568 static const bool P_is_vec = true;
|
Chris@49
|
569
|
Chris@49
|
570 const Col<eT> P;
|
Chris@49
|
571 const uword n_elem;
|
Chris@49
|
572
|
Chris@49
|
573 //const subview_col<eT>& X_ref; // prevents the compiler from potentially deleting X before we're done with it
|
Chris@49
|
574 };
|
Chris@49
|
575
|
Chris@49
|
576
|
Chris@49
|
577
|
Chris@49
|
578 //! @}
|