Chris@49
|
1 // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2013 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup Col
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 //! construct an empty column vector
|
Chris@49
|
14 template<typename eT>
|
Chris@49
|
15 inline
|
Chris@49
|
16 Col<eT>::Col()
|
Chris@49
|
17 : Mat<eT>(arma_vec_indicator(), 1)
|
Chris@49
|
18 {
|
Chris@49
|
19 arma_extra_debug_sigprint();
|
Chris@49
|
20 }
|
Chris@49
|
21
|
Chris@49
|
22
|
Chris@49
|
23
|
Chris@49
|
24 template<typename eT>
|
Chris@49
|
25 inline
|
Chris@49
|
26 Col<eT>::Col(const Col<eT>& X)
|
Chris@49
|
27 : Mat<eT>(arma_vec_indicator(), X.n_elem, 1, 1)
|
Chris@49
|
28 {
|
Chris@49
|
29 arma_extra_debug_sigprint();
|
Chris@49
|
30
|
Chris@49
|
31 arrayops::copy((*this).memptr(), X.memptr(), X.n_elem);
|
Chris@49
|
32 }
|
Chris@49
|
33
|
Chris@49
|
34
|
Chris@49
|
35
|
Chris@49
|
36 //! construct a column vector with the specified number of n_elem
|
Chris@49
|
37 template<typename eT>
|
Chris@49
|
38 inline
|
Chris@49
|
39 Col<eT>::Col(const uword in_n_elem)
|
Chris@49
|
40 : Mat<eT>(arma_vec_indicator(), in_n_elem, 1, 1)
|
Chris@49
|
41 {
|
Chris@49
|
42 arma_extra_debug_sigprint();
|
Chris@49
|
43 }
|
Chris@49
|
44
|
Chris@49
|
45
|
Chris@49
|
46
|
Chris@49
|
47 template<typename eT>
|
Chris@49
|
48 inline
|
Chris@49
|
49 Col<eT>::Col(const uword in_n_rows, const uword in_n_cols)
|
Chris@49
|
50 : Mat<eT>(arma_vec_indicator(), 0, 0, 1)
|
Chris@49
|
51 {
|
Chris@49
|
52 arma_extra_debug_sigprint();
|
Chris@49
|
53
|
Chris@49
|
54 Mat<eT>::init_warm(in_n_rows, in_n_cols);
|
Chris@49
|
55 }
|
Chris@49
|
56
|
Chris@49
|
57
|
Chris@49
|
58
|
Chris@49
|
59 //! construct a column vector from specified text
|
Chris@49
|
60 template<typename eT>
|
Chris@49
|
61 inline
|
Chris@49
|
62 Col<eT>::Col(const char* text)
|
Chris@49
|
63 {
|
Chris@49
|
64 arma_extra_debug_sigprint();
|
Chris@49
|
65
|
Chris@49
|
66 access::rw(Mat<eT>::vec_state) = 2;
|
Chris@49
|
67
|
Chris@49
|
68 Mat<eT>::operator=(text);
|
Chris@49
|
69
|
Chris@49
|
70 std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );
|
Chris@49
|
71
|
Chris@49
|
72 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
73 }
|
Chris@49
|
74
|
Chris@49
|
75
|
Chris@49
|
76
|
Chris@49
|
77 //! construct a column vector from specified text
|
Chris@49
|
78 template<typename eT>
|
Chris@49
|
79 inline
|
Chris@49
|
80 const Col<eT>&
|
Chris@49
|
81 Col<eT>::operator=(const char* text)
|
Chris@49
|
82 {
|
Chris@49
|
83 arma_extra_debug_sigprint();
|
Chris@49
|
84
|
Chris@49
|
85 access::rw(Mat<eT>::vec_state) = 2;
|
Chris@49
|
86
|
Chris@49
|
87 Mat<eT>::operator=(text);
|
Chris@49
|
88
|
Chris@49
|
89 std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );
|
Chris@49
|
90
|
Chris@49
|
91 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
92
|
Chris@49
|
93 return *this;
|
Chris@49
|
94 }
|
Chris@49
|
95
|
Chris@49
|
96
|
Chris@49
|
97
|
Chris@49
|
98 //! construct a column vector from specified text
|
Chris@49
|
99 template<typename eT>
|
Chris@49
|
100 inline
|
Chris@49
|
101 Col<eT>::Col(const std::string& text)
|
Chris@49
|
102 {
|
Chris@49
|
103 arma_extra_debug_sigprint();
|
Chris@49
|
104
|
Chris@49
|
105 access::rw(Mat<eT>::vec_state) = 2;
|
Chris@49
|
106
|
Chris@49
|
107 Mat<eT>::operator=(text);
|
Chris@49
|
108
|
Chris@49
|
109 std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );
|
Chris@49
|
110
|
Chris@49
|
111 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
112 }
|
Chris@49
|
113
|
Chris@49
|
114
|
Chris@49
|
115
|
Chris@49
|
116 //! construct a column vector from specified text
|
Chris@49
|
117 template<typename eT>
|
Chris@49
|
118 inline
|
Chris@49
|
119 const Col<eT>&
|
Chris@49
|
120 Col<eT>::operator=(const std::string& text)
|
Chris@49
|
121 {
|
Chris@49
|
122 arma_extra_debug_sigprint();
|
Chris@49
|
123
|
Chris@49
|
124 access::rw(Mat<eT>::vec_state) = 2;
|
Chris@49
|
125
|
Chris@49
|
126 Mat<eT>::operator=(text);
|
Chris@49
|
127
|
Chris@49
|
128 std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );
|
Chris@49
|
129
|
Chris@49
|
130 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
131
|
Chris@49
|
132 return *this;
|
Chris@49
|
133 }
|
Chris@49
|
134
|
Chris@49
|
135
|
Chris@49
|
136
|
Chris@49
|
137 //! create a column vector from std::vector
|
Chris@49
|
138 template<typename eT>
|
Chris@49
|
139 inline
|
Chris@49
|
140 Col<eT>::Col(const std::vector<eT>& x)
|
Chris@49
|
141 : Mat<eT>(arma_vec_indicator(), uword(x.size()), 1, 1)
|
Chris@49
|
142 {
|
Chris@49
|
143 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
144
|
Chris@49
|
145 if(x.size() > 0)
|
Chris@49
|
146 {
|
Chris@49
|
147 arrayops::copy( Mat<eT>::memptr(), &(x[0]), uword(x.size()) );
|
Chris@49
|
148 }
|
Chris@49
|
149 }
|
Chris@49
|
150
|
Chris@49
|
151
|
Chris@49
|
152
|
Chris@49
|
153 //! create a column vector from std::vector
|
Chris@49
|
154 template<typename eT>
|
Chris@49
|
155 inline
|
Chris@49
|
156 const Col<eT>&
|
Chris@49
|
157 Col<eT>::operator=(const std::vector<eT>& x)
|
Chris@49
|
158 {
|
Chris@49
|
159 arma_extra_debug_sigprint();
|
Chris@49
|
160
|
Chris@49
|
161 Mat<eT>::init_warm(uword(x.size()), 1);
|
Chris@49
|
162
|
Chris@49
|
163 if(x.size() > 0)
|
Chris@49
|
164 {
|
Chris@49
|
165 arrayops::copy( Mat<eT>::memptr(), &(x[0]), uword(x.size()) );
|
Chris@49
|
166 }
|
Chris@49
|
167
|
Chris@49
|
168 return *this;
|
Chris@49
|
169 }
|
Chris@49
|
170
|
Chris@49
|
171
|
Chris@49
|
172
|
Chris@49
|
173 #if defined(ARMA_USE_CXX11)
|
Chris@49
|
174
|
Chris@49
|
175 template<typename eT>
|
Chris@49
|
176 inline
|
Chris@49
|
177 Col<eT>::Col(const std::initializer_list<eT>& list)
|
Chris@49
|
178 {
|
Chris@49
|
179 arma_extra_debug_sigprint();
|
Chris@49
|
180
|
Chris@49
|
181 access::rw(Mat<eT>::vec_state) = 2;
|
Chris@49
|
182
|
Chris@49
|
183 Mat<eT>::operator=(list);
|
Chris@49
|
184
|
Chris@49
|
185 std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );
|
Chris@49
|
186
|
Chris@49
|
187 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
188 }
|
Chris@49
|
189
|
Chris@49
|
190
|
Chris@49
|
191
|
Chris@49
|
192 template<typename eT>
|
Chris@49
|
193 inline
|
Chris@49
|
194 const Col<eT>&
|
Chris@49
|
195 Col<eT>::operator=(const std::initializer_list<eT>& list)
|
Chris@49
|
196 {
|
Chris@49
|
197 arma_extra_debug_sigprint();
|
Chris@49
|
198
|
Chris@49
|
199 access::rw(Mat<eT>::vec_state) = 2;
|
Chris@49
|
200
|
Chris@49
|
201 Mat<eT>::operator=(list);
|
Chris@49
|
202
|
Chris@49
|
203 std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );
|
Chris@49
|
204
|
Chris@49
|
205 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
206
|
Chris@49
|
207 return *this;
|
Chris@49
|
208 }
|
Chris@49
|
209
|
Chris@49
|
210 #endif
|
Chris@49
|
211
|
Chris@49
|
212
|
Chris@49
|
213
|
Chris@49
|
214 template<typename eT>
|
Chris@49
|
215 inline
|
Chris@49
|
216 Col<eT>::Col(const SpCol<eT>& X)
|
Chris@49
|
217 : Mat<eT>(arma_vec_indicator(), X.n_elem, 1, 1)
|
Chris@49
|
218 {
|
Chris@49
|
219 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
220
|
Chris@49
|
221 arrayops::inplace_set(Mat<eT>::memptr(), eT(0), X.n_elem);
|
Chris@49
|
222
|
Chris@49
|
223 for(typename SpCol<eT>::const_iterator it = X.begin(); it != X.end(); ++it)
|
Chris@49
|
224 at(it.row()) = (*it);
|
Chris@49
|
225 }
|
Chris@49
|
226
|
Chris@49
|
227
|
Chris@49
|
228
|
Chris@49
|
229 template<typename eT>
|
Chris@49
|
230 inline
|
Chris@49
|
231 const Col<eT>&
|
Chris@49
|
232 Col<eT>::operator=(const eT val)
|
Chris@49
|
233 {
|
Chris@49
|
234 arma_extra_debug_sigprint();
|
Chris@49
|
235
|
Chris@49
|
236 Mat<eT>::operator=(val);
|
Chris@49
|
237
|
Chris@49
|
238 return *this;
|
Chris@49
|
239 }
|
Chris@49
|
240
|
Chris@49
|
241
|
Chris@49
|
242
|
Chris@49
|
243 template<typename eT>
|
Chris@49
|
244 template<typename T1>
|
Chris@49
|
245 inline
|
Chris@49
|
246 Col<eT>::Col(const Base<eT,T1>& X)
|
Chris@49
|
247 : Mat<eT>(arma_vec_indicator(), 1)
|
Chris@49
|
248 {
|
Chris@49
|
249 arma_extra_debug_sigprint();
|
Chris@49
|
250
|
Chris@49
|
251 Mat<eT>::operator=(X.get_ref());
|
Chris@49
|
252 }
|
Chris@49
|
253
|
Chris@49
|
254
|
Chris@49
|
255
|
Chris@49
|
256 template<typename eT>
|
Chris@49
|
257 template<typename T1>
|
Chris@49
|
258 inline
|
Chris@49
|
259 const Col<eT>&
|
Chris@49
|
260 Col<eT>::operator=(const Base<eT,T1>& X)
|
Chris@49
|
261 {
|
Chris@49
|
262 arma_extra_debug_sigprint();
|
Chris@49
|
263
|
Chris@49
|
264 Mat<eT>::operator=(X.get_ref());
|
Chris@49
|
265
|
Chris@49
|
266 return *this;
|
Chris@49
|
267 }
|
Chris@49
|
268
|
Chris@49
|
269
|
Chris@49
|
270
|
Chris@49
|
271 //! construct a column vector from a given auxiliary array of eTs
|
Chris@49
|
272 template<typename eT>
|
Chris@49
|
273 inline
|
Chris@49
|
274 Col<eT>::Col(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict)
|
Chris@49
|
275 : Mat<eT>(aux_mem, aux_length, 1, copy_aux_mem, strict)
|
Chris@49
|
276 {
|
Chris@49
|
277 arma_extra_debug_sigprint();
|
Chris@49
|
278
|
Chris@49
|
279 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
280 }
|
Chris@49
|
281
|
Chris@49
|
282
|
Chris@49
|
283
|
Chris@49
|
284 //! construct a column vector from a given auxiliary array of eTs
|
Chris@49
|
285 template<typename eT>
|
Chris@49
|
286 inline
|
Chris@49
|
287 Col<eT>::Col(const eT* aux_mem, const uword aux_length)
|
Chris@49
|
288 : Mat<eT>(aux_mem, aux_length, 1)
|
Chris@49
|
289 {
|
Chris@49
|
290 arma_extra_debug_sigprint();
|
Chris@49
|
291
|
Chris@49
|
292 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
293 }
|
Chris@49
|
294
|
Chris@49
|
295
|
Chris@49
|
296
|
Chris@49
|
297 template<typename eT>
|
Chris@49
|
298 template<typename T1, typename T2>
|
Chris@49
|
299 inline
|
Chris@49
|
300 Col<eT>::Col
|
Chris@49
|
301 (
|
Chris@49
|
302 const Base<typename Col<eT>::pod_type, T1>& A,
|
Chris@49
|
303 const Base<typename Col<eT>::pod_type, T2>& B
|
Chris@49
|
304 )
|
Chris@49
|
305 {
|
Chris@49
|
306 arma_extra_debug_sigprint();
|
Chris@49
|
307
|
Chris@49
|
308 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
309
|
Chris@49
|
310 Mat<eT>::init(A,B);
|
Chris@49
|
311 }
|
Chris@49
|
312
|
Chris@49
|
313
|
Chris@49
|
314
|
Chris@49
|
315 template<typename eT>
|
Chris@49
|
316 template<typename T1>
|
Chris@49
|
317 inline
|
Chris@49
|
318 Col<eT>::Col(const BaseCube<eT,T1>& X)
|
Chris@49
|
319 {
|
Chris@49
|
320 arma_extra_debug_sigprint();
|
Chris@49
|
321
|
Chris@49
|
322 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
323
|
Chris@49
|
324 Mat<eT>::operator=(X);
|
Chris@49
|
325 }
|
Chris@49
|
326
|
Chris@49
|
327
|
Chris@49
|
328
|
Chris@49
|
329 template<typename eT>
|
Chris@49
|
330 template<typename T1>
|
Chris@49
|
331 inline
|
Chris@49
|
332 const Col<eT>&
|
Chris@49
|
333 Col<eT>::operator=(const BaseCube<eT,T1>& X)
|
Chris@49
|
334 {
|
Chris@49
|
335 arma_extra_debug_sigprint();
|
Chris@49
|
336
|
Chris@49
|
337 Mat<eT>::operator=(X);
|
Chris@49
|
338
|
Chris@49
|
339 return *this;
|
Chris@49
|
340 }
|
Chris@49
|
341
|
Chris@49
|
342
|
Chris@49
|
343
|
Chris@49
|
344 template<typename eT>
|
Chris@49
|
345 inline
|
Chris@49
|
346 Col<eT>::Col(const subview_cube<eT>& X)
|
Chris@49
|
347 {
|
Chris@49
|
348 arma_extra_debug_sigprint();
|
Chris@49
|
349
|
Chris@49
|
350 access::rw(Mat<eT>::vec_state) = 1;
|
Chris@49
|
351
|
Chris@49
|
352 Mat<eT>::operator=(X);
|
Chris@49
|
353 }
|
Chris@49
|
354
|
Chris@49
|
355
|
Chris@49
|
356
|
Chris@49
|
357 template<typename eT>
|
Chris@49
|
358 inline
|
Chris@49
|
359 const Col<eT>&
|
Chris@49
|
360 Col<eT>::operator=(const subview_cube<eT>& X)
|
Chris@49
|
361 {
|
Chris@49
|
362 arma_extra_debug_sigprint();
|
Chris@49
|
363
|
Chris@49
|
364 Mat<eT>::operator=(X);
|
Chris@49
|
365
|
Chris@49
|
366 return *this;
|
Chris@49
|
367 }
|
Chris@49
|
368
|
Chris@49
|
369
|
Chris@49
|
370
|
Chris@49
|
371 template<typename eT>
|
Chris@49
|
372 inline
|
Chris@49
|
373 mat_injector< Col<eT> >
|
Chris@49
|
374 Col<eT>::operator<<(const eT val)
|
Chris@49
|
375 {
|
Chris@49
|
376 return mat_injector< Col<eT> >(*this, val);
|
Chris@49
|
377 }
|
Chris@49
|
378
|
Chris@49
|
379
|
Chris@49
|
380
|
Chris@49
|
381 template<typename eT>
|
Chris@49
|
382 arma_inline
|
Chris@49
|
383 const Op<Col<eT>,op_htrans>
|
Chris@49
|
384 Col<eT>::t() const
|
Chris@49
|
385 {
|
Chris@49
|
386 return Op<Col<eT>,op_htrans>(*this);
|
Chris@49
|
387 }
|
Chris@49
|
388
|
Chris@49
|
389
|
Chris@49
|
390
|
Chris@49
|
391 template<typename eT>
|
Chris@49
|
392 arma_inline
|
Chris@49
|
393 const Op<Col<eT>,op_htrans>
|
Chris@49
|
394 Col<eT>::ht() const
|
Chris@49
|
395 {
|
Chris@49
|
396 return Op<Col<eT>,op_htrans>(*this);
|
Chris@49
|
397 }
|
Chris@49
|
398
|
Chris@49
|
399
|
Chris@49
|
400
|
Chris@49
|
401 template<typename eT>
|
Chris@49
|
402 arma_inline
|
Chris@49
|
403 const Op<Col<eT>,op_strans>
|
Chris@49
|
404 Col<eT>::st() const
|
Chris@49
|
405 {
|
Chris@49
|
406 return Op<Col<eT>,op_strans>(*this);
|
Chris@49
|
407 }
|
Chris@49
|
408
|
Chris@49
|
409
|
Chris@49
|
410
|
Chris@49
|
411 template<typename eT>
|
Chris@49
|
412 arma_inline
|
Chris@49
|
413 eT&
|
Chris@49
|
414 Col<eT>::row(const uword row_num)
|
Chris@49
|
415 {
|
Chris@49
|
416 arma_debug_check( (row_num >= Mat<eT>::n_rows), "Col::row(): index out of bounds" );
|
Chris@49
|
417
|
Chris@49
|
418 return access::rw(Mat<eT>::mem[row_num]);
|
Chris@49
|
419 }
|
Chris@49
|
420
|
Chris@49
|
421
|
Chris@49
|
422
|
Chris@49
|
423 template<typename eT>
|
Chris@49
|
424 arma_inline
|
Chris@49
|
425 eT
|
Chris@49
|
426 Col<eT>::row(const uword row_num) const
|
Chris@49
|
427 {
|
Chris@49
|
428 arma_debug_check( (row_num >= Mat<eT>::n_rows), "Col::row(): index out of bounds" );
|
Chris@49
|
429
|
Chris@49
|
430 return Mat<eT>::mem[row_num];
|
Chris@49
|
431 }
|
Chris@49
|
432
|
Chris@49
|
433
|
Chris@49
|
434
|
Chris@49
|
435 template<typename eT>
|
Chris@49
|
436 arma_inline
|
Chris@49
|
437 subview_col<eT>
|
Chris@49
|
438 Col<eT>::rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
439 {
|
Chris@49
|
440 arma_extra_debug_sigprint();
|
Chris@49
|
441
|
Chris@49
|
442 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used");
|
Chris@49
|
443
|
Chris@49
|
444 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
445
|
Chris@49
|
446 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
447 }
|
Chris@49
|
448
|
Chris@49
|
449
|
Chris@49
|
450
|
Chris@49
|
451 template<typename eT>
|
Chris@49
|
452 arma_inline
|
Chris@49
|
453 const subview_col<eT>
|
Chris@49
|
454 Col<eT>::rows(const uword in_row1, const uword in_row2) const
|
Chris@49
|
455 {
|
Chris@49
|
456 arma_extra_debug_sigprint();
|
Chris@49
|
457
|
Chris@49
|
458 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used");
|
Chris@49
|
459
|
Chris@49
|
460 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
461
|
Chris@49
|
462 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
463 }
|
Chris@49
|
464
|
Chris@49
|
465
|
Chris@49
|
466
|
Chris@49
|
467 template<typename eT>
|
Chris@49
|
468 arma_inline
|
Chris@49
|
469 subview_col<eT>
|
Chris@49
|
470 Col<eT>::subvec(const uword in_row1, const uword in_row2)
|
Chris@49
|
471 {
|
Chris@49
|
472 arma_extra_debug_sigprint();
|
Chris@49
|
473
|
Chris@49
|
474 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
475
|
Chris@49
|
476 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
477
|
Chris@49
|
478 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
479 }
|
Chris@49
|
480
|
Chris@49
|
481
|
Chris@49
|
482
|
Chris@49
|
483 template<typename eT>
|
Chris@49
|
484 arma_inline
|
Chris@49
|
485 const subview_col<eT>
|
Chris@49
|
486 Col<eT>::subvec(const uword in_row1, const uword in_row2) const
|
Chris@49
|
487 {
|
Chris@49
|
488 arma_extra_debug_sigprint();
|
Chris@49
|
489
|
Chris@49
|
490 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
491
|
Chris@49
|
492 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
493
|
Chris@49
|
494 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
495 }
|
Chris@49
|
496
|
Chris@49
|
497
|
Chris@49
|
498
|
Chris@49
|
499 template<typename eT>
|
Chris@49
|
500 arma_inline
|
Chris@49
|
501 subview_col<eT>
|
Chris@49
|
502 Col<eT>::subvec(const span& row_span)
|
Chris@49
|
503 {
|
Chris@49
|
504 arma_extra_debug_sigprint();
|
Chris@49
|
505
|
Chris@49
|
506 const bool row_all = row_span.whole;
|
Chris@49
|
507
|
Chris@49
|
508 const uword local_n_rows = Mat<eT>::n_rows;
|
Chris@49
|
509
|
Chris@49
|
510 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
511 const uword in_row2 = row_span.b;
|
Chris@49
|
512 const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
513
|
Chris@49
|
514 arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
515
|
Chris@49
|
516 return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);
|
Chris@49
|
517 }
|
Chris@49
|
518
|
Chris@49
|
519
|
Chris@49
|
520
|
Chris@49
|
521 template<typename eT>
|
Chris@49
|
522 arma_inline
|
Chris@49
|
523 const subview_col<eT>
|
Chris@49
|
524 Col<eT>::subvec(const span& row_span) const
|
Chris@49
|
525 {
|
Chris@49
|
526 arma_extra_debug_sigprint();
|
Chris@49
|
527
|
Chris@49
|
528 const bool row_all = row_span.whole;
|
Chris@49
|
529
|
Chris@49
|
530 const uword local_n_rows = Mat<eT>::n_rows;
|
Chris@49
|
531
|
Chris@49
|
532 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
533 const uword in_row2 = row_span.b;
|
Chris@49
|
534 const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
535
|
Chris@49
|
536 arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
537
|
Chris@49
|
538 return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);
|
Chris@49
|
539 }
|
Chris@49
|
540
|
Chris@49
|
541
|
Chris@49
|
542
|
Chris@49
|
543 template<typename eT>
|
Chris@49
|
544 arma_inline
|
Chris@49
|
545 subview_col<eT>
|
Chris@49
|
546 Col<eT>::operator()(const span& row_span)
|
Chris@49
|
547 {
|
Chris@49
|
548 arma_extra_debug_sigprint();
|
Chris@49
|
549
|
Chris@49
|
550 return subvec(row_span);
|
Chris@49
|
551 }
|
Chris@49
|
552
|
Chris@49
|
553
|
Chris@49
|
554
|
Chris@49
|
555 template<typename eT>
|
Chris@49
|
556 arma_inline
|
Chris@49
|
557 const subview_col<eT>
|
Chris@49
|
558 Col<eT>::operator()(const span& row_span) const
|
Chris@49
|
559 {
|
Chris@49
|
560 arma_extra_debug_sigprint();
|
Chris@49
|
561
|
Chris@49
|
562 return subvec(row_span);
|
Chris@49
|
563 }
|
Chris@49
|
564
|
Chris@49
|
565
|
Chris@49
|
566
|
Chris@49
|
567 //! remove specified row
|
Chris@49
|
568 template<typename eT>
|
Chris@49
|
569 inline
|
Chris@49
|
570 void
|
Chris@49
|
571 Col<eT>::shed_row(const uword row_num)
|
Chris@49
|
572 {
|
Chris@49
|
573 arma_extra_debug_sigprint();
|
Chris@49
|
574
|
Chris@49
|
575 arma_debug_check( row_num >= Mat<eT>::n_rows, "Col::shed_row(): index out of bounds");
|
Chris@49
|
576
|
Chris@49
|
577 shed_rows(row_num, row_num);
|
Chris@49
|
578 }
|
Chris@49
|
579
|
Chris@49
|
580
|
Chris@49
|
581
|
Chris@49
|
582 //! remove specified rows
|
Chris@49
|
583 template<typename eT>
|
Chris@49
|
584 inline
|
Chris@49
|
585 void
|
Chris@49
|
586 Col<eT>::shed_rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
587 {
|
Chris@49
|
588 arma_extra_debug_sigprint();
|
Chris@49
|
589
|
Chris@49
|
590 arma_debug_check
|
Chris@49
|
591 (
|
Chris@49
|
592 (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows),
|
Chris@49
|
593 "Col::shed_rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
594 );
|
Chris@49
|
595
|
Chris@49
|
596 const uword n_keep_front = in_row1;
|
Chris@49
|
597 const uword n_keep_back = Mat<eT>::n_rows - (in_row2 + 1);
|
Chris@49
|
598
|
Chris@49
|
599 Col<eT> X(n_keep_front + n_keep_back);
|
Chris@49
|
600
|
Chris@49
|
601 eT* X_mem = X.memptr();
|
Chris@49
|
602 const eT* t_mem = (*this).memptr();
|
Chris@49
|
603
|
Chris@49
|
604 if(n_keep_front > 0)
|
Chris@49
|
605 {
|
Chris@49
|
606 arrayops::copy( X_mem, t_mem, n_keep_front );
|
Chris@49
|
607 }
|
Chris@49
|
608
|
Chris@49
|
609 if(n_keep_back > 0)
|
Chris@49
|
610 {
|
Chris@49
|
611 arrayops::copy( &(X_mem[n_keep_front]), &(t_mem[in_row2+1]), n_keep_back);
|
Chris@49
|
612 }
|
Chris@49
|
613
|
Chris@49
|
614 Mat<eT>::steal_mem(X);
|
Chris@49
|
615 }
|
Chris@49
|
616
|
Chris@49
|
617
|
Chris@49
|
618
|
Chris@49
|
619 //! insert N rows at the specified row position,
|
Chris@49
|
620 //! optionally setting the elements of the inserted rows to zero
|
Chris@49
|
621 template<typename eT>
|
Chris@49
|
622 inline
|
Chris@49
|
623 void
|
Chris@49
|
624 Col<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)
|
Chris@49
|
625 {
|
Chris@49
|
626 arma_extra_debug_sigprint();
|
Chris@49
|
627
|
Chris@49
|
628 const uword t_n_rows = Mat<eT>::n_rows;
|
Chris@49
|
629
|
Chris@49
|
630 const uword A_n_rows = row_num;
|
Chris@49
|
631 const uword B_n_rows = t_n_rows - row_num;
|
Chris@49
|
632
|
Chris@49
|
633 // insertion at row_num == n_rows is in effect an append operation
|
Chris@49
|
634 arma_debug_check( (row_num > t_n_rows), "Col::insert_rows(): index out of bounds");
|
Chris@49
|
635
|
Chris@49
|
636 if(N > 0)
|
Chris@49
|
637 {
|
Chris@49
|
638 Col<eT> out(t_n_rows + N);
|
Chris@49
|
639
|
Chris@49
|
640 eT* out_mem = out.memptr();
|
Chris@49
|
641 const eT* t_mem = (*this).memptr();
|
Chris@49
|
642
|
Chris@49
|
643 if(A_n_rows > 0)
|
Chris@49
|
644 {
|
Chris@49
|
645 arrayops::copy( out_mem, t_mem, A_n_rows );
|
Chris@49
|
646 }
|
Chris@49
|
647
|
Chris@49
|
648 if(B_n_rows > 0)
|
Chris@49
|
649 {
|
Chris@49
|
650 arrayops::copy( &(out_mem[row_num + N]), &(t_mem[row_num]), B_n_rows );
|
Chris@49
|
651 }
|
Chris@49
|
652
|
Chris@49
|
653 if(set_to_zero == true)
|
Chris@49
|
654 {
|
Chris@49
|
655 arrayops::inplace_set( &(out_mem[row_num]), eT(0), N );
|
Chris@49
|
656 }
|
Chris@49
|
657
|
Chris@49
|
658 Mat<eT>::steal_mem(out);
|
Chris@49
|
659 }
|
Chris@49
|
660 }
|
Chris@49
|
661
|
Chris@49
|
662
|
Chris@49
|
663
|
Chris@49
|
664 //! insert the given object at the specified row position;
|
Chris@49
|
665 //! the given object must have one column
|
Chris@49
|
666 template<typename eT>
|
Chris@49
|
667 template<typename T1>
|
Chris@49
|
668 inline
|
Chris@49
|
669 void
|
Chris@49
|
670 Col<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)
|
Chris@49
|
671 {
|
Chris@49
|
672 arma_extra_debug_sigprint();
|
Chris@49
|
673
|
Chris@49
|
674 Mat<eT>::insert_rows(row_num, X);
|
Chris@49
|
675 }
|
Chris@49
|
676
|
Chris@49
|
677
|
Chris@49
|
678
|
Chris@49
|
679 template<typename eT>
|
Chris@49
|
680 arma_inline
|
Chris@49
|
681 arma_warn_unused
|
Chris@49
|
682 eT&
|
Chris@49
|
683 Col<eT>::at(const uword i)
|
Chris@49
|
684 {
|
Chris@49
|
685 return access::rw(Mat<eT>::mem[i]);
|
Chris@49
|
686 }
|
Chris@49
|
687
|
Chris@49
|
688
|
Chris@49
|
689
|
Chris@49
|
690 template<typename eT>
|
Chris@49
|
691 arma_inline
|
Chris@49
|
692 arma_warn_unused
|
Chris@49
|
693 const eT&
|
Chris@49
|
694 Col<eT>::at(const uword i) const
|
Chris@49
|
695 {
|
Chris@49
|
696 return Mat<eT>::mem[i];
|
Chris@49
|
697 }
|
Chris@49
|
698
|
Chris@49
|
699
|
Chris@49
|
700
|
Chris@49
|
701 template<typename eT>
|
Chris@49
|
702 arma_inline
|
Chris@49
|
703 arma_warn_unused
|
Chris@49
|
704 eT&
|
Chris@49
|
705 Col<eT>::at(const uword in_row, const uword)
|
Chris@49
|
706 {
|
Chris@49
|
707 return access::rw( Mat<eT>::mem[in_row] );
|
Chris@49
|
708 }
|
Chris@49
|
709
|
Chris@49
|
710
|
Chris@49
|
711
|
Chris@49
|
712 template<typename eT>
|
Chris@49
|
713 arma_inline
|
Chris@49
|
714 arma_warn_unused
|
Chris@49
|
715 const eT&
|
Chris@49
|
716 Col<eT>::at(const uword in_row, const uword) const
|
Chris@49
|
717 {
|
Chris@49
|
718 return Mat<eT>::mem[in_row];
|
Chris@49
|
719 }
|
Chris@49
|
720
|
Chris@49
|
721
|
Chris@49
|
722
|
Chris@49
|
723 template<typename eT>
|
Chris@49
|
724 inline
|
Chris@49
|
725 typename Col<eT>::row_iterator
|
Chris@49
|
726 Col<eT>::begin_row(const uword row_num)
|
Chris@49
|
727 {
|
Chris@49
|
728 arma_extra_debug_sigprint();
|
Chris@49
|
729
|
Chris@49
|
730 arma_debug_check( (row_num >= Mat<eT>::n_rows), "begin_row(): index out of bounds");
|
Chris@49
|
731
|
Chris@49
|
732 return Mat<eT>::memptr() + row_num;
|
Chris@49
|
733 }
|
Chris@49
|
734
|
Chris@49
|
735
|
Chris@49
|
736
|
Chris@49
|
737 template<typename eT>
|
Chris@49
|
738 inline
|
Chris@49
|
739 typename Col<eT>::const_row_iterator
|
Chris@49
|
740 Col<eT>::begin_row(const uword row_num) const
|
Chris@49
|
741 {
|
Chris@49
|
742 arma_extra_debug_sigprint();
|
Chris@49
|
743
|
Chris@49
|
744 arma_debug_check( (row_num >= Mat<eT>::n_rows), "begin_row(): index out of bounds");
|
Chris@49
|
745
|
Chris@49
|
746 return Mat<eT>::memptr() + row_num;
|
Chris@49
|
747 }
|
Chris@49
|
748
|
Chris@49
|
749
|
Chris@49
|
750
|
Chris@49
|
751 template<typename eT>
|
Chris@49
|
752 inline
|
Chris@49
|
753 typename Col<eT>::row_iterator
|
Chris@49
|
754 Col<eT>::end_row(const uword row_num)
|
Chris@49
|
755 {
|
Chris@49
|
756 arma_extra_debug_sigprint();
|
Chris@49
|
757
|
Chris@49
|
758 arma_debug_check( (row_num >= Mat<eT>::n_rows), "end_row(): index out of bounds");
|
Chris@49
|
759
|
Chris@49
|
760 return Mat<eT>::memptr() + row_num + 1;
|
Chris@49
|
761 }
|
Chris@49
|
762
|
Chris@49
|
763
|
Chris@49
|
764
|
Chris@49
|
765 template<typename eT>
|
Chris@49
|
766 inline
|
Chris@49
|
767 typename Col<eT>::const_row_iterator
|
Chris@49
|
768 Col<eT>::end_row(const uword row_num) const
|
Chris@49
|
769 {
|
Chris@49
|
770 arma_extra_debug_sigprint();
|
Chris@49
|
771
|
Chris@49
|
772 arma_debug_check( (row_num >= Mat<eT>::n_rows), "end_row(): index out of bounds");
|
Chris@49
|
773
|
Chris@49
|
774 return Mat<eT>::memptr() + row_num + 1;
|
Chris@49
|
775 }
|
Chris@49
|
776
|
Chris@49
|
777
|
Chris@49
|
778
|
Chris@49
|
779 template<typename eT>
|
Chris@49
|
780 template<uword fixed_n_elem>
|
Chris@49
|
781 arma_inline
|
Chris@49
|
782 void
|
Chris@49
|
783 Col<eT>::fixed<fixed_n_elem>::change_to_row()
|
Chris@49
|
784 {
|
Chris@49
|
785 arma_extra_debug_sigprint();
|
Chris@49
|
786
|
Chris@49
|
787 access::rw(Mat<eT>::n_cols) = fixed_n_elem;
|
Chris@49
|
788 access::rw(Mat<eT>::n_rows) = 1;
|
Chris@49
|
789 }
|
Chris@49
|
790
|
Chris@49
|
791
|
Chris@49
|
792
|
Chris@49
|
793 template<typename eT>
|
Chris@49
|
794 template<uword fixed_n_elem>
|
Chris@49
|
795 arma_inline
|
Chris@49
|
796 Col<eT>::fixed<fixed_n_elem>::fixed()
|
Chris@49
|
797 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
798 {
|
Chris@49
|
799 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
800 }
|
Chris@49
|
801
|
Chris@49
|
802
|
Chris@49
|
803
|
Chris@49
|
804 template<typename eT>
|
Chris@49
|
805 template<uword fixed_n_elem>
|
Chris@49
|
806 arma_inline
|
Chris@49
|
807 Col<eT>::fixed<fixed_n_elem>::fixed(const fixed<fixed_n_elem>& X)
|
Chris@49
|
808 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
809 {
|
Chris@49
|
810 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
811
|
Chris@49
|
812 eT* dest = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;
|
Chris@49
|
813
|
Chris@49
|
814 arrayops::copy( dest, X.mem, fixed_n_elem );
|
Chris@49
|
815 }
|
Chris@49
|
816
|
Chris@49
|
817
|
Chris@49
|
818
|
Chris@49
|
819 template<typename eT>
|
Chris@49
|
820 template<uword fixed_n_elem>
|
Chris@49
|
821 inline
|
Chris@49
|
822 Col<eT>::fixed<fixed_n_elem>::fixed(const subview_cube<eT>& X)
|
Chris@49
|
823 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
824 {
|
Chris@49
|
825 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
826
|
Chris@49
|
827 Col<eT>::operator=(X);
|
Chris@49
|
828 }
|
Chris@49
|
829
|
Chris@49
|
830
|
Chris@49
|
831
|
Chris@49
|
832 template<typename eT>
|
Chris@49
|
833 template<uword fixed_n_elem>
|
Chris@49
|
834 template<typename T1>
|
Chris@49
|
835 inline
|
Chris@49
|
836 Col<eT>::fixed<fixed_n_elem>::fixed(const Base<eT,T1>& A)
|
Chris@49
|
837 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
838 {
|
Chris@49
|
839 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
840
|
Chris@49
|
841 Col<eT>::operator=(A.get_ref());
|
Chris@49
|
842 }
|
Chris@49
|
843
|
Chris@49
|
844
|
Chris@49
|
845
|
Chris@49
|
846 template<typename eT>
|
Chris@49
|
847 template<uword fixed_n_elem>
|
Chris@49
|
848 template<typename T1, typename T2>
|
Chris@49
|
849 inline
|
Chris@49
|
850 Col<eT>::fixed<fixed_n_elem>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)
|
Chris@49
|
851 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
852 {
|
Chris@49
|
853 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
854
|
Chris@49
|
855 Col<eT>::init(A,B);
|
Chris@49
|
856 }
|
Chris@49
|
857
|
Chris@49
|
858
|
Chris@49
|
859
|
Chris@49
|
860 template<typename eT>
|
Chris@49
|
861 template<uword fixed_n_elem>
|
Chris@49
|
862 inline
|
Chris@49
|
863 Col<eT>::fixed<fixed_n_elem>::fixed(const eT* aux_mem)
|
Chris@49
|
864 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
865 {
|
Chris@49
|
866 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
867
|
Chris@49
|
868 eT* dest = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;
|
Chris@49
|
869
|
Chris@49
|
870 arrayops::copy( dest, aux_mem, fixed_n_elem );
|
Chris@49
|
871 }
|
Chris@49
|
872
|
Chris@49
|
873
|
Chris@49
|
874
|
Chris@49
|
875 //! NOTE: this function relies on
|
Chris@49
|
876 //! Col::operator=(text), to change vec_state as well as swapping n_rows and n_cols,
|
Chris@49
|
877 //! and Mat::init(), to check that the given vector will not have a different size than fixed_n_elem.
|
Chris@49
|
878 template<typename eT>
|
Chris@49
|
879 template<uword fixed_n_elem>
|
Chris@49
|
880 inline
|
Chris@49
|
881 Col<eT>::fixed<fixed_n_elem>::fixed(const char* text)
|
Chris@49
|
882 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
883 {
|
Chris@49
|
884 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
885
|
Chris@49
|
886 change_to_row();
|
Chris@49
|
887
|
Chris@49
|
888 Col<eT>::operator=(text);
|
Chris@49
|
889 }
|
Chris@49
|
890
|
Chris@49
|
891
|
Chris@49
|
892
|
Chris@49
|
893 //! NOTE: this function relies on
|
Chris@49
|
894 //! Col::operator=(text), to change vec_state as well as swapping n_rows and n_cols,
|
Chris@49
|
895 //! and Mat::init(), to check that the given vector will not have a different size than fixed_n_elem.
|
Chris@49
|
896 template<typename eT>
|
Chris@49
|
897 template<uword fixed_n_elem>
|
Chris@49
|
898 inline
|
Chris@49
|
899 Col<eT>::fixed<fixed_n_elem>::fixed(const std::string& text)
|
Chris@49
|
900 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
901 {
|
Chris@49
|
902 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
903
|
Chris@49
|
904 change_to_row();
|
Chris@49
|
905
|
Chris@49
|
906 Col<eT>::operator=(text);
|
Chris@49
|
907 }
|
Chris@49
|
908
|
Chris@49
|
909
|
Chris@49
|
910
|
Chris@49
|
911 template<typename eT>
|
Chris@49
|
912 template<uword fixed_n_elem>
|
Chris@49
|
913 template<typename T1>
|
Chris@49
|
914 const Col<eT>&
|
Chris@49
|
915 Col<eT>::fixed<fixed_n_elem>::operator=(const Base<eT,T1>& A)
|
Chris@49
|
916 {
|
Chris@49
|
917 arma_extra_debug_sigprint();
|
Chris@49
|
918
|
Chris@49
|
919 Col<eT>::operator=(A.get_ref());
|
Chris@49
|
920
|
Chris@49
|
921 return *this;
|
Chris@49
|
922 }
|
Chris@49
|
923
|
Chris@49
|
924
|
Chris@49
|
925
|
Chris@49
|
926 template<typename eT>
|
Chris@49
|
927 template<uword fixed_n_elem>
|
Chris@49
|
928 const Col<eT>&
|
Chris@49
|
929 Col<eT>::fixed<fixed_n_elem>::operator=(const eT val)
|
Chris@49
|
930 {
|
Chris@49
|
931 arma_extra_debug_sigprint();
|
Chris@49
|
932
|
Chris@49
|
933 Col<eT>::operator=(val);
|
Chris@49
|
934
|
Chris@49
|
935 return *this;
|
Chris@49
|
936 }
|
Chris@49
|
937
|
Chris@49
|
938
|
Chris@49
|
939
|
Chris@49
|
940 template<typename eT>
|
Chris@49
|
941 template<uword fixed_n_elem>
|
Chris@49
|
942 const Col<eT>&
|
Chris@49
|
943 Col<eT>::fixed<fixed_n_elem>::operator=(const char* text)
|
Chris@49
|
944 {
|
Chris@49
|
945 arma_extra_debug_sigprint();
|
Chris@49
|
946
|
Chris@49
|
947 change_to_row();
|
Chris@49
|
948
|
Chris@49
|
949 Col<eT>::operator=(text);
|
Chris@49
|
950
|
Chris@49
|
951 return *this;
|
Chris@49
|
952 }
|
Chris@49
|
953
|
Chris@49
|
954
|
Chris@49
|
955
|
Chris@49
|
956 template<typename eT>
|
Chris@49
|
957 template<uword fixed_n_elem>
|
Chris@49
|
958 const Col<eT>&
|
Chris@49
|
959 Col<eT>::fixed<fixed_n_elem>::operator=(const std::string& text)
|
Chris@49
|
960 {
|
Chris@49
|
961 arma_extra_debug_sigprint();
|
Chris@49
|
962
|
Chris@49
|
963 change_to_row();
|
Chris@49
|
964
|
Chris@49
|
965 Col<eT>::operator=(text);
|
Chris@49
|
966
|
Chris@49
|
967 return *this;
|
Chris@49
|
968 }
|
Chris@49
|
969
|
Chris@49
|
970
|
Chris@49
|
971
|
Chris@49
|
972 template<typename eT>
|
Chris@49
|
973 template<uword fixed_n_elem>
|
Chris@49
|
974 const Col<eT>&
|
Chris@49
|
975 Col<eT>::fixed<fixed_n_elem>::operator=(const subview_cube<eT>& X)
|
Chris@49
|
976 {
|
Chris@49
|
977 arma_extra_debug_sigprint();
|
Chris@49
|
978
|
Chris@49
|
979 Col<eT>::operator=(X);
|
Chris@49
|
980
|
Chris@49
|
981 return *this;
|
Chris@49
|
982 }
|
Chris@49
|
983
|
Chris@49
|
984
|
Chris@49
|
985
|
Chris@49
|
986 #if defined(ARMA_USE_CXX11)
|
Chris@49
|
987
|
Chris@49
|
988 template<typename eT>
|
Chris@49
|
989 template<uword fixed_n_elem>
|
Chris@49
|
990 inline
|
Chris@49
|
991 Col<eT>::fixed<fixed_n_elem>::fixed(const std::initializer_list<eT>& list)
|
Chris@49
|
992 : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )
|
Chris@49
|
993 {
|
Chris@49
|
994 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
995
|
Chris@49
|
996 (*this).operator=(list);
|
Chris@49
|
997 }
|
Chris@49
|
998
|
Chris@49
|
999
|
Chris@49
|
1000
|
Chris@49
|
1001 template<typename eT>
|
Chris@49
|
1002 template<uword fixed_n_elem>
|
Chris@49
|
1003 inline
|
Chris@49
|
1004 const Col<eT>&
|
Chris@49
|
1005 Col<eT>::fixed<fixed_n_elem>::operator=(const std::initializer_list<eT>& list)
|
Chris@49
|
1006 {
|
Chris@49
|
1007 arma_extra_debug_sigprint();
|
Chris@49
|
1008
|
Chris@49
|
1009 const uword N = list.size();
|
Chris@49
|
1010
|
Chris@49
|
1011 arma_debug_check( (N > fixed_n_elem), "Col::fixed: initialiser list is too long" );
|
Chris@49
|
1012
|
Chris@49
|
1013 eT* this_mem = (*this).memptr();
|
Chris@49
|
1014
|
Chris@49
|
1015 arrayops::copy( this_mem, list.begin(), N );
|
Chris@49
|
1016
|
Chris@49
|
1017 for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); }
|
Chris@49
|
1018
|
Chris@49
|
1019 return *this;
|
Chris@49
|
1020 }
|
Chris@49
|
1021
|
Chris@49
|
1022 #endif
|
Chris@49
|
1023
|
Chris@49
|
1024
|
Chris@49
|
1025
|
Chris@49
|
1026 template<typename eT>
|
Chris@49
|
1027 template<uword fixed_n_elem>
|
Chris@49
|
1028 arma_inline
|
Chris@49
|
1029 const Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >
|
Chris@49
|
1030 Col<eT>::fixed<fixed_n_elem>::t() const
|
Chris@49
|
1031 {
|
Chris@49
|
1032 return Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >(*this);
|
Chris@49
|
1033 }
|
Chris@49
|
1034
|
Chris@49
|
1035
|
Chris@49
|
1036
|
Chris@49
|
1037 template<typename eT>
|
Chris@49
|
1038 template<uword fixed_n_elem>
|
Chris@49
|
1039 arma_inline
|
Chris@49
|
1040 const Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >
|
Chris@49
|
1041 Col<eT>::fixed<fixed_n_elem>::ht() const
|
Chris@49
|
1042 {
|
Chris@49
|
1043 return Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >(*this);
|
Chris@49
|
1044 }
|
Chris@49
|
1045
|
Chris@49
|
1046
|
Chris@49
|
1047
|
Chris@49
|
1048 template<typename eT>
|
Chris@49
|
1049 template<uword fixed_n_elem>
|
Chris@49
|
1050 arma_inline
|
Chris@49
|
1051 const Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_strans >
|
Chris@49
|
1052 Col<eT>::fixed<fixed_n_elem>::st() const
|
Chris@49
|
1053 {
|
Chris@49
|
1054 return Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_strans >(*this);
|
Chris@49
|
1055 }
|
Chris@49
|
1056
|
Chris@49
|
1057
|
Chris@49
|
1058
|
Chris@49
|
1059 template<typename eT>
|
Chris@49
|
1060 template<uword fixed_n_elem>
|
Chris@49
|
1061 arma_inline
|
Chris@49
|
1062 arma_warn_unused
|
Chris@49
|
1063 const eT&
|
Chris@49
|
1064 Col<eT>::fixed<fixed_n_elem>::at_alt(const uword ii) const
|
Chris@49
|
1065 {
|
Chris@49
|
1066 #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)
|
Chris@49
|
1067
|
Chris@49
|
1068 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1069
|
Chris@49
|
1070 #else
|
Chris@49
|
1071 const eT* mem_aligned = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;
|
Chris@49
|
1072
|
Chris@49
|
1073 memory::mark_as_aligned(mem_aligned);
|
Chris@49
|
1074
|
Chris@49
|
1075 return mem_aligned[ii];
|
Chris@49
|
1076 #endif
|
Chris@49
|
1077 }
|
Chris@49
|
1078
|
Chris@49
|
1079
|
Chris@49
|
1080
|
Chris@49
|
1081 template<typename eT>
|
Chris@49
|
1082 template<uword fixed_n_elem>
|
Chris@49
|
1083 arma_inline
|
Chris@49
|
1084 arma_warn_unused
|
Chris@49
|
1085 eT&
|
Chris@49
|
1086 Col<eT>::fixed<fixed_n_elem>::operator[] (const uword ii)
|
Chris@49
|
1087 {
|
Chris@49
|
1088 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1089 }
|
Chris@49
|
1090
|
Chris@49
|
1091
|
Chris@49
|
1092
|
Chris@49
|
1093 template<typename eT>
|
Chris@49
|
1094 template<uword fixed_n_elem>
|
Chris@49
|
1095 arma_inline
|
Chris@49
|
1096 arma_warn_unused
|
Chris@49
|
1097 const eT&
|
Chris@49
|
1098 Col<eT>::fixed<fixed_n_elem>::operator[] (const uword ii) const
|
Chris@49
|
1099 {
|
Chris@49
|
1100 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1101 }
|
Chris@49
|
1102
|
Chris@49
|
1103
|
Chris@49
|
1104
|
Chris@49
|
1105 template<typename eT>
|
Chris@49
|
1106 template<uword fixed_n_elem>
|
Chris@49
|
1107 arma_inline
|
Chris@49
|
1108 arma_warn_unused
|
Chris@49
|
1109 eT&
|
Chris@49
|
1110 Col<eT>::fixed<fixed_n_elem>::at(const uword ii)
|
Chris@49
|
1111 {
|
Chris@49
|
1112 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1113 }
|
Chris@49
|
1114
|
Chris@49
|
1115
|
Chris@49
|
1116
|
Chris@49
|
1117 template<typename eT>
|
Chris@49
|
1118 template<uword fixed_n_elem>
|
Chris@49
|
1119 arma_inline
|
Chris@49
|
1120 arma_warn_unused
|
Chris@49
|
1121 const eT&
|
Chris@49
|
1122 Col<eT>::fixed<fixed_n_elem>::at(const uword ii) const
|
Chris@49
|
1123 {
|
Chris@49
|
1124 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1125 }
|
Chris@49
|
1126
|
Chris@49
|
1127
|
Chris@49
|
1128
|
Chris@49
|
1129 template<typename eT>
|
Chris@49
|
1130 template<uword fixed_n_elem>
|
Chris@49
|
1131 arma_inline
|
Chris@49
|
1132 arma_warn_unused
|
Chris@49
|
1133 eT&
|
Chris@49
|
1134 Col<eT>::fixed<fixed_n_elem>::operator() (const uword ii)
|
Chris@49
|
1135 {
|
Chris@49
|
1136 arma_debug_check( (ii >= fixed_n_elem), "Col::operator(): index out of bounds");
|
Chris@49
|
1137
|
Chris@49
|
1138 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1139 }
|
Chris@49
|
1140
|
Chris@49
|
1141
|
Chris@49
|
1142
|
Chris@49
|
1143 template<typename eT>
|
Chris@49
|
1144 template<uword fixed_n_elem>
|
Chris@49
|
1145 arma_inline
|
Chris@49
|
1146 arma_warn_unused
|
Chris@49
|
1147 const eT&
|
Chris@49
|
1148 Col<eT>::fixed<fixed_n_elem>::operator() (const uword ii) const
|
Chris@49
|
1149 {
|
Chris@49
|
1150 arma_debug_check( (ii >= fixed_n_elem), "Col::operator(): index out of bounds");
|
Chris@49
|
1151
|
Chris@49
|
1152 return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];
|
Chris@49
|
1153 }
|
Chris@49
|
1154
|
Chris@49
|
1155
|
Chris@49
|
1156
|
Chris@49
|
1157 template<typename eT>
|
Chris@49
|
1158 template<uword fixed_n_elem>
|
Chris@49
|
1159 arma_inline
|
Chris@49
|
1160 arma_warn_unused
|
Chris@49
|
1161 eT&
|
Chris@49
|
1162 Col<eT>::fixed<fixed_n_elem>::at(const uword in_row, const uword)
|
Chris@49
|
1163 {
|
Chris@49
|
1164 return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];
|
Chris@49
|
1165 }
|
Chris@49
|
1166
|
Chris@49
|
1167
|
Chris@49
|
1168
|
Chris@49
|
1169 template<typename eT>
|
Chris@49
|
1170 template<uword fixed_n_elem>
|
Chris@49
|
1171 arma_inline
|
Chris@49
|
1172 arma_warn_unused
|
Chris@49
|
1173 const eT&
|
Chris@49
|
1174 Col<eT>::fixed<fixed_n_elem>::at(const uword in_row, const uword) const
|
Chris@49
|
1175 {
|
Chris@49
|
1176 return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];
|
Chris@49
|
1177 }
|
Chris@49
|
1178
|
Chris@49
|
1179
|
Chris@49
|
1180
|
Chris@49
|
1181 template<typename eT>
|
Chris@49
|
1182 template<uword fixed_n_elem>
|
Chris@49
|
1183 arma_inline
|
Chris@49
|
1184 arma_warn_unused
|
Chris@49
|
1185 eT&
|
Chris@49
|
1186 Col<eT>::fixed<fixed_n_elem>::operator() (const uword in_row, const uword in_col)
|
Chris@49
|
1187 {
|
Chris@49
|
1188 arma_debug_check( ((in_row >= fixed_n_elem) || (in_col > 0)), "Col::operator(): index out of bounds" );
|
Chris@49
|
1189
|
Chris@49
|
1190 return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];
|
Chris@49
|
1191 }
|
Chris@49
|
1192
|
Chris@49
|
1193
|
Chris@49
|
1194
|
Chris@49
|
1195 template<typename eT>
|
Chris@49
|
1196 template<uword fixed_n_elem>
|
Chris@49
|
1197 arma_inline
|
Chris@49
|
1198 arma_warn_unused
|
Chris@49
|
1199 const eT&
|
Chris@49
|
1200 Col<eT>::fixed<fixed_n_elem>::operator() (const uword in_row, const uword in_col) const
|
Chris@49
|
1201 {
|
Chris@49
|
1202 arma_debug_check( ((in_row >= fixed_n_elem) || (in_col > 0)), "Col::operator(): index out of bounds" );
|
Chris@49
|
1203
|
Chris@49
|
1204 return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];
|
Chris@49
|
1205 }
|
Chris@49
|
1206
|
Chris@49
|
1207
|
Chris@49
|
1208
|
Chris@49
|
1209 template<typename eT>
|
Chris@49
|
1210 template<uword fixed_n_elem>
|
Chris@49
|
1211 arma_inline
|
Chris@49
|
1212 arma_warn_unused
|
Chris@49
|
1213 eT*
|
Chris@49
|
1214 Col<eT>::fixed<fixed_n_elem>::memptr()
|
Chris@49
|
1215 {
|
Chris@49
|
1216 return (use_extra) ? mem_local_extra : Mat<eT>::mem_local;
|
Chris@49
|
1217 }
|
Chris@49
|
1218
|
Chris@49
|
1219
|
Chris@49
|
1220
|
Chris@49
|
1221 template<typename eT>
|
Chris@49
|
1222 template<uword fixed_n_elem>
|
Chris@49
|
1223 arma_inline
|
Chris@49
|
1224 arma_warn_unused
|
Chris@49
|
1225 const eT*
|
Chris@49
|
1226 Col<eT>::fixed<fixed_n_elem>::memptr() const
|
Chris@49
|
1227 {
|
Chris@49
|
1228 return (use_extra) ? mem_local_extra : Mat<eT>::mem_local;
|
Chris@49
|
1229 }
|
Chris@49
|
1230
|
Chris@49
|
1231
|
Chris@49
|
1232
|
Chris@49
|
1233 template<typename eT>
|
Chris@49
|
1234 template<uword fixed_n_elem>
|
Chris@49
|
1235 arma_hot
|
Chris@49
|
1236 inline
|
Chris@49
|
1237 const Col<eT>&
|
Chris@49
|
1238 Col<eT>::fixed<fixed_n_elem>::fill(const eT val)
|
Chris@49
|
1239 {
|
Chris@49
|
1240 arma_extra_debug_sigprint();
|
Chris@49
|
1241
|
Chris@49
|
1242 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);
|
Chris@49
|
1243
|
Chris@49
|
1244 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, val );
|
Chris@49
|
1245
|
Chris@49
|
1246 return *this;
|
Chris@49
|
1247 }
|
Chris@49
|
1248
|
Chris@49
|
1249
|
Chris@49
|
1250
|
Chris@49
|
1251 template<typename eT>
|
Chris@49
|
1252 template<uword fixed_n_elem>
|
Chris@49
|
1253 arma_hot
|
Chris@49
|
1254 inline
|
Chris@49
|
1255 const Col<eT>&
|
Chris@49
|
1256 Col<eT>::fixed<fixed_n_elem>::zeros()
|
Chris@49
|
1257 {
|
Chris@49
|
1258 arma_extra_debug_sigprint();
|
Chris@49
|
1259
|
Chris@49
|
1260 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);
|
Chris@49
|
1261
|
Chris@49
|
1262 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(0) );
|
Chris@49
|
1263
|
Chris@49
|
1264 return *this;
|
Chris@49
|
1265 }
|
Chris@49
|
1266
|
Chris@49
|
1267
|
Chris@49
|
1268
|
Chris@49
|
1269 template<typename eT>
|
Chris@49
|
1270 template<uword fixed_n_elem>
|
Chris@49
|
1271 arma_hot
|
Chris@49
|
1272 inline
|
Chris@49
|
1273 const Col<eT>&
|
Chris@49
|
1274 Col<eT>::fixed<fixed_n_elem>::ones()
|
Chris@49
|
1275 {
|
Chris@49
|
1276 arma_extra_debug_sigprint();
|
Chris@49
|
1277
|
Chris@49
|
1278 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);
|
Chris@49
|
1279
|
Chris@49
|
1280 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(1) );
|
Chris@49
|
1281
|
Chris@49
|
1282 return *this;
|
Chris@49
|
1283 }
|
Chris@49
|
1284
|
Chris@49
|
1285
|
Chris@49
|
1286
|
Chris@49
|
1287 template<typename eT>
|
Chris@49
|
1288 inline
|
Chris@49
|
1289 Col<eT>::Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem)
|
Chris@49
|
1290 : Mat<eT>(arma_fixed_indicator(), in_n_elem, 1, 1, in_mem)
|
Chris@49
|
1291 {
|
Chris@49
|
1292 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1293 }
|
Chris@49
|
1294
|
Chris@49
|
1295
|
Chris@49
|
1296
|
Chris@49
|
1297 #ifdef ARMA_EXTRA_COL_MEAT
|
Chris@49
|
1298 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_MEAT)
|
Chris@49
|
1299 #endif
|
Chris@49
|
1300
|
Chris@49
|
1301
|
Chris@49
|
1302
|
Chris@49
|
1303 //! @}
|