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) 2012 Ryan Curtin
|
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 Mat
|
Chris@49
|
11 //! @{
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename eT>
|
Chris@49
|
15 inline
|
Chris@49
|
16 Mat<eT>::~Mat()
|
Chris@49
|
17 {
|
Chris@49
|
18 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
19
|
Chris@49
|
20 if(mem_state == 0)
|
Chris@49
|
21 {
|
Chris@49
|
22 if(n_elem > arma_config::mat_prealloc)
|
Chris@49
|
23 {
|
Chris@49
|
24 memory::release( access::rw(mem) );
|
Chris@49
|
25 }
|
Chris@49
|
26 }
|
Chris@49
|
27
|
Chris@49
|
28 if(arma_config::debug == true)
|
Chris@49
|
29 {
|
Chris@49
|
30 // try to expose buggy user code that accesses deleted objects
|
Chris@49
|
31 access::rw(mem) = 0;
|
Chris@49
|
32 }
|
Chris@49
|
33
|
Chris@49
|
34 arma_type_check(( is_supported_elem_type<eT>::value == false ));
|
Chris@49
|
35 }
|
Chris@49
|
36
|
Chris@49
|
37
|
Chris@49
|
38
|
Chris@49
|
39 template<typename eT>
|
Chris@49
|
40 inline
|
Chris@49
|
41 Mat<eT>::Mat()
|
Chris@49
|
42 : n_rows(0)
|
Chris@49
|
43 , n_cols(0)
|
Chris@49
|
44 , n_elem(0)
|
Chris@49
|
45 , vec_state(0)
|
Chris@49
|
46 , mem_state(0)
|
Chris@49
|
47 , mem()
|
Chris@49
|
48 {
|
Chris@49
|
49 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
50 }
|
Chris@49
|
51
|
Chris@49
|
52
|
Chris@49
|
53
|
Chris@49
|
54 //! construct the matrix to have user specified dimensions
|
Chris@49
|
55 template<typename eT>
|
Chris@49
|
56 inline
|
Chris@49
|
57 Mat<eT>::Mat(const uword in_n_rows, const uword in_n_cols)
|
Chris@49
|
58 : n_rows(in_n_rows)
|
Chris@49
|
59 , n_cols(in_n_cols)
|
Chris@49
|
60 , n_elem(in_n_rows*in_n_cols)
|
Chris@49
|
61 , vec_state(0)
|
Chris@49
|
62 , mem_state(0)
|
Chris@49
|
63 , mem()
|
Chris@49
|
64 {
|
Chris@49
|
65 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
66
|
Chris@49
|
67 init_cold();
|
Chris@49
|
68 }
|
Chris@49
|
69
|
Chris@49
|
70
|
Chris@49
|
71
|
Chris@49
|
72 //! constructor used by Row and Col classes
|
Chris@49
|
73 template<typename eT>
|
Chris@49
|
74 inline
|
Chris@49
|
75 Mat<eT>::Mat(const arma_vec_indicator&, const uhword in_vec_state)
|
Chris@49
|
76 : n_rows( (in_vec_state == 2) ? 1 : 0 )
|
Chris@49
|
77 , n_cols( (in_vec_state == 1) ? 1 : 0 )
|
Chris@49
|
78 , n_elem(0)
|
Chris@49
|
79 , vec_state(in_vec_state)
|
Chris@49
|
80 , mem_state(0)
|
Chris@49
|
81 , mem()
|
Chris@49
|
82 {
|
Chris@49
|
83 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
84 }
|
Chris@49
|
85
|
Chris@49
|
86
|
Chris@49
|
87
|
Chris@49
|
88 //! constructor used by Row and Col classes
|
Chris@49
|
89 template<typename eT>
|
Chris@49
|
90 inline
|
Chris@49
|
91 Mat<eT>::Mat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state)
|
Chris@49
|
92 : n_rows(in_n_rows)
|
Chris@49
|
93 , n_cols(in_n_cols)
|
Chris@49
|
94 , n_elem(in_n_rows*in_n_cols)
|
Chris@49
|
95 , vec_state(in_vec_state)
|
Chris@49
|
96 , mem_state(0)
|
Chris@49
|
97 , mem()
|
Chris@49
|
98 {
|
Chris@49
|
99 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
100
|
Chris@49
|
101 init_cold();
|
Chris@49
|
102 }
|
Chris@49
|
103
|
Chris@49
|
104
|
Chris@49
|
105
|
Chris@49
|
106 template<typename eT>
|
Chris@49
|
107 inline
|
Chris@49
|
108 Mat<eT>::Mat(const arma_fixed_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state, const eT* in_mem)
|
Chris@49
|
109 : n_rows (in_n_rows)
|
Chris@49
|
110 , n_cols (in_n_cols)
|
Chris@49
|
111 , n_elem (in_n_rows*in_n_cols)
|
Chris@49
|
112 , vec_state (in_vec_state)
|
Chris@49
|
113 , mem_state (3)
|
Chris@49
|
114 , mem (in_mem)
|
Chris@49
|
115 {
|
Chris@49
|
116 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
117 }
|
Chris@49
|
118
|
Chris@49
|
119
|
Chris@49
|
120
|
Chris@49
|
121 template<typename eT>
|
Chris@49
|
122 inline
|
Chris@49
|
123 void
|
Chris@49
|
124 Mat<eT>::init_cold()
|
Chris@49
|
125 {
|
Chris@49
|
126 arma_extra_debug_sigprint( arma_boost::format("n_rows = %d, n_cols = %d") % n_rows % n_cols );
|
Chris@49
|
127
|
Chris@49
|
128 // ensure that n_elem can hold the result of (n_rows * n_cols)
|
Chris@49
|
129
|
Chris@49
|
130 arma_debug_check
|
Chris@49
|
131 (
|
Chris@49
|
132 (
|
Chris@49
|
133 ( (n_rows > ARMA_MAX_UHWORD) || (n_cols > ARMA_MAX_UHWORD) )
|
Chris@49
|
134 ? ( (float(n_rows) * float(n_cols)) > float(ARMA_MAX_UWORD) )
|
Chris@49
|
135 : false
|
Chris@49
|
136 ),
|
Chris@49
|
137 "Mat::init(): requested size is too large"
|
Chris@49
|
138 );
|
Chris@49
|
139
|
Chris@49
|
140 if(n_elem <= arma_config::mat_prealloc)
|
Chris@49
|
141 {
|
Chris@49
|
142 access::rw(mem) = mem_local;
|
Chris@49
|
143 }
|
Chris@49
|
144 else
|
Chris@49
|
145 {
|
Chris@49
|
146 arma_extra_debug_print("Mat::init(): allocating memory");
|
Chris@49
|
147
|
Chris@49
|
148 access::rw(mem) = memory::acquire<eT>(n_elem);
|
Chris@49
|
149
|
Chris@49
|
150 arma_check_bad_alloc( (mem == 0), "Mat::init(): out of memory" );
|
Chris@49
|
151 }
|
Chris@49
|
152 }
|
Chris@49
|
153
|
Chris@49
|
154
|
Chris@49
|
155
|
Chris@49
|
156 //! internal matrix construction; if the requested size is small enough, memory from the stack is used. otherwise memory is allocated via 'new'
|
Chris@49
|
157 template<typename eT>
|
Chris@49
|
158 inline
|
Chris@49
|
159 void
|
Chris@49
|
160 Mat<eT>::init_warm(uword in_n_rows, uword in_n_cols)
|
Chris@49
|
161 {
|
Chris@49
|
162 arma_extra_debug_sigprint( arma_boost::format("in_n_rows = %d, in_n_cols = %d") % in_n_rows % in_n_cols );
|
Chris@49
|
163
|
Chris@49
|
164 if( (n_rows == in_n_rows) && (n_cols == in_n_cols) )
|
Chris@49
|
165 {
|
Chris@49
|
166 return;
|
Chris@49
|
167 }
|
Chris@49
|
168
|
Chris@49
|
169 bool err_state = false;
|
Chris@49
|
170 char* err_msg = 0;
|
Chris@49
|
171
|
Chris@49
|
172 const uhword t_vec_state = vec_state;
|
Chris@49
|
173 const uhword t_mem_state = mem_state;
|
Chris@49
|
174
|
Chris@49
|
175 arma_debug_set_error
|
Chris@49
|
176 (
|
Chris@49
|
177 err_state,
|
Chris@49
|
178 err_msg,
|
Chris@49
|
179 (t_mem_state == 3),
|
Chris@49
|
180 "Mat::init(): size is fixed and hence cannot be changed"
|
Chris@49
|
181 );
|
Chris@49
|
182
|
Chris@49
|
183 if(t_vec_state > 0)
|
Chris@49
|
184 {
|
Chris@49
|
185 if( (in_n_rows == 0) && (in_n_cols == 0) )
|
Chris@49
|
186 {
|
Chris@49
|
187 if(t_vec_state == 1)
|
Chris@49
|
188 {
|
Chris@49
|
189 in_n_cols = 1;
|
Chris@49
|
190 }
|
Chris@49
|
191 else
|
Chris@49
|
192 if(t_vec_state == 2)
|
Chris@49
|
193 {
|
Chris@49
|
194 in_n_rows = 1;
|
Chris@49
|
195 }
|
Chris@49
|
196 }
|
Chris@49
|
197 else
|
Chris@49
|
198 {
|
Chris@49
|
199 arma_debug_set_error
|
Chris@49
|
200 (
|
Chris@49
|
201 err_state,
|
Chris@49
|
202 err_msg,
|
Chris@49
|
203 ( ((t_vec_state == 1) && (in_n_cols != 1)) || ((t_vec_state == 2) && (in_n_rows != 1)) ),
|
Chris@49
|
204 "Mat::init(): object is a row or column vector; requested size is not compatible"
|
Chris@49
|
205 );
|
Chris@49
|
206 }
|
Chris@49
|
207 }
|
Chris@49
|
208
|
Chris@49
|
209 // ensure that n_elem can hold the result of (n_rows * n_cols)
|
Chris@49
|
210
|
Chris@49
|
211 arma_debug_set_error
|
Chris@49
|
212 (
|
Chris@49
|
213 err_state,
|
Chris@49
|
214 err_msg,
|
Chris@49
|
215 (
|
Chris@49
|
216 ( (in_n_rows > ARMA_MAX_UHWORD) || (in_n_cols > ARMA_MAX_UHWORD) )
|
Chris@49
|
217 ? ( (float(in_n_rows) * float(in_n_cols)) > float(ARMA_MAX_UWORD) )
|
Chris@49
|
218 : false
|
Chris@49
|
219 ),
|
Chris@49
|
220 "Mat::init(): requested size is too large"
|
Chris@49
|
221 );
|
Chris@49
|
222
|
Chris@49
|
223 arma_debug_check(err_state, err_msg);
|
Chris@49
|
224
|
Chris@49
|
225 const uword old_n_elem = n_elem;
|
Chris@49
|
226 const uword new_n_elem = in_n_rows * in_n_cols;
|
Chris@49
|
227
|
Chris@49
|
228 if(old_n_elem == new_n_elem)
|
Chris@49
|
229 {
|
Chris@49
|
230 arma_extra_debug_print("Mat::init(): reusing memory");
|
Chris@49
|
231
|
Chris@49
|
232 access::rw(n_rows) = in_n_rows;
|
Chris@49
|
233 access::rw(n_cols) = in_n_cols;
|
Chris@49
|
234 }
|
Chris@49
|
235 else
|
Chris@49
|
236 {
|
Chris@49
|
237 arma_debug_check
|
Chris@49
|
238 (
|
Chris@49
|
239 (t_mem_state == 2),
|
Chris@49
|
240 "Mat::init(): mismatch between size of auxiliary memory and requested size"
|
Chris@49
|
241 );
|
Chris@49
|
242
|
Chris@49
|
243 if(t_mem_state == 0)
|
Chris@49
|
244 {
|
Chris@49
|
245 if(old_n_elem > arma_config::mat_prealloc)
|
Chris@49
|
246 {
|
Chris@49
|
247 arma_extra_debug_print("Mat::init(): freeing memory");
|
Chris@49
|
248
|
Chris@49
|
249 memory::release( access::rw(mem) );
|
Chris@49
|
250 }
|
Chris@49
|
251 }
|
Chris@49
|
252
|
Chris@49
|
253
|
Chris@49
|
254 if(new_n_elem <= arma_config::mat_prealloc)
|
Chris@49
|
255 {
|
Chris@49
|
256 access::rw(mem) = mem_local;
|
Chris@49
|
257 }
|
Chris@49
|
258 else
|
Chris@49
|
259 {
|
Chris@49
|
260 arma_extra_debug_print("Mat::init(): allocating memory");
|
Chris@49
|
261
|
Chris@49
|
262 access::rw(mem) = memory::acquire<eT>(new_n_elem);
|
Chris@49
|
263
|
Chris@49
|
264 arma_check_bad_alloc( (mem == 0), "Mat::init(): out of memory" );
|
Chris@49
|
265 }
|
Chris@49
|
266
|
Chris@49
|
267 access::rw(n_rows) = in_n_rows;
|
Chris@49
|
268 access::rw(n_cols) = in_n_cols;
|
Chris@49
|
269 access::rw(n_elem) = new_n_elem;
|
Chris@49
|
270 access::rw(mem_state) = 0;
|
Chris@49
|
271 }
|
Chris@49
|
272 }
|
Chris@49
|
273
|
Chris@49
|
274
|
Chris@49
|
275
|
Chris@49
|
276 //! create the matrix from a textual description
|
Chris@49
|
277 template<typename eT>
|
Chris@49
|
278 inline
|
Chris@49
|
279 Mat<eT>::Mat(const char* text)
|
Chris@49
|
280 : n_rows(0)
|
Chris@49
|
281 , n_cols(0)
|
Chris@49
|
282 , n_elem(0)
|
Chris@49
|
283 , vec_state(0)
|
Chris@49
|
284 , mem_state(0)
|
Chris@49
|
285 , mem()
|
Chris@49
|
286 {
|
Chris@49
|
287 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
288
|
Chris@49
|
289 init( std::string(text) );
|
Chris@49
|
290 }
|
Chris@49
|
291
|
Chris@49
|
292
|
Chris@49
|
293
|
Chris@49
|
294 //! create the matrix from a textual description
|
Chris@49
|
295 template<typename eT>
|
Chris@49
|
296 inline
|
Chris@49
|
297 const Mat<eT>&
|
Chris@49
|
298 Mat<eT>::operator=(const char* text)
|
Chris@49
|
299 {
|
Chris@49
|
300 arma_extra_debug_sigprint();
|
Chris@49
|
301
|
Chris@49
|
302 init( std::string(text) );
|
Chris@49
|
303 return *this;
|
Chris@49
|
304 }
|
Chris@49
|
305
|
Chris@49
|
306
|
Chris@49
|
307
|
Chris@49
|
308 //! create the matrix from a textual description
|
Chris@49
|
309 template<typename eT>
|
Chris@49
|
310 inline
|
Chris@49
|
311 Mat<eT>::Mat(const std::string& text)
|
Chris@49
|
312 : n_rows(0)
|
Chris@49
|
313 , n_cols(0)
|
Chris@49
|
314 , n_elem(0)
|
Chris@49
|
315 , vec_state(0)
|
Chris@49
|
316 , mem_state(0)
|
Chris@49
|
317 , mem()
|
Chris@49
|
318 {
|
Chris@49
|
319 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
320
|
Chris@49
|
321 init(text);
|
Chris@49
|
322 }
|
Chris@49
|
323
|
Chris@49
|
324
|
Chris@49
|
325
|
Chris@49
|
326 //! create the matrix from a textual description
|
Chris@49
|
327 template<typename eT>
|
Chris@49
|
328 inline
|
Chris@49
|
329 const Mat<eT>&
|
Chris@49
|
330 Mat<eT>::operator=(const std::string& text)
|
Chris@49
|
331 {
|
Chris@49
|
332 arma_extra_debug_sigprint();
|
Chris@49
|
333
|
Chris@49
|
334 init(text);
|
Chris@49
|
335 return *this;
|
Chris@49
|
336 }
|
Chris@49
|
337
|
Chris@49
|
338
|
Chris@49
|
339
|
Chris@49
|
340 //! internal function to create the matrix from a textual description
|
Chris@49
|
341 template<typename eT>
|
Chris@49
|
342 inline
|
Chris@49
|
343 void
|
Chris@49
|
344 Mat<eT>::init(const std::string& text)
|
Chris@49
|
345 {
|
Chris@49
|
346 arma_extra_debug_sigprint();
|
Chris@49
|
347
|
Chris@49
|
348 //
|
Chris@49
|
349 // work out the size
|
Chris@49
|
350
|
Chris@49
|
351 uword t_n_rows = 0;
|
Chris@49
|
352 uword t_n_cols = 0;
|
Chris@49
|
353
|
Chris@49
|
354 bool t_n_cols_found = false;
|
Chris@49
|
355
|
Chris@49
|
356 std::string token;
|
Chris@49
|
357
|
Chris@49
|
358 std::string::size_type line_start = 0;
|
Chris@49
|
359 std::string::size_type line_end = 0;
|
Chris@49
|
360
|
Chris@49
|
361 while( line_start < text.length() )
|
Chris@49
|
362 {
|
Chris@49
|
363
|
Chris@49
|
364 line_end = text.find(';', line_start);
|
Chris@49
|
365
|
Chris@49
|
366 if(line_end == std::string::npos)
|
Chris@49
|
367 line_end = text.length()-1;
|
Chris@49
|
368
|
Chris@49
|
369 std::string::size_type line_len = line_end - line_start + 1;
|
Chris@49
|
370 std::stringstream line_stream( text.substr(line_start,line_len) );
|
Chris@49
|
371
|
Chris@49
|
372
|
Chris@49
|
373 uword line_n_cols = 0;
|
Chris@49
|
374 while(line_stream >> token)
|
Chris@49
|
375 {
|
Chris@49
|
376 ++line_n_cols;
|
Chris@49
|
377 }
|
Chris@49
|
378
|
Chris@49
|
379
|
Chris@49
|
380 if(line_n_cols > 0)
|
Chris@49
|
381 {
|
Chris@49
|
382 if(t_n_cols_found == false)
|
Chris@49
|
383 {
|
Chris@49
|
384 t_n_cols = line_n_cols;
|
Chris@49
|
385 t_n_cols_found = true;
|
Chris@49
|
386 }
|
Chris@49
|
387 else
|
Chris@49
|
388 arma_check( (line_n_cols != t_n_cols), "Mat::init(): inconsistent number of columns in given string");
|
Chris@49
|
389
|
Chris@49
|
390 ++t_n_rows;
|
Chris@49
|
391 }
|
Chris@49
|
392 line_start = line_end+1;
|
Chris@49
|
393
|
Chris@49
|
394 }
|
Chris@49
|
395
|
Chris@49
|
396 Mat<eT>& x = *this;
|
Chris@49
|
397 x.set_size(t_n_rows, t_n_cols);
|
Chris@49
|
398
|
Chris@49
|
399 line_start = 0;
|
Chris@49
|
400 line_end = 0;
|
Chris@49
|
401
|
Chris@49
|
402 uword urow = 0;
|
Chris@49
|
403
|
Chris@49
|
404 while( line_start < text.length() )
|
Chris@49
|
405 {
|
Chris@49
|
406
|
Chris@49
|
407 line_end = text.find(';', line_start);
|
Chris@49
|
408
|
Chris@49
|
409 if(line_end == std::string::npos)
|
Chris@49
|
410 line_end = text.length()-1;
|
Chris@49
|
411
|
Chris@49
|
412 std::string::size_type line_len = line_end - line_start + 1;
|
Chris@49
|
413 std::stringstream line_stream( text.substr(line_start,line_len) );
|
Chris@49
|
414
|
Chris@49
|
415 // uword ucol = 0;
|
Chris@49
|
416 // while(line_stream >> token)
|
Chris@49
|
417 // {
|
Chris@49
|
418 // x.at(urow,ucol) = strtod(token.c_str(), 0);
|
Chris@49
|
419 // ++ucol;
|
Chris@49
|
420 // }
|
Chris@49
|
421
|
Chris@49
|
422 uword ucol = 0;
|
Chris@49
|
423 eT val;
|
Chris@49
|
424 while(line_stream >> val)
|
Chris@49
|
425 {
|
Chris@49
|
426 x.at(urow,ucol) = val;
|
Chris@49
|
427 ++ucol;
|
Chris@49
|
428 }
|
Chris@49
|
429
|
Chris@49
|
430 ++urow;
|
Chris@49
|
431 line_start = line_end+1;
|
Chris@49
|
432 }
|
Chris@49
|
433
|
Chris@49
|
434 }
|
Chris@49
|
435
|
Chris@49
|
436
|
Chris@49
|
437
|
Chris@49
|
438 //! create the matrix from std::vector
|
Chris@49
|
439 template<typename eT>
|
Chris@49
|
440 inline
|
Chris@49
|
441 Mat<eT>::Mat(const std::vector<eT>& x)
|
Chris@49
|
442 : n_rows(uword(x.size()))
|
Chris@49
|
443 , n_cols(1)
|
Chris@49
|
444 , n_elem(uword(x.size()))
|
Chris@49
|
445 , vec_state(0)
|
Chris@49
|
446 , mem_state(0)
|
Chris@49
|
447 , mem()
|
Chris@49
|
448 {
|
Chris@49
|
449 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
450
|
Chris@49
|
451 init_cold();
|
Chris@49
|
452
|
Chris@49
|
453 if(n_elem > 0)
|
Chris@49
|
454 {
|
Chris@49
|
455 arrayops::copy( memptr(), &(x[0]), n_elem );
|
Chris@49
|
456 }
|
Chris@49
|
457 }
|
Chris@49
|
458
|
Chris@49
|
459
|
Chris@49
|
460
|
Chris@49
|
461 //! create the matrix from std::vector
|
Chris@49
|
462 template<typename eT>
|
Chris@49
|
463 inline
|
Chris@49
|
464 const Mat<eT>&
|
Chris@49
|
465 Mat<eT>::operator=(const std::vector<eT>& x)
|
Chris@49
|
466 {
|
Chris@49
|
467 arma_extra_debug_sigprint();
|
Chris@49
|
468
|
Chris@49
|
469 init_warm(uword(x.size()), 1);
|
Chris@49
|
470
|
Chris@49
|
471 if(x.size() > 0)
|
Chris@49
|
472 {
|
Chris@49
|
473 arrayops::copy( memptr(), &(x[0]), uword(x.size()) );
|
Chris@49
|
474 }
|
Chris@49
|
475
|
Chris@49
|
476 return *this;
|
Chris@49
|
477 }
|
Chris@49
|
478
|
Chris@49
|
479
|
Chris@49
|
480
|
Chris@49
|
481 #if defined(ARMA_USE_CXX11)
|
Chris@49
|
482
|
Chris@49
|
483 template<typename eT>
|
Chris@49
|
484 inline
|
Chris@49
|
485 Mat<eT>::Mat(const std::initializer_list<eT>& list)
|
Chris@49
|
486 : n_rows(0)
|
Chris@49
|
487 , n_cols(0)
|
Chris@49
|
488 , n_elem(0)
|
Chris@49
|
489 , vec_state(0)
|
Chris@49
|
490 , mem_state(0)
|
Chris@49
|
491 , mem()
|
Chris@49
|
492 {
|
Chris@49
|
493 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
494
|
Chris@49
|
495 init(list);
|
Chris@49
|
496 }
|
Chris@49
|
497
|
Chris@49
|
498
|
Chris@49
|
499
|
Chris@49
|
500 template<typename eT>
|
Chris@49
|
501 inline
|
Chris@49
|
502 const Mat<eT>&
|
Chris@49
|
503 Mat<eT>::operator=(const std::initializer_list<eT>& list)
|
Chris@49
|
504 {
|
Chris@49
|
505 arma_extra_debug_sigprint();
|
Chris@49
|
506
|
Chris@49
|
507 init(list);
|
Chris@49
|
508
|
Chris@49
|
509 return *this;
|
Chris@49
|
510 }
|
Chris@49
|
511
|
Chris@49
|
512 #endif
|
Chris@49
|
513
|
Chris@49
|
514
|
Chris@49
|
515
|
Chris@49
|
516 //! Set the matrix to be equal to the specified scalar.
|
Chris@49
|
517 //! NOTE: the size of the matrix will be 1x1
|
Chris@49
|
518 template<typename eT>
|
Chris@49
|
519 arma_inline
|
Chris@49
|
520 const Mat<eT>&
|
Chris@49
|
521 Mat<eT>::operator=(const eT val)
|
Chris@49
|
522 {
|
Chris@49
|
523 arma_extra_debug_sigprint();
|
Chris@49
|
524
|
Chris@49
|
525 init_warm(1,1);
|
Chris@49
|
526 access::rw(mem[0]) = val;
|
Chris@49
|
527 return *this;
|
Chris@49
|
528 }
|
Chris@49
|
529
|
Chris@49
|
530
|
Chris@49
|
531
|
Chris@49
|
532 //! In-place addition of a scalar to all elements of the matrix
|
Chris@49
|
533 template<typename eT>
|
Chris@49
|
534 arma_inline
|
Chris@49
|
535 const Mat<eT>&
|
Chris@49
|
536 Mat<eT>::operator+=(const eT val)
|
Chris@49
|
537 {
|
Chris@49
|
538 arma_extra_debug_sigprint();
|
Chris@49
|
539
|
Chris@49
|
540 arrayops::inplace_plus( memptr(), val, n_elem );
|
Chris@49
|
541
|
Chris@49
|
542 return *this;
|
Chris@49
|
543 }
|
Chris@49
|
544
|
Chris@49
|
545
|
Chris@49
|
546
|
Chris@49
|
547 //! In-place subtraction of a scalar from all elements of the matrix
|
Chris@49
|
548 template<typename eT>
|
Chris@49
|
549 arma_inline
|
Chris@49
|
550 const Mat<eT>&
|
Chris@49
|
551 Mat<eT>::operator-=(const eT val)
|
Chris@49
|
552 {
|
Chris@49
|
553 arma_extra_debug_sigprint();
|
Chris@49
|
554
|
Chris@49
|
555 arrayops::inplace_minus( memptr(), val, n_elem );
|
Chris@49
|
556
|
Chris@49
|
557 return *this;
|
Chris@49
|
558 }
|
Chris@49
|
559
|
Chris@49
|
560
|
Chris@49
|
561
|
Chris@49
|
562 //! In-place multiplication of all elements of the matrix with a scalar
|
Chris@49
|
563 template<typename eT>
|
Chris@49
|
564 arma_inline
|
Chris@49
|
565 const Mat<eT>&
|
Chris@49
|
566 Mat<eT>::operator*=(const eT val)
|
Chris@49
|
567 {
|
Chris@49
|
568 arma_extra_debug_sigprint();
|
Chris@49
|
569
|
Chris@49
|
570 arrayops::inplace_mul( memptr(), val, n_elem );
|
Chris@49
|
571
|
Chris@49
|
572 return *this;
|
Chris@49
|
573 }
|
Chris@49
|
574
|
Chris@49
|
575
|
Chris@49
|
576
|
Chris@49
|
577 //! In-place division of all elements of the matrix with a scalar
|
Chris@49
|
578 template<typename eT>
|
Chris@49
|
579 arma_inline
|
Chris@49
|
580 const Mat<eT>&
|
Chris@49
|
581 Mat<eT>::operator/=(const eT val)
|
Chris@49
|
582 {
|
Chris@49
|
583 arma_extra_debug_sigprint();
|
Chris@49
|
584
|
Chris@49
|
585 arrayops::inplace_div( memptr(), val, n_elem );
|
Chris@49
|
586
|
Chris@49
|
587 return *this;
|
Chris@49
|
588 }
|
Chris@49
|
589
|
Chris@49
|
590
|
Chris@49
|
591
|
Chris@49
|
592 //! construct a matrix from a given matrix
|
Chris@49
|
593 template<typename eT>
|
Chris@49
|
594 inline
|
Chris@49
|
595 Mat<eT>::Mat(const Mat<eT>& in_mat)
|
Chris@49
|
596 : n_rows(in_mat.n_rows)
|
Chris@49
|
597 , n_cols(in_mat.n_cols)
|
Chris@49
|
598 , n_elem(in_mat.n_elem)
|
Chris@49
|
599 , vec_state(0)
|
Chris@49
|
600 , mem_state(0)
|
Chris@49
|
601 , mem()
|
Chris@49
|
602 {
|
Chris@49
|
603 arma_extra_debug_sigprint(arma_boost::format("this = %x in_mat = %x") % this % &in_mat);
|
Chris@49
|
604
|
Chris@49
|
605 init_cold();
|
Chris@49
|
606
|
Chris@49
|
607 arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );
|
Chris@49
|
608 }
|
Chris@49
|
609
|
Chris@49
|
610
|
Chris@49
|
611
|
Chris@49
|
612 //! construct a matrix from a given matrix
|
Chris@49
|
613 template<typename eT>
|
Chris@49
|
614 inline
|
Chris@49
|
615 const Mat<eT>&
|
Chris@49
|
616 Mat<eT>::operator=(const Mat<eT>& in_mat)
|
Chris@49
|
617 {
|
Chris@49
|
618 arma_extra_debug_sigprint(arma_boost::format("this = %x in_mat = %x") % this % &in_mat);
|
Chris@49
|
619
|
Chris@49
|
620 if(this != &in_mat)
|
Chris@49
|
621 {
|
Chris@49
|
622 init_warm(in_mat.n_rows, in_mat.n_cols);
|
Chris@49
|
623
|
Chris@49
|
624 arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );
|
Chris@49
|
625 }
|
Chris@49
|
626
|
Chris@49
|
627 return *this;
|
Chris@49
|
628 }
|
Chris@49
|
629
|
Chris@49
|
630
|
Chris@49
|
631
|
Chris@49
|
632 #if defined(ARMA_USE_CXX11)
|
Chris@49
|
633
|
Chris@49
|
634 template<typename eT>
|
Chris@49
|
635 inline
|
Chris@49
|
636 void
|
Chris@49
|
637 Mat<eT>::init(const std::initializer_list<eT>& list)
|
Chris@49
|
638 {
|
Chris@49
|
639 arma_extra_debug_sigprint();
|
Chris@49
|
640
|
Chris@49
|
641 const uword N = list.size();
|
Chris@49
|
642
|
Chris@49
|
643 set_size(1, N);
|
Chris@49
|
644
|
Chris@49
|
645 arrayops::copy( memptr(), list.begin(), N );
|
Chris@49
|
646 }
|
Chris@49
|
647
|
Chris@49
|
648 #endif
|
Chris@49
|
649
|
Chris@49
|
650
|
Chris@49
|
651
|
Chris@49
|
652 //! for constructing a complex matrix out of two non-complex matrices
|
Chris@49
|
653 template<typename eT>
|
Chris@49
|
654 template<typename T1, typename T2>
|
Chris@49
|
655 inline
|
Chris@49
|
656 void
|
Chris@49
|
657 Mat<eT>::init
|
Chris@49
|
658 (
|
Chris@49
|
659 const Base<typename Mat<eT>::pod_type, T1>& X,
|
Chris@49
|
660 const Base<typename Mat<eT>::pod_type, T2>& Y
|
Chris@49
|
661 )
|
Chris@49
|
662 {
|
Chris@49
|
663 arma_extra_debug_sigprint();
|
Chris@49
|
664
|
Chris@49
|
665 typedef typename T1::elem_type T;
|
Chris@49
|
666
|
Chris@49
|
667 arma_type_check(( is_complex<eT>::value == false )); //!< compile-time abort if eT isn't std::complex
|
Chris@49
|
668 arma_type_check(( is_complex< T>::value == true )); //!< compile-time abort if T is std::complex
|
Chris@49
|
669
|
Chris@49
|
670 arma_type_check(( is_same_type< std::complex<T>, eT >::value == false )); //!< compile-time abort if types are not compatible
|
Chris@49
|
671
|
Chris@49
|
672 const Proxy<T1> PX(X.get_ref());
|
Chris@49
|
673 const Proxy<T2> PY(Y.get_ref());
|
Chris@49
|
674
|
Chris@49
|
675 arma_debug_assert_same_size(PX, PY, "Mat()");
|
Chris@49
|
676
|
Chris@49
|
677 const uword local_n_rows = PX.get_n_rows();
|
Chris@49
|
678 const uword local_n_cols = PX.get_n_cols();
|
Chris@49
|
679
|
Chris@49
|
680 init_warm(local_n_rows, local_n_cols);
|
Chris@49
|
681
|
Chris@49
|
682 eT* out_mem = (*this).memptr();
|
Chris@49
|
683
|
Chris@49
|
684 const bool prefer_at_accessor = ( Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor );
|
Chris@49
|
685
|
Chris@49
|
686 if(prefer_at_accessor == false)
|
Chris@49
|
687 {
|
Chris@49
|
688 typedef typename Proxy<T1>::ea_type ea_type1;
|
Chris@49
|
689 typedef typename Proxy<T2>::ea_type ea_type2;
|
Chris@49
|
690
|
Chris@49
|
691 const uword N = n_elem;
|
Chris@49
|
692
|
Chris@49
|
693 ea_type1 A = PX.get_ea();
|
Chris@49
|
694 ea_type2 B = PY.get_ea();
|
Chris@49
|
695
|
Chris@49
|
696 for(uword ii=0; ii < N; ++ii)
|
Chris@49
|
697 {
|
Chris@49
|
698 out_mem[ii] = std::complex<T>(A[ii], B[ii]);
|
Chris@49
|
699 }
|
Chris@49
|
700 }
|
Chris@49
|
701 else
|
Chris@49
|
702 {
|
Chris@49
|
703 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
704 for(uword urow=0; urow < local_n_rows; ++urow)
|
Chris@49
|
705 {
|
Chris@49
|
706 *out_mem = std::complex<T>(PX.at(urow,ucol), PY.at(urow,ucol));
|
Chris@49
|
707 out_mem++;
|
Chris@49
|
708 }
|
Chris@49
|
709 }
|
Chris@49
|
710 }
|
Chris@49
|
711
|
Chris@49
|
712
|
Chris@49
|
713
|
Chris@49
|
714 //! EXPERIMENTAL: swap the contents of this matrix, denoted as matrix A, with given matrix B
|
Chris@49
|
715 template<typename eT>
|
Chris@49
|
716 inline
|
Chris@49
|
717 void
|
Chris@49
|
718 Mat<eT>::swap(Mat<eT>& B)
|
Chris@49
|
719 {
|
Chris@49
|
720 Mat<eT>& A = (*this);
|
Chris@49
|
721
|
Chris@49
|
722 arma_extra_debug_sigprint(arma_boost::format("A = %x B = %x") % &A % &B);
|
Chris@49
|
723
|
Chris@49
|
724 arma_debug_check( (A.vec_state != B.vec_state), "Mat::swap(): incompatible object types" );
|
Chris@49
|
725
|
Chris@49
|
726 const uhword A_mem_state = A.mem_state;
|
Chris@49
|
727 const uhword B_mem_state = B.mem_state;
|
Chris@49
|
728
|
Chris@49
|
729 if( (A_mem_state == 0) && (B_mem_state == 0) )
|
Chris@49
|
730 {
|
Chris@49
|
731 const uword A_n_elem = A.n_elem;
|
Chris@49
|
732 const uword B_n_elem = B.n_elem;
|
Chris@49
|
733
|
Chris@49
|
734 const bool A_use_local_mem = (A_n_elem <= arma_config::mat_prealloc);
|
Chris@49
|
735 const bool B_use_local_mem = (B_n_elem <= arma_config::mat_prealloc);
|
Chris@49
|
736
|
Chris@49
|
737 if( (A_use_local_mem == false) && (B_use_local_mem == false) )
|
Chris@49
|
738 {
|
Chris@49
|
739 std::swap( access::rw(A.mem), access::rw(B.mem) );
|
Chris@49
|
740 }
|
Chris@49
|
741 else
|
Chris@49
|
742 if( (A_use_local_mem == true) && (B_use_local_mem == true) )
|
Chris@49
|
743 {
|
Chris@49
|
744 const uword N = (std::max)(A_n_elem, B_n_elem);
|
Chris@49
|
745
|
Chris@49
|
746 eT* A_mem = A.memptr();
|
Chris@49
|
747 eT* B_mem = B.memptr();
|
Chris@49
|
748
|
Chris@49
|
749 for(uword ii=0; ii < N; ++ii) { std::swap( A_mem[ii], B_mem[ii] ); }
|
Chris@49
|
750 }
|
Chris@49
|
751 else
|
Chris@49
|
752 if( (A_use_local_mem == true) && (B_use_local_mem == false) )
|
Chris@49
|
753 {
|
Chris@49
|
754 eT* A_mem_local = &(A.mem_local[0]);
|
Chris@49
|
755 eT* B_mem_local = &(B.mem_local[0]);
|
Chris@49
|
756
|
Chris@49
|
757 arrayops::copy(B_mem_local, A_mem_local, A_n_elem);
|
Chris@49
|
758
|
Chris@49
|
759 access::rw(A.mem) = B.mem;
|
Chris@49
|
760 access::rw(B.mem) = B_mem_local;
|
Chris@49
|
761 }
|
Chris@49
|
762 else
|
Chris@49
|
763 if( (A_use_local_mem == false) && (B_use_local_mem == true) )
|
Chris@49
|
764 {
|
Chris@49
|
765 eT* A_mem_local = &(A.mem_local[0]);
|
Chris@49
|
766 eT* B_mem_local = &(B.mem_local[0]);
|
Chris@49
|
767
|
Chris@49
|
768 arrayops::copy(A_mem_local, B_mem_local, B_n_elem);
|
Chris@49
|
769
|
Chris@49
|
770 access::rw(B.mem) = A.mem;
|
Chris@49
|
771 access::rw(A.mem) = A_mem_local;
|
Chris@49
|
772 }
|
Chris@49
|
773
|
Chris@49
|
774 std::swap( access::rw(A.n_rows), access::rw(B.n_rows) );
|
Chris@49
|
775 std::swap( access::rw(A.n_cols), access::rw(B.n_cols) );
|
Chris@49
|
776 std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );
|
Chris@49
|
777 }
|
Chris@49
|
778 else
|
Chris@49
|
779 if( (A_mem_state == 3) && (B_mem_state == 3) )
|
Chris@49
|
780 {
|
Chris@49
|
781 arma_debug_check( ((A.n_rows != B.n_rows) || (A.n_cols != B.n_cols)), "Mat::swap(): incompatible object types" );
|
Chris@49
|
782
|
Chris@49
|
783 const uword N = A.n_elem;
|
Chris@49
|
784
|
Chris@49
|
785 eT* A_mem = A.memptr();
|
Chris@49
|
786 eT* B_mem = B.memptr();
|
Chris@49
|
787
|
Chris@49
|
788 for(uword ii=0; ii < N; ++ii) { std::swap(A_mem[ii], B_mem[ii]); }
|
Chris@49
|
789 }
|
Chris@49
|
790 else
|
Chris@49
|
791 {
|
Chris@49
|
792 arma_bad("Mat::swap(): incompatible object types");
|
Chris@49
|
793 }
|
Chris@49
|
794 }
|
Chris@49
|
795
|
Chris@49
|
796
|
Chris@49
|
797
|
Chris@49
|
798 //! try to steal the memory from a given matrix;
|
Chris@49
|
799 //! if memory can't be stolen, copy the given matrix
|
Chris@49
|
800 template<typename eT>
|
Chris@49
|
801 inline
|
Chris@49
|
802 void
|
Chris@49
|
803 Mat<eT>::steal_mem(Mat<eT>& x)
|
Chris@49
|
804 {
|
Chris@49
|
805 arma_extra_debug_sigprint();
|
Chris@49
|
806
|
Chris@49
|
807 if(this != &x)
|
Chris@49
|
808 {
|
Chris@49
|
809 const uword x_n_rows = x.n_rows;
|
Chris@49
|
810 const uword x_n_cols = x.n_cols;
|
Chris@49
|
811 const uword x_n_elem = x.n_elem;
|
Chris@49
|
812 const uword x_vec_state = x.vec_state;
|
Chris@49
|
813 const uword x_mem_state = x.mem_state;
|
Chris@49
|
814
|
Chris@49
|
815 const uword t_vec_state = vec_state;
|
Chris@49
|
816
|
Chris@49
|
817 bool layout_ok = false;
|
Chris@49
|
818
|
Chris@49
|
819 if(t_vec_state == x_vec_state)
|
Chris@49
|
820 {
|
Chris@49
|
821 layout_ok = true;
|
Chris@49
|
822 }
|
Chris@49
|
823 else
|
Chris@49
|
824 {
|
Chris@49
|
825 if( (t_vec_state == 1) && ( x_n_cols == 1) )
|
Chris@49
|
826 {
|
Chris@49
|
827 layout_ok = true;
|
Chris@49
|
828 }
|
Chris@49
|
829
|
Chris@49
|
830 if( (t_vec_state == 2) && ( x_n_rows == 1) )
|
Chris@49
|
831 {
|
Chris@49
|
832 layout_ok = true;
|
Chris@49
|
833 }
|
Chris@49
|
834 }
|
Chris@49
|
835
|
Chris@49
|
836
|
Chris@49
|
837 if( (x_mem_state == 0) && (x_n_elem > arma_config::mat_prealloc) && (layout_ok == true) )
|
Chris@49
|
838 {
|
Chris@49
|
839 reset();
|
Chris@49
|
840 // note: calling reset() also prevents fixed size matrices from changing size or using non-local memory
|
Chris@49
|
841
|
Chris@49
|
842 access::rw(n_rows) = x_n_rows;
|
Chris@49
|
843 access::rw(n_cols) = x_n_cols;
|
Chris@49
|
844 access::rw(n_elem) = x_n_elem;
|
Chris@49
|
845 access::rw(mem) = x.mem;
|
Chris@49
|
846
|
Chris@49
|
847 access::rw(x.n_rows) = 0;
|
Chris@49
|
848 access::rw(x.n_cols) = 0;
|
Chris@49
|
849 access::rw(x.n_elem) = 0;
|
Chris@49
|
850 access::rw(x.mem) = 0;
|
Chris@49
|
851 }
|
Chris@49
|
852 else
|
Chris@49
|
853 {
|
Chris@49
|
854 (*this).operator=(x);
|
Chris@49
|
855 }
|
Chris@49
|
856 }
|
Chris@49
|
857 }
|
Chris@49
|
858
|
Chris@49
|
859
|
Chris@49
|
860
|
Chris@49
|
861 //! construct a matrix from a given auxiliary array of eTs.
|
Chris@49
|
862 //! if copy_aux_mem is true, new memory is allocated and the array is copied.
|
Chris@49
|
863 //! if copy_aux_mem is false, the auxiliary array is used directly (without allocating memory and copying).
|
Chris@49
|
864 //! the default is to copy the array.
|
Chris@49
|
865
|
Chris@49
|
866 template<typename eT>
|
Chris@49
|
867 inline
|
Chris@49
|
868 Mat<eT>::Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem, const bool strict)
|
Chris@49
|
869 : n_rows ( aux_n_rows )
|
Chris@49
|
870 , n_cols ( aux_n_cols )
|
Chris@49
|
871 , n_elem ( aux_n_rows*aux_n_cols )
|
Chris@49
|
872 , vec_state( 0 )
|
Chris@49
|
873 , mem_state( copy_aux_mem ? 0 : ( strict ? 2 : 1 ) )
|
Chris@49
|
874 , mem ( copy_aux_mem ? 0 : aux_mem )
|
Chris@49
|
875 {
|
Chris@49
|
876 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
877
|
Chris@49
|
878 if(copy_aux_mem == true)
|
Chris@49
|
879 {
|
Chris@49
|
880 init_cold();
|
Chris@49
|
881
|
Chris@49
|
882 arrayops::copy( memptr(), aux_mem, n_elem );
|
Chris@49
|
883 }
|
Chris@49
|
884 }
|
Chris@49
|
885
|
Chris@49
|
886
|
Chris@49
|
887
|
Chris@49
|
888 //! construct a matrix from a given auxiliary read-only array of eTs.
|
Chris@49
|
889 //! the array is copied.
|
Chris@49
|
890 template<typename eT>
|
Chris@49
|
891 inline
|
Chris@49
|
892 Mat<eT>::Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)
|
Chris@49
|
893 : n_rows(aux_n_rows)
|
Chris@49
|
894 , n_cols(aux_n_cols)
|
Chris@49
|
895 , n_elem(aux_n_rows*aux_n_cols)
|
Chris@49
|
896 , vec_state(0)
|
Chris@49
|
897 , mem_state(0)
|
Chris@49
|
898 , mem()
|
Chris@49
|
899 {
|
Chris@49
|
900 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
901
|
Chris@49
|
902 init_cold();
|
Chris@49
|
903
|
Chris@49
|
904 arrayops::copy( memptr(), aux_mem, n_elem );
|
Chris@49
|
905 }
|
Chris@49
|
906
|
Chris@49
|
907
|
Chris@49
|
908
|
Chris@49
|
909 //! DANGEROUS! Construct a temporary matrix, using auxiliary memory.
|
Chris@49
|
910 //! This constructor is NOT intended for usage by user code.
|
Chris@49
|
911 //! Its sole purpose is to be used by the Cube class.
|
Chris@49
|
912
|
Chris@49
|
913 template<typename eT>
|
Chris@49
|
914 inline
|
Chris@49
|
915 Mat<eT>::Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)
|
Chris@49
|
916 : n_rows (aux_n_rows )
|
Chris@49
|
917 , n_cols (aux_n_cols )
|
Chris@49
|
918 , n_elem (aux_n_rows*aux_n_cols)
|
Chris@49
|
919 , vec_state(0 )
|
Chris@49
|
920 , mem_state(3 )
|
Chris@49
|
921 , mem (aux_mem )
|
Chris@49
|
922 {
|
Chris@49
|
923 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
924 arma_ignore(junk);
|
Chris@49
|
925 }
|
Chris@49
|
926
|
Chris@49
|
927
|
Chris@49
|
928
|
Chris@49
|
929 //! in-place matrix addition
|
Chris@49
|
930 template<typename eT>
|
Chris@49
|
931 inline
|
Chris@49
|
932 const Mat<eT>&
|
Chris@49
|
933 Mat<eT>::operator+=(const Mat<eT>& m)
|
Chris@49
|
934 {
|
Chris@49
|
935 arma_extra_debug_sigprint();
|
Chris@49
|
936
|
Chris@49
|
937 arma_debug_assert_same_size(*this, m, "addition");
|
Chris@49
|
938
|
Chris@49
|
939 arrayops::inplace_plus( memptr(), m.memptr(), n_elem );
|
Chris@49
|
940
|
Chris@49
|
941 return *this;
|
Chris@49
|
942 }
|
Chris@49
|
943
|
Chris@49
|
944
|
Chris@49
|
945
|
Chris@49
|
946 //! in-place matrix subtraction
|
Chris@49
|
947 template<typename eT>
|
Chris@49
|
948 inline
|
Chris@49
|
949 const Mat<eT>&
|
Chris@49
|
950 Mat<eT>::operator-=(const Mat<eT>& m)
|
Chris@49
|
951 {
|
Chris@49
|
952 arma_extra_debug_sigprint();
|
Chris@49
|
953
|
Chris@49
|
954 arma_debug_assert_same_size(*this, m, "subtraction");
|
Chris@49
|
955
|
Chris@49
|
956 arrayops::inplace_minus( memptr(), m.memptr(), n_elem );
|
Chris@49
|
957
|
Chris@49
|
958 return *this;
|
Chris@49
|
959 }
|
Chris@49
|
960
|
Chris@49
|
961
|
Chris@49
|
962
|
Chris@49
|
963 //! in-place matrix multiplication
|
Chris@49
|
964 template<typename eT>
|
Chris@49
|
965 inline
|
Chris@49
|
966 const Mat<eT>&
|
Chris@49
|
967 Mat<eT>::operator*=(const Mat<eT>& m)
|
Chris@49
|
968 {
|
Chris@49
|
969 arma_extra_debug_sigprint();
|
Chris@49
|
970
|
Chris@49
|
971 glue_times::apply_inplace(*this, m);
|
Chris@49
|
972
|
Chris@49
|
973 return *this;
|
Chris@49
|
974 }
|
Chris@49
|
975
|
Chris@49
|
976
|
Chris@49
|
977
|
Chris@49
|
978 //! in-place element-wise matrix multiplication
|
Chris@49
|
979 template<typename eT>
|
Chris@49
|
980 inline
|
Chris@49
|
981 const Mat<eT>&
|
Chris@49
|
982 Mat<eT>::operator%=(const Mat<eT>& m)
|
Chris@49
|
983 {
|
Chris@49
|
984 arma_extra_debug_sigprint();
|
Chris@49
|
985
|
Chris@49
|
986 arma_debug_assert_same_size(*this, m, "element-wise multiplication");
|
Chris@49
|
987
|
Chris@49
|
988 arrayops::inplace_mul( memptr(), m.memptr(), n_elem );
|
Chris@49
|
989
|
Chris@49
|
990 return *this;
|
Chris@49
|
991 }
|
Chris@49
|
992
|
Chris@49
|
993
|
Chris@49
|
994
|
Chris@49
|
995 //! in-place element-wise matrix division
|
Chris@49
|
996 template<typename eT>
|
Chris@49
|
997 inline
|
Chris@49
|
998 const Mat<eT>&
|
Chris@49
|
999 Mat<eT>::operator/=(const Mat<eT>& m)
|
Chris@49
|
1000 {
|
Chris@49
|
1001 arma_extra_debug_sigprint();
|
Chris@49
|
1002
|
Chris@49
|
1003 arma_debug_assert_same_size(*this, m, "element-wise division");
|
Chris@49
|
1004
|
Chris@49
|
1005 arrayops::inplace_div( memptr(), m.memptr(), n_elem );
|
Chris@49
|
1006
|
Chris@49
|
1007 return *this;
|
Chris@49
|
1008 }
|
Chris@49
|
1009
|
Chris@49
|
1010
|
Chris@49
|
1011
|
Chris@49
|
1012 template<typename eT>
|
Chris@49
|
1013 template<typename T1>
|
Chris@49
|
1014 inline
|
Chris@49
|
1015 Mat<eT>::Mat(const BaseCube<eT,T1>& X)
|
Chris@49
|
1016 : n_rows(0)
|
Chris@49
|
1017 , n_cols(0)
|
Chris@49
|
1018 , n_elem(0)
|
Chris@49
|
1019 , vec_state(0)
|
Chris@49
|
1020 , mem_state(0)
|
Chris@49
|
1021 , mem()
|
Chris@49
|
1022 {
|
Chris@49
|
1023 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1024
|
Chris@49
|
1025 (*this).operator=(X);
|
Chris@49
|
1026 }
|
Chris@49
|
1027
|
Chris@49
|
1028
|
Chris@49
|
1029
|
Chris@49
|
1030 template<typename eT>
|
Chris@49
|
1031 template<typename T1>
|
Chris@49
|
1032 inline
|
Chris@49
|
1033 const Mat<eT>&
|
Chris@49
|
1034 Mat<eT>::operator=(const BaseCube<eT,T1>& X)
|
Chris@49
|
1035 {
|
Chris@49
|
1036 arma_extra_debug_sigprint();
|
Chris@49
|
1037
|
Chris@49
|
1038 Mat<eT>& out = *this;
|
Chris@49
|
1039
|
Chris@49
|
1040 const unwrap_cube<T1> tmp(X.get_ref());
|
Chris@49
|
1041 const Cube<eT>& in = tmp.M;
|
Chris@49
|
1042
|
Chris@49
|
1043 arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false);
|
Chris@49
|
1044
|
Chris@49
|
1045 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1046 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1047 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1048
|
Chris@49
|
1049 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1050
|
Chris@49
|
1051 if(in_n_slices == 1)
|
Chris@49
|
1052 {
|
Chris@49
|
1053 out.set_size(in_n_rows, in_n_cols);
|
Chris@49
|
1054
|
Chris@49
|
1055 for(uword ucol=0; ucol < in_n_cols; ++ucol)
|
Chris@49
|
1056 {
|
Chris@49
|
1057 arrayops::copy( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
|
Chris@49
|
1058 }
|
Chris@49
|
1059 }
|
Chris@49
|
1060 else
|
Chris@49
|
1061 {
|
Chris@49
|
1062 if(out_vec_state == 0)
|
Chris@49
|
1063 {
|
Chris@49
|
1064 if(in_n_cols == 1)
|
Chris@49
|
1065 {
|
Chris@49
|
1066 out.set_size(in_n_rows, in_n_slices);
|
Chris@49
|
1067
|
Chris@49
|
1068 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1069 {
|
Chris@49
|
1070 arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1071 }
|
Chris@49
|
1072 }
|
Chris@49
|
1073 else
|
Chris@49
|
1074 if(in_n_rows == 1)
|
Chris@49
|
1075 {
|
Chris@49
|
1076 out.set_size(in_n_cols, in_n_slices);
|
Chris@49
|
1077
|
Chris@49
|
1078 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1079 {
|
Chris@49
|
1080 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1081
|
Chris@49
|
1082 uword i,j;
|
Chris@49
|
1083 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1084 {
|
Chris@49
|
1085 const eT tmp_i = in.at(0, i, slice);
|
Chris@49
|
1086 const eT tmp_j = in.at(0, j, slice);
|
Chris@49
|
1087
|
Chris@49
|
1088 out_colptr[i] = tmp_i;
|
Chris@49
|
1089 out_colptr[j] = tmp_j;
|
Chris@49
|
1090 }
|
Chris@49
|
1091
|
Chris@49
|
1092 if(i < in_n_cols)
|
Chris@49
|
1093 {
|
Chris@49
|
1094 out_colptr[i] = in.at(0, i, slice);
|
Chris@49
|
1095 }
|
Chris@49
|
1096 }
|
Chris@49
|
1097 }
|
Chris@49
|
1098 }
|
Chris@49
|
1099 else
|
Chris@49
|
1100 {
|
Chris@49
|
1101 out.set_size(in_n_slices);
|
Chris@49
|
1102
|
Chris@49
|
1103 eT* out_mem = out.memptr();
|
Chris@49
|
1104
|
Chris@49
|
1105 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1106 {
|
Chris@49
|
1107 out_mem[i] = in.at(0, 0, i);
|
Chris@49
|
1108 }
|
Chris@49
|
1109 }
|
Chris@49
|
1110 }
|
Chris@49
|
1111
|
Chris@49
|
1112 return *this;
|
Chris@49
|
1113 }
|
Chris@49
|
1114
|
Chris@49
|
1115
|
Chris@49
|
1116
|
Chris@49
|
1117 template<typename eT>
|
Chris@49
|
1118 template<typename T1>
|
Chris@49
|
1119 inline
|
Chris@49
|
1120 const Mat<eT>&
|
Chris@49
|
1121 Mat<eT>::operator+=(const BaseCube<eT,T1>& X)
|
Chris@49
|
1122 {
|
Chris@49
|
1123 arma_extra_debug_sigprint();
|
Chris@49
|
1124
|
Chris@49
|
1125 Mat<eT>& out = *this;
|
Chris@49
|
1126
|
Chris@49
|
1127 const unwrap_cube<T1> tmp(X.get_ref());
|
Chris@49
|
1128 const Cube<eT>& in = tmp.M;
|
Chris@49
|
1129
|
Chris@49
|
1130 arma_debug_assert_cube_as_mat(out, in, "addition", true);
|
Chris@49
|
1131
|
Chris@49
|
1132 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1133 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1134 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1135
|
Chris@49
|
1136 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1137 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1138 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1139
|
Chris@49
|
1140 if(in_n_slices == 1)
|
Chris@49
|
1141 {
|
Chris@49
|
1142 for(uword ucol=0; ucol < in_n_cols; ++ucol)
|
Chris@49
|
1143 {
|
Chris@49
|
1144 arrayops::inplace_plus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
|
Chris@49
|
1145 }
|
Chris@49
|
1146 }
|
Chris@49
|
1147 else
|
Chris@49
|
1148 {
|
Chris@49
|
1149 if(out_vec_state == 0)
|
Chris@49
|
1150 {
|
Chris@49
|
1151 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1152 {
|
Chris@49
|
1153 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1154 {
|
Chris@49
|
1155 arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1156 }
|
Chris@49
|
1157 }
|
Chris@49
|
1158 else
|
Chris@49
|
1159 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1160 {
|
Chris@49
|
1161 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1162 {
|
Chris@49
|
1163 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1164
|
Chris@49
|
1165 uword i,j;
|
Chris@49
|
1166 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1167 {
|
Chris@49
|
1168 const eT tmp_i = in.at(0, i, slice);
|
Chris@49
|
1169 const eT tmp_j = in.at(0, j, slice);
|
Chris@49
|
1170
|
Chris@49
|
1171 out_colptr[i] += tmp_i;
|
Chris@49
|
1172 out_colptr[j] += tmp_j;
|
Chris@49
|
1173 }
|
Chris@49
|
1174
|
Chris@49
|
1175 if(i < in_n_cols)
|
Chris@49
|
1176 {
|
Chris@49
|
1177 out_colptr[i] += in.at(0, i, slice);
|
Chris@49
|
1178 }
|
Chris@49
|
1179 }
|
Chris@49
|
1180 }
|
Chris@49
|
1181 }
|
Chris@49
|
1182 else
|
Chris@49
|
1183 {
|
Chris@49
|
1184 eT* out_mem = out.memptr();
|
Chris@49
|
1185
|
Chris@49
|
1186 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1187 {
|
Chris@49
|
1188 out_mem[i] += in.at(0, 0, i);
|
Chris@49
|
1189 }
|
Chris@49
|
1190 }
|
Chris@49
|
1191 }
|
Chris@49
|
1192
|
Chris@49
|
1193 return *this;
|
Chris@49
|
1194 }
|
Chris@49
|
1195
|
Chris@49
|
1196
|
Chris@49
|
1197
|
Chris@49
|
1198 template<typename eT>
|
Chris@49
|
1199 template<typename T1>
|
Chris@49
|
1200 inline
|
Chris@49
|
1201 const Mat<eT>&
|
Chris@49
|
1202 Mat<eT>::operator-=(const BaseCube<eT,T1>& X)
|
Chris@49
|
1203 {
|
Chris@49
|
1204 arma_extra_debug_sigprint();
|
Chris@49
|
1205
|
Chris@49
|
1206 Mat<eT>& out = *this;
|
Chris@49
|
1207
|
Chris@49
|
1208 const unwrap_cube<T1> tmp(X.get_ref());
|
Chris@49
|
1209 const Cube<eT>& in = tmp.M;
|
Chris@49
|
1210
|
Chris@49
|
1211 arma_debug_assert_cube_as_mat(out, in, "subtraction", true);
|
Chris@49
|
1212
|
Chris@49
|
1213 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1214 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1215 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1216
|
Chris@49
|
1217 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1218 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1219 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1220
|
Chris@49
|
1221 if(in_n_slices == 1)
|
Chris@49
|
1222 {
|
Chris@49
|
1223 for(uword ucol=0; ucol < in_n_cols; ++ucol)
|
Chris@49
|
1224 {
|
Chris@49
|
1225 arrayops::inplace_minus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
|
Chris@49
|
1226 }
|
Chris@49
|
1227 }
|
Chris@49
|
1228 else
|
Chris@49
|
1229 {
|
Chris@49
|
1230 if(out_vec_state == 0)
|
Chris@49
|
1231 {
|
Chris@49
|
1232 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1233 {
|
Chris@49
|
1234 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1235 {
|
Chris@49
|
1236 arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1237 }
|
Chris@49
|
1238 }
|
Chris@49
|
1239 else
|
Chris@49
|
1240 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1241 {
|
Chris@49
|
1242 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1243 {
|
Chris@49
|
1244 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1245
|
Chris@49
|
1246 uword i,j;
|
Chris@49
|
1247 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1248 {
|
Chris@49
|
1249 const eT tmp_i = in.at(0, i, slice);
|
Chris@49
|
1250 const eT tmp_j = in.at(0, j, slice);
|
Chris@49
|
1251
|
Chris@49
|
1252 out_colptr[i] -= tmp_i;
|
Chris@49
|
1253 out_colptr[j] -= tmp_j;
|
Chris@49
|
1254 }
|
Chris@49
|
1255
|
Chris@49
|
1256 if(i < in_n_cols)
|
Chris@49
|
1257 {
|
Chris@49
|
1258 out_colptr[i] -= in.at(0, i, slice);
|
Chris@49
|
1259 }
|
Chris@49
|
1260 }
|
Chris@49
|
1261 }
|
Chris@49
|
1262 }
|
Chris@49
|
1263 else
|
Chris@49
|
1264 {
|
Chris@49
|
1265 eT* out_mem = out.memptr();
|
Chris@49
|
1266
|
Chris@49
|
1267 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1268 {
|
Chris@49
|
1269 out_mem[i] -= in.at(0, 0, i);
|
Chris@49
|
1270 }
|
Chris@49
|
1271 }
|
Chris@49
|
1272 }
|
Chris@49
|
1273
|
Chris@49
|
1274 return *this;
|
Chris@49
|
1275 }
|
Chris@49
|
1276
|
Chris@49
|
1277
|
Chris@49
|
1278
|
Chris@49
|
1279 template<typename eT>
|
Chris@49
|
1280 template<typename T1>
|
Chris@49
|
1281 inline
|
Chris@49
|
1282 const Mat<eT>&
|
Chris@49
|
1283 Mat<eT>::operator*=(const BaseCube<eT,T1>& X)
|
Chris@49
|
1284 {
|
Chris@49
|
1285 arma_extra_debug_sigprint();
|
Chris@49
|
1286
|
Chris@49
|
1287 const Mat<eT> B(X);
|
Chris@49
|
1288
|
Chris@49
|
1289 (*this).operator*=(B);
|
Chris@49
|
1290
|
Chris@49
|
1291 return *this;
|
Chris@49
|
1292 }
|
Chris@49
|
1293
|
Chris@49
|
1294
|
Chris@49
|
1295
|
Chris@49
|
1296 template<typename eT>
|
Chris@49
|
1297 template<typename T1>
|
Chris@49
|
1298 inline
|
Chris@49
|
1299 const Mat<eT>&
|
Chris@49
|
1300 Mat<eT>::operator%=(const BaseCube<eT,T1>& X)
|
Chris@49
|
1301 {
|
Chris@49
|
1302 arma_extra_debug_sigprint();
|
Chris@49
|
1303
|
Chris@49
|
1304 Mat<eT>& out = *this;
|
Chris@49
|
1305
|
Chris@49
|
1306 const unwrap_cube<T1> tmp(X.get_ref());
|
Chris@49
|
1307 const Cube<eT>& in = tmp.M;
|
Chris@49
|
1308
|
Chris@49
|
1309 arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true);
|
Chris@49
|
1310
|
Chris@49
|
1311 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1312 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1313 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1314
|
Chris@49
|
1315 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1316 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1317 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1318
|
Chris@49
|
1319 if(in_n_slices == 1)
|
Chris@49
|
1320 {
|
Chris@49
|
1321 for(uword ucol=0; ucol < in_n_cols; ++ucol)
|
Chris@49
|
1322 {
|
Chris@49
|
1323 arrayops::inplace_mul( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
|
Chris@49
|
1324 }
|
Chris@49
|
1325 }
|
Chris@49
|
1326 else
|
Chris@49
|
1327 {
|
Chris@49
|
1328 if(out_vec_state == 0)
|
Chris@49
|
1329 {
|
Chris@49
|
1330 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1331 {
|
Chris@49
|
1332 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1333 {
|
Chris@49
|
1334 arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1335 }
|
Chris@49
|
1336 }
|
Chris@49
|
1337 else
|
Chris@49
|
1338 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1339 {
|
Chris@49
|
1340 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1341 {
|
Chris@49
|
1342 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1343
|
Chris@49
|
1344 uword i,j;
|
Chris@49
|
1345 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1346 {
|
Chris@49
|
1347 const eT tmp_i = in.at(0, i, slice);
|
Chris@49
|
1348 const eT tmp_j = in.at(0, j, slice);
|
Chris@49
|
1349
|
Chris@49
|
1350 out_colptr[i] *= tmp_i;
|
Chris@49
|
1351 out_colptr[j] *= tmp_j;
|
Chris@49
|
1352 }
|
Chris@49
|
1353
|
Chris@49
|
1354 if(i < in_n_cols)
|
Chris@49
|
1355 {
|
Chris@49
|
1356 out_colptr[i] *= in.at(0, i, slice);
|
Chris@49
|
1357 }
|
Chris@49
|
1358 }
|
Chris@49
|
1359 }
|
Chris@49
|
1360 }
|
Chris@49
|
1361 else
|
Chris@49
|
1362 {
|
Chris@49
|
1363 eT* out_mem = out.memptr();
|
Chris@49
|
1364
|
Chris@49
|
1365 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1366 {
|
Chris@49
|
1367 out_mem[i] *= in.at(0, 0, i);
|
Chris@49
|
1368 }
|
Chris@49
|
1369 }
|
Chris@49
|
1370 }
|
Chris@49
|
1371
|
Chris@49
|
1372 return *this;
|
Chris@49
|
1373 }
|
Chris@49
|
1374
|
Chris@49
|
1375
|
Chris@49
|
1376
|
Chris@49
|
1377 template<typename eT>
|
Chris@49
|
1378 template<typename T1>
|
Chris@49
|
1379 inline
|
Chris@49
|
1380 const Mat<eT>&
|
Chris@49
|
1381 Mat<eT>::operator/=(const BaseCube<eT,T1>& X)
|
Chris@49
|
1382 {
|
Chris@49
|
1383 arma_extra_debug_sigprint();
|
Chris@49
|
1384
|
Chris@49
|
1385 Mat<eT>& out = *this;
|
Chris@49
|
1386
|
Chris@49
|
1387 const unwrap_cube<T1> tmp(X.get_ref());
|
Chris@49
|
1388 const Cube<eT>& in = tmp.M;
|
Chris@49
|
1389
|
Chris@49
|
1390 arma_debug_assert_cube_as_mat(out, in, "element-wise division", true);
|
Chris@49
|
1391
|
Chris@49
|
1392 const uword in_n_rows = in.n_rows;
|
Chris@49
|
1393 const uword in_n_cols = in.n_cols;
|
Chris@49
|
1394 const uword in_n_slices = in.n_slices;
|
Chris@49
|
1395
|
Chris@49
|
1396 const uword out_n_rows = out.n_rows;
|
Chris@49
|
1397 const uword out_n_cols = out.n_cols;
|
Chris@49
|
1398 const uword out_vec_state = out.vec_state;
|
Chris@49
|
1399
|
Chris@49
|
1400 if(in_n_slices == 1)
|
Chris@49
|
1401 {
|
Chris@49
|
1402 for(uword ucol=0; ucol < in_n_cols; ++ucol)
|
Chris@49
|
1403 {
|
Chris@49
|
1404 arrayops::inplace_div( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );
|
Chris@49
|
1405 }
|
Chris@49
|
1406 }
|
Chris@49
|
1407 else
|
Chris@49
|
1408 {
|
Chris@49
|
1409 if(out_vec_state == 0)
|
Chris@49
|
1410 {
|
Chris@49
|
1411 if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1412 {
|
Chris@49
|
1413 for(uword i=0; i < in_n_slices; ++i)
|
Chris@49
|
1414 {
|
Chris@49
|
1415 arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );
|
Chris@49
|
1416 }
|
Chris@49
|
1417 }
|
Chris@49
|
1418 else
|
Chris@49
|
1419 if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )
|
Chris@49
|
1420 {
|
Chris@49
|
1421 for(uword slice=0; slice < in_n_slices; ++slice)
|
Chris@49
|
1422 {
|
Chris@49
|
1423 eT* out_colptr = out.colptr(slice);
|
Chris@49
|
1424
|
Chris@49
|
1425 uword i,j;
|
Chris@49
|
1426 for(i=0, j=1; j < in_n_cols; i+=2, j+=2)
|
Chris@49
|
1427 {
|
Chris@49
|
1428 const eT tmp_i = in.at(0, i, slice);
|
Chris@49
|
1429 const eT tmp_j = in.at(0, j, slice);
|
Chris@49
|
1430
|
Chris@49
|
1431 out_colptr[i] /= tmp_i;
|
Chris@49
|
1432 out_colptr[j] /= tmp_j;
|
Chris@49
|
1433 }
|
Chris@49
|
1434
|
Chris@49
|
1435 if(i < in_n_cols)
|
Chris@49
|
1436 {
|
Chris@49
|
1437 out_colptr[i] /= in.at(0, i, slice);
|
Chris@49
|
1438 }
|
Chris@49
|
1439 }
|
Chris@49
|
1440 }
|
Chris@49
|
1441 }
|
Chris@49
|
1442 else
|
Chris@49
|
1443 {
|
Chris@49
|
1444 eT* out_mem = out.memptr();
|
Chris@49
|
1445
|
Chris@49
|
1446 for(uword i=0; i<in_n_slices; ++i)
|
Chris@49
|
1447 {
|
Chris@49
|
1448 out_mem[i] /= in.at(0, 0, i);
|
Chris@49
|
1449 }
|
Chris@49
|
1450 }
|
Chris@49
|
1451 }
|
Chris@49
|
1452
|
Chris@49
|
1453 return *this;
|
Chris@49
|
1454 }
|
Chris@49
|
1455
|
Chris@49
|
1456
|
Chris@49
|
1457
|
Chris@49
|
1458 //! for constructing a complex matrix out of two non-complex matrices
|
Chris@49
|
1459 template<typename eT>
|
Chris@49
|
1460 template<typename T1, typename T2>
|
Chris@49
|
1461 inline
|
Chris@49
|
1462 Mat<eT>::Mat
|
Chris@49
|
1463 (
|
Chris@49
|
1464 const Base<typename Mat<eT>::pod_type,T1>& A,
|
Chris@49
|
1465 const Base<typename Mat<eT>::pod_type,T2>& B
|
Chris@49
|
1466 )
|
Chris@49
|
1467 : n_rows(0)
|
Chris@49
|
1468 , n_cols(0)
|
Chris@49
|
1469 , n_elem(0)
|
Chris@49
|
1470 , vec_state(0)
|
Chris@49
|
1471 , mem_state(0)
|
Chris@49
|
1472 , mem()
|
Chris@49
|
1473 {
|
Chris@49
|
1474 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1475
|
Chris@49
|
1476 init(A,B);
|
Chris@49
|
1477 }
|
Chris@49
|
1478
|
Chris@49
|
1479
|
Chris@49
|
1480
|
Chris@49
|
1481 //! construct a matrix from subview (e.g. construct a matrix from a delayed submatrix operation)
|
Chris@49
|
1482 template<typename eT>
|
Chris@49
|
1483 inline
|
Chris@49
|
1484 Mat<eT>::Mat(const subview<eT>& X)
|
Chris@49
|
1485 : n_rows(X.n_rows)
|
Chris@49
|
1486 , n_cols(X.n_cols)
|
Chris@49
|
1487 , n_elem(X.n_elem)
|
Chris@49
|
1488 , vec_state(0)
|
Chris@49
|
1489 , mem_state(0)
|
Chris@49
|
1490 , mem()
|
Chris@49
|
1491 {
|
Chris@49
|
1492 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1493
|
Chris@49
|
1494 init_cold();
|
Chris@49
|
1495
|
Chris@49
|
1496 subview<eT>::extract(*this, X);
|
Chris@49
|
1497 }
|
Chris@49
|
1498
|
Chris@49
|
1499
|
Chris@49
|
1500
|
Chris@49
|
1501 //! construct a matrix from subview (e.g. construct a matrix from a delayed submatrix operation)
|
Chris@49
|
1502 template<typename eT>
|
Chris@49
|
1503 inline
|
Chris@49
|
1504 const Mat<eT>&
|
Chris@49
|
1505 Mat<eT>::operator=(const subview<eT>& X)
|
Chris@49
|
1506 {
|
Chris@49
|
1507 arma_extra_debug_sigprint();
|
Chris@49
|
1508
|
Chris@49
|
1509 const bool alias = (this == &(X.m));
|
Chris@49
|
1510
|
Chris@49
|
1511 if(alias == false)
|
Chris@49
|
1512 {
|
Chris@49
|
1513 init_warm(X.n_rows, X.n_cols);
|
Chris@49
|
1514
|
Chris@49
|
1515 subview<eT>::extract(*this, X);
|
Chris@49
|
1516 }
|
Chris@49
|
1517 else
|
Chris@49
|
1518 {
|
Chris@49
|
1519 Mat<eT> tmp(X);
|
Chris@49
|
1520
|
Chris@49
|
1521 steal_mem(tmp);
|
Chris@49
|
1522 }
|
Chris@49
|
1523
|
Chris@49
|
1524 return *this;
|
Chris@49
|
1525 }
|
Chris@49
|
1526
|
Chris@49
|
1527
|
Chris@49
|
1528 //! in-place matrix addition (using a submatrix on the right-hand-side)
|
Chris@49
|
1529 template<typename eT>
|
Chris@49
|
1530 inline
|
Chris@49
|
1531 const Mat<eT>&
|
Chris@49
|
1532 Mat<eT>::operator+=(const subview<eT>& X)
|
Chris@49
|
1533 {
|
Chris@49
|
1534 arma_extra_debug_sigprint();
|
Chris@49
|
1535
|
Chris@49
|
1536 subview<eT>::plus_inplace(*this, X);
|
Chris@49
|
1537
|
Chris@49
|
1538 return *this;
|
Chris@49
|
1539 }
|
Chris@49
|
1540
|
Chris@49
|
1541
|
Chris@49
|
1542 //! in-place matrix subtraction (using a submatrix on the right-hand-side)
|
Chris@49
|
1543 template<typename eT>
|
Chris@49
|
1544 inline
|
Chris@49
|
1545 const Mat<eT>&
|
Chris@49
|
1546 Mat<eT>::operator-=(const subview<eT>& X)
|
Chris@49
|
1547 {
|
Chris@49
|
1548 arma_extra_debug_sigprint();
|
Chris@49
|
1549
|
Chris@49
|
1550 subview<eT>::minus_inplace(*this, X);
|
Chris@49
|
1551
|
Chris@49
|
1552 return *this;
|
Chris@49
|
1553 }
|
Chris@49
|
1554
|
Chris@49
|
1555
|
Chris@49
|
1556
|
Chris@49
|
1557 //! in-place matrix mutiplication (using a submatrix on the right-hand-side)
|
Chris@49
|
1558 template<typename eT>
|
Chris@49
|
1559 inline
|
Chris@49
|
1560 const Mat<eT>&
|
Chris@49
|
1561 Mat<eT>::operator*=(const subview<eT>& X)
|
Chris@49
|
1562 {
|
Chris@49
|
1563 arma_extra_debug_sigprint();
|
Chris@49
|
1564
|
Chris@49
|
1565 glue_times::apply_inplace(*this, X);
|
Chris@49
|
1566
|
Chris@49
|
1567 return *this;
|
Chris@49
|
1568 }
|
Chris@49
|
1569
|
Chris@49
|
1570
|
Chris@49
|
1571
|
Chris@49
|
1572 //! in-place element-wise matrix mutiplication (using a submatrix on the right-hand-side)
|
Chris@49
|
1573 template<typename eT>
|
Chris@49
|
1574 inline
|
Chris@49
|
1575 const Mat<eT>&
|
Chris@49
|
1576 Mat<eT>::operator%=(const subview<eT>& X)
|
Chris@49
|
1577 {
|
Chris@49
|
1578 arma_extra_debug_sigprint();
|
Chris@49
|
1579
|
Chris@49
|
1580 subview<eT>::schur_inplace(*this, X);
|
Chris@49
|
1581
|
Chris@49
|
1582 return *this;
|
Chris@49
|
1583 }
|
Chris@49
|
1584
|
Chris@49
|
1585
|
Chris@49
|
1586
|
Chris@49
|
1587 //! in-place element-wise matrix division (using a submatrix on the right-hand-side)
|
Chris@49
|
1588 template<typename eT>
|
Chris@49
|
1589 inline
|
Chris@49
|
1590 const Mat<eT>&
|
Chris@49
|
1591 Mat<eT>::operator/=(const subview<eT>& X)
|
Chris@49
|
1592 {
|
Chris@49
|
1593 arma_extra_debug_sigprint();
|
Chris@49
|
1594
|
Chris@49
|
1595 subview<eT>::div_inplace(*this, X);
|
Chris@49
|
1596
|
Chris@49
|
1597 return *this;
|
Chris@49
|
1598 }
|
Chris@49
|
1599
|
Chris@49
|
1600
|
Chris@49
|
1601
|
Chris@49
|
1602 template<typename eT>
|
Chris@49
|
1603 inline
|
Chris@49
|
1604 Mat<eT>::Mat(const subview_row_strans<eT>& X)
|
Chris@49
|
1605 : n_rows(X.n_rows)
|
Chris@49
|
1606 , n_cols(X.n_cols)
|
Chris@49
|
1607 , n_elem(X.n_elem)
|
Chris@49
|
1608 , vec_state(0)
|
Chris@49
|
1609 , mem_state(0)
|
Chris@49
|
1610 , mem()
|
Chris@49
|
1611 {
|
Chris@49
|
1612 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1613
|
Chris@49
|
1614 init_cold();
|
Chris@49
|
1615
|
Chris@49
|
1616 X.extract(*this);
|
Chris@49
|
1617 }
|
Chris@49
|
1618
|
Chris@49
|
1619
|
Chris@49
|
1620
|
Chris@49
|
1621 template<typename eT>
|
Chris@49
|
1622 inline
|
Chris@49
|
1623 Mat<eT>::Mat(const subview_row_htrans<eT>& X)
|
Chris@49
|
1624 : n_rows(X.n_rows)
|
Chris@49
|
1625 , n_cols(X.n_cols)
|
Chris@49
|
1626 , n_elem(X.n_elem)
|
Chris@49
|
1627 , vec_state(0)
|
Chris@49
|
1628 , mem_state(0)
|
Chris@49
|
1629 , mem()
|
Chris@49
|
1630 {
|
Chris@49
|
1631 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1632
|
Chris@49
|
1633 init_cold();
|
Chris@49
|
1634
|
Chris@49
|
1635 X.extract(*this);
|
Chris@49
|
1636 }
|
Chris@49
|
1637
|
Chris@49
|
1638
|
Chris@49
|
1639
|
Chris@49
|
1640 template<typename eT>
|
Chris@49
|
1641 inline
|
Chris@49
|
1642 Mat<eT>::Mat(const xvec_htrans<eT>& X)
|
Chris@49
|
1643 : n_rows(X.n_rows)
|
Chris@49
|
1644 , n_cols(X.n_cols)
|
Chris@49
|
1645 , n_elem(X.n_elem)
|
Chris@49
|
1646 , vec_state(0)
|
Chris@49
|
1647 , mem_state(0)
|
Chris@49
|
1648 , mem()
|
Chris@49
|
1649 {
|
Chris@49
|
1650 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1651
|
Chris@49
|
1652 init_cold();
|
Chris@49
|
1653
|
Chris@49
|
1654 X.extract(*this);
|
Chris@49
|
1655 }
|
Chris@49
|
1656
|
Chris@49
|
1657
|
Chris@49
|
1658
|
Chris@49
|
1659 //! construct a matrix from a subview_cube instance
|
Chris@49
|
1660 template<typename eT>
|
Chris@49
|
1661 inline
|
Chris@49
|
1662 Mat<eT>::Mat(const subview_cube<eT>& x)
|
Chris@49
|
1663 : n_rows(0)
|
Chris@49
|
1664 , n_cols(0)
|
Chris@49
|
1665 , n_elem(0)
|
Chris@49
|
1666 , vec_state(0)
|
Chris@49
|
1667 , mem_state(0)
|
Chris@49
|
1668 , mem()
|
Chris@49
|
1669 {
|
Chris@49
|
1670 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1671
|
Chris@49
|
1672 this->operator=(x);
|
Chris@49
|
1673 }
|
Chris@49
|
1674
|
Chris@49
|
1675
|
Chris@49
|
1676
|
Chris@49
|
1677 //! construct a matrix from a subview_cube instance
|
Chris@49
|
1678 template<typename eT>
|
Chris@49
|
1679 inline
|
Chris@49
|
1680 const Mat<eT>&
|
Chris@49
|
1681 Mat<eT>::operator=(const subview_cube<eT>& X)
|
Chris@49
|
1682 {
|
Chris@49
|
1683 arma_extra_debug_sigprint();
|
Chris@49
|
1684
|
Chris@49
|
1685 subview_cube<eT>::extract(*this, X);
|
Chris@49
|
1686
|
Chris@49
|
1687 return *this;
|
Chris@49
|
1688 }
|
Chris@49
|
1689
|
Chris@49
|
1690
|
Chris@49
|
1691
|
Chris@49
|
1692 //! in-place matrix addition (using a single-slice subcube on the right-hand-side)
|
Chris@49
|
1693 template<typename eT>
|
Chris@49
|
1694 inline
|
Chris@49
|
1695 const Mat<eT>&
|
Chris@49
|
1696 Mat<eT>::operator+=(const subview_cube<eT>& X)
|
Chris@49
|
1697 {
|
Chris@49
|
1698 arma_extra_debug_sigprint();
|
Chris@49
|
1699
|
Chris@49
|
1700 subview_cube<eT>::plus_inplace(*this, X);
|
Chris@49
|
1701
|
Chris@49
|
1702 return *this;
|
Chris@49
|
1703 }
|
Chris@49
|
1704
|
Chris@49
|
1705
|
Chris@49
|
1706
|
Chris@49
|
1707 //! in-place matrix subtraction (using a single-slice subcube on the right-hand-side)
|
Chris@49
|
1708 template<typename eT>
|
Chris@49
|
1709 inline
|
Chris@49
|
1710 const Mat<eT>&
|
Chris@49
|
1711 Mat<eT>::operator-=(const subview_cube<eT>& X)
|
Chris@49
|
1712 {
|
Chris@49
|
1713 arma_extra_debug_sigprint();
|
Chris@49
|
1714
|
Chris@49
|
1715 subview_cube<eT>::minus_inplace(*this, X);
|
Chris@49
|
1716
|
Chris@49
|
1717 return *this;
|
Chris@49
|
1718 }
|
Chris@49
|
1719
|
Chris@49
|
1720
|
Chris@49
|
1721
|
Chris@49
|
1722 //! in-place matrix mutiplication (using a single-slice subcube on the right-hand-side)
|
Chris@49
|
1723 template<typename eT>
|
Chris@49
|
1724 inline
|
Chris@49
|
1725 const Mat<eT>&
|
Chris@49
|
1726 Mat<eT>::operator*=(const subview_cube<eT>& X)
|
Chris@49
|
1727 {
|
Chris@49
|
1728 arma_extra_debug_sigprint();
|
Chris@49
|
1729
|
Chris@49
|
1730 const Mat<eT> tmp(X);
|
Chris@49
|
1731 glue_times::apply_inplace(*this, tmp);
|
Chris@49
|
1732
|
Chris@49
|
1733 return *this;
|
Chris@49
|
1734 }
|
Chris@49
|
1735
|
Chris@49
|
1736
|
Chris@49
|
1737
|
Chris@49
|
1738 //! in-place element-wise matrix mutiplication (using a single-slice subcube on the right-hand-side)
|
Chris@49
|
1739 template<typename eT>
|
Chris@49
|
1740 inline
|
Chris@49
|
1741 const Mat<eT>&
|
Chris@49
|
1742 Mat<eT>::operator%=(const subview_cube<eT>& X)
|
Chris@49
|
1743 {
|
Chris@49
|
1744 arma_extra_debug_sigprint();
|
Chris@49
|
1745
|
Chris@49
|
1746 subview_cube<eT>::schur_inplace(*this, X);
|
Chris@49
|
1747
|
Chris@49
|
1748 return *this;
|
Chris@49
|
1749 }
|
Chris@49
|
1750
|
Chris@49
|
1751
|
Chris@49
|
1752
|
Chris@49
|
1753 //! in-place element-wise matrix division (using a single-slice subcube on the right-hand-side)
|
Chris@49
|
1754 template<typename eT>
|
Chris@49
|
1755 inline
|
Chris@49
|
1756 const Mat<eT>&
|
Chris@49
|
1757 Mat<eT>::operator/=(const subview_cube<eT>& X)
|
Chris@49
|
1758 {
|
Chris@49
|
1759 arma_extra_debug_sigprint();
|
Chris@49
|
1760
|
Chris@49
|
1761 subview_cube<eT>::div_inplace(*this, X);
|
Chris@49
|
1762
|
Chris@49
|
1763 return *this;
|
Chris@49
|
1764 }
|
Chris@49
|
1765
|
Chris@49
|
1766
|
Chris@49
|
1767
|
Chris@49
|
1768 //! construct a matrix from diagview (e.g. construct a matrix from a delayed diag operation)
|
Chris@49
|
1769 template<typename eT>
|
Chris@49
|
1770 inline
|
Chris@49
|
1771 Mat<eT>::Mat(const diagview<eT>& X)
|
Chris@49
|
1772 : n_rows(X.n_rows)
|
Chris@49
|
1773 , n_cols(X.n_cols)
|
Chris@49
|
1774 , n_elem(X.n_elem)
|
Chris@49
|
1775 , vec_state(0)
|
Chris@49
|
1776 , mem_state(0)
|
Chris@49
|
1777 , mem()
|
Chris@49
|
1778 {
|
Chris@49
|
1779 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1780
|
Chris@49
|
1781 init_cold();
|
Chris@49
|
1782
|
Chris@49
|
1783 diagview<eT>::extract(*this, X);
|
Chris@49
|
1784 }
|
Chris@49
|
1785
|
Chris@49
|
1786
|
Chris@49
|
1787
|
Chris@49
|
1788 //! construct a matrix from diagview (e.g. construct a matrix from a delayed diag operation)
|
Chris@49
|
1789 template<typename eT>
|
Chris@49
|
1790 inline
|
Chris@49
|
1791 const Mat<eT>&
|
Chris@49
|
1792 Mat<eT>::operator=(const diagview<eT>& X)
|
Chris@49
|
1793 {
|
Chris@49
|
1794 arma_extra_debug_sigprint();
|
Chris@49
|
1795
|
Chris@49
|
1796 const bool alias = (this == &(X.m));
|
Chris@49
|
1797
|
Chris@49
|
1798 if(alias == false)
|
Chris@49
|
1799 {
|
Chris@49
|
1800 init_warm(X.n_rows, X.n_cols);
|
Chris@49
|
1801
|
Chris@49
|
1802 diagview<eT>::extract(*this, X);
|
Chris@49
|
1803 }
|
Chris@49
|
1804 else
|
Chris@49
|
1805 {
|
Chris@49
|
1806 Mat<eT> tmp(X);
|
Chris@49
|
1807
|
Chris@49
|
1808 steal_mem(tmp);
|
Chris@49
|
1809 }
|
Chris@49
|
1810
|
Chris@49
|
1811 return *this;
|
Chris@49
|
1812 }
|
Chris@49
|
1813
|
Chris@49
|
1814
|
Chris@49
|
1815
|
Chris@49
|
1816 //! in-place matrix addition (using a diagview on the right-hand-side)
|
Chris@49
|
1817 template<typename eT>
|
Chris@49
|
1818 inline
|
Chris@49
|
1819 const Mat<eT>&
|
Chris@49
|
1820 Mat<eT>::operator+=(const diagview<eT>& X)
|
Chris@49
|
1821 {
|
Chris@49
|
1822 arma_extra_debug_sigprint();
|
Chris@49
|
1823
|
Chris@49
|
1824 diagview<eT>::plus_inplace(*this, X);
|
Chris@49
|
1825
|
Chris@49
|
1826 return *this;
|
Chris@49
|
1827 }
|
Chris@49
|
1828
|
Chris@49
|
1829
|
Chris@49
|
1830 //! in-place matrix subtraction (using a diagview on the right-hand-side)
|
Chris@49
|
1831 template<typename eT>
|
Chris@49
|
1832 inline
|
Chris@49
|
1833 const Mat<eT>&
|
Chris@49
|
1834 Mat<eT>::operator-=(const diagview<eT>& X)
|
Chris@49
|
1835 {
|
Chris@49
|
1836 arma_extra_debug_sigprint();
|
Chris@49
|
1837
|
Chris@49
|
1838 diagview<eT>::minus_inplace(*this, X);
|
Chris@49
|
1839
|
Chris@49
|
1840 return *this;
|
Chris@49
|
1841 }
|
Chris@49
|
1842
|
Chris@49
|
1843
|
Chris@49
|
1844
|
Chris@49
|
1845 //! in-place matrix mutiplication (using a diagview on the right-hand-side)
|
Chris@49
|
1846 template<typename eT>
|
Chris@49
|
1847 inline
|
Chris@49
|
1848 const Mat<eT>&
|
Chris@49
|
1849 Mat<eT>::operator*=(const diagview<eT>& X)
|
Chris@49
|
1850 {
|
Chris@49
|
1851 arma_extra_debug_sigprint();
|
Chris@49
|
1852
|
Chris@49
|
1853 glue_times::apply_inplace(*this, X);
|
Chris@49
|
1854
|
Chris@49
|
1855 return *this;
|
Chris@49
|
1856 }
|
Chris@49
|
1857
|
Chris@49
|
1858
|
Chris@49
|
1859
|
Chris@49
|
1860 //! in-place element-wise matrix mutiplication (using a diagview on the right-hand-side)
|
Chris@49
|
1861 template<typename eT>
|
Chris@49
|
1862 inline
|
Chris@49
|
1863 const Mat<eT>&
|
Chris@49
|
1864 Mat<eT>::operator%=(const diagview<eT>& X)
|
Chris@49
|
1865 {
|
Chris@49
|
1866 arma_extra_debug_sigprint();
|
Chris@49
|
1867
|
Chris@49
|
1868 diagview<eT>::schur_inplace(*this, X);
|
Chris@49
|
1869
|
Chris@49
|
1870 return *this;
|
Chris@49
|
1871 }
|
Chris@49
|
1872
|
Chris@49
|
1873
|
Chris@49
|
1874
|
Chris@49
|
1875 //! in-place element-wise matrix division (using a diagview on the right-hand-side)
|
Chris@49
|
1876 template<typename eT>
|
Chris@49
|
1877 inline
|
Chris@49
|
1878 const Mat<eT>&
|
Chris@49
|
1879 Mat<eT>::operator/=(const diagview<eT>& X)
|
Chris@49
|
1880 {
|
Chris@49
|
1881 arma_extra_debug_sigprint();
|
Chris@49
|
1882
|
Chris@49
|
1883 diagview<eT>::div_inplace(*this, X);
|
Chris@49
|
1884
|
Chris@49
|
1885 return *this;
|
Chris@49
|
1886 }
|
Chris@49
|
1887
|
Chris@49
|
1888
|
Chris@49
|
1889
|
Chris@49
|
1890 template<typename eT>
|
Chris@49
|
1891 template<typename T1>
|
Chris@49
|
1892 inline
|
Chris@49
|
1893 Mat<eT>::Mat(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1894 : n_rows(0)
|
Chris@49
|
1895 , n_cols(0)
|
Chris@49
|
1896 , n_elem(0)
|
Chris@49
|
1897 , vec_state(0)
|
Chris@49
|
1898 , mem_state(0)
|
Chris@49
|
1899 , mem()
|
Chris@49
|
1900 {
|
Chris@49
|
1901 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
1902
|
Chris@49
|
1903 this->operator=(X);
|
Chris@49
|
1904 }
|
Chris@49
|
1905
|
Chris@49
|
1906
|
Chris@49
|
1907
|
Chris@49
|
1908 template<typename eT>
|
Chris@49
|
1909 template<typename T1>
|
Chris@49
|
1910 inline
|
Chris@49
|
1911 const Mat<eT>&
|
Chris@49
|
1912 Mat<eT>::operator=(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1913 {
|
Chris@49
|
1914 arma_extra_debug_sigprint();
|
Chris@49
|
1915
|
Chris@49
|
1916 subview_elem1<eT,T1>::extract(*this, X);
|
Chris@49
|
1917
|
Chris@49
|
1918 return *this;
|
Chris@49
|
1919 }
|
Chris@49
|
1920
|
Chris@49
|
1921
|
Chris@49
|
1922
|
Chris@49
|
1923 template<typename eT>
|
Chris@49
|
1924 template<typename T1>
|
Chris@49
|
1925 inline
|
Chris@49
|
1926 const Mat<eT>&
|
Chris@49
|
1927 Mat<eT>::operator+=(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1928 {
|
Chris@49
|
1929 arma_extra_debug_sigprint();
|
Chris@49
|
1930
|
Chris@49
|
1931 subview_elem1<eT,T1>::plus_inplace(*this, X);
|
Chris@49
|
1932
|
Chris@49
|
1933 return *this;
|
Chris@49
|
1934 }
|
Chris@49
|
1935
|
Chris@49
|
1936
|
Chris@49
|
1937
|
Chris@49
|
1938 template<typename eT>
|
Chris@49
|
1939 template<typename T1>
|
Chris@49
|
1940 inline
|
Chris@49
|
1941 const Mat<eT>&
|
Chris@49
|
1942 Mat<eT>::operator-=(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1943 {
|
Chris@49
|
1944 arma_extra_debug_sigprint();
|
Chris@49
|
1945
|
Chris@49
|
1946 subview_elem1<eT,T1>::minus_inplace(*this, X);
|
Chris@49
|
1947
|
Chris@49
|
1948 return *this;
|
Chris@49
|
1949 }
|
Chris@49
|
1950
|
Chris@49
|
1951
|
Chris@49
|
1952
|
Chris@49
|
1953 template<typename eT>
|
Chris@49
|
1954 template<typename T1>
|
Chris@49
|
1955 inline
|
Chris@49
|
1956 const Mat<eT>&
|
Chris@49
|
1957 Mat<eT>::operator*=(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1958 {
|
Chris@49
|
1959 arma_extra_debug_sigprint();
|
Chris@49
|
1960
|
Chris@49
|
1961 glue_times::apply_inplace(*this, X);
|
Chris@49
|
1962
|
Chris@49
|
1963 return *this;
|
Chris@49
|
1964 }
|
Chris@49
|
1965
|
Chris@49
|
1966
|
Chris@49
|
1967
|
Chris@49
|
1968 template<typename eT>
|
Chris@49
|
1969 template<typename T1>
|
Chris@49
|
1970 inline
|
Chris@49
|
1971 const Mat<eT>&
|
Chris@49
|
1972 Mat<eT>::operator%=(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1973 {
|
Chris@49
|
1974 arma_extra_debug_sigprint();
|
Chris@49
|
1975
|
Chris@49
|
1976 subview_elem1<eT,T1>::schur_inplace(*this, X);
|
Chris@49
|
1977
|
Chris@49
|
1978 return *this;
|
Chris@49
|
1979 }
|
Chris@49
|
1980
|
Chris@49
|
1981
|
Chris@49
|
1982
|
Chris@49
|
1983 template<typename eT>
|
Chris@49
|
1984 template<typename T1>
|
Chris@49
|
1985 inline
|
Chris@49
|
1986 const Mat<eT>&
|
Chris@49
|
1987 Mat<eT>::operator/=(const subview_elem1<eT,T1>& X)
|
Chris@49
|
1988 {
|
Chris@49
|
1989 arma_extra_debug_sigprint();
|
Chris@49
|
1990
|
Chris@49
|
1991 subview_elem1<eT,T1>::div_inplace(*this, X);
|
Chris@49
|
1992
|
Chris@49
|
1993 return *this;
|
Chris@49
|
1994 }
|
Chris@49
|
1995
|
Chris@49
|
1996
|
Chris@49
|
1997
|
Chris@49
|
1998 template<typename eT>
|
Chris@49
|
1999 template<typename T1, typename T2>
|
Chris@49
|
2000 inline
|
Chris@49
|
2001 Mat<eT>::Mat(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2002 : n_rows(0)
|
Chris@49
|
2003 , n_cols(0)
|
Chris@49
|
2004 , n_elem(0)
|
Chris@49
|
2005 , vec_state(0)
|
Chris@49
|
2006 , mem_state(0)
|
Chris@49
|
2007 , mem()
|
Chris@49
|
2008 {
|
Chris@49
|
2009 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
2010
|
Chris@49
|
2011 this->operator=(X);
|
Chris@49
|
2012 }
|
Chris@49
|
2013
|
Chris@49
|
2014
|
Chris@49
|
2015
|
Chris@49
|
2016 template<typename eT>
|
Chris@49
|
2017 template<typename T1, typename T2>
|
Chris@49
|
2018 inline
|
Chris@49
|
2019 const Mat<eT>&
|
Chris@49
|
2020 Mat<eT>::operator=(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2021 {
|
Chris@49
|
2022 arma_extra_debug_sigprint();
|
Chris@49
|
2023
|
Chris@49
|
2024 subview_elem2<eT,T1,T2>::extract(*this, X);
|
Chris@49
|
2025
|
Chris@49
|
2026 return *this;
|
Chris@49
|
2027 }
|
Chris@49
|
2028
|
Chris@49
|
2029
|
Chris@49
|
2030
|
Chris@49
|
2031 template<typename eT>
|
Chris@49
|
2032 template<typename T1, typename T2>
|
Chris@49
|
2033 inline
|
Chris@49
|
2034 const Mat<eT>&
|
Chris@49
|
2035 Mat<eT>::operator+=(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2036 {
|
Chris@49
|
2037 arma_extra_debug_sigprint();
|
Chris@49
|
2038
|
Chris@49
|
2039 subview_elem2<eT,T1,T2>::plus_inplace(*this, X);
|
Chris@49
|
2040
|
Chris@49
|
2041 return *this;
|
Chris@49
|
2042 }
|
Chris@49
|
2043
|
Chris@49
|
2044
|
Chris@49
|
2045
|
Chris@49
|
2046 template<typename eT>
|
Chris@49
|
2047 template<typename T1, typename T2>
|
Chris@49
|
2048 inline
|
Chris@49
|
2049 const Mat<eT>&
|
Chris@49
|
2050 Mat<eT>::operator-=(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2051 {
|
Chris@49
|
2052 arma_extra_debug_sigprint();
|
Chris@49
|
2053
|
Chris@49
|
2054 subview_elem2<eT,T1,T2>::minus_inplace(*this, X);
|
Chris@49
|
2055
|
Chris@49
|
2056 return *this;
|
Chris@49
|
2057 }
|
Chris@49
|
2058
|
Chris@49
|
2059
|
Chris@49
|
2060
|
Chris@49
|
2061 template<typename eT>
|
Chris@49
|
2062 template<typename T1, typename T2>
|
Chris@49
|
2063 inline
|
Chris@49
|
2064 const Mat<eT>&
|
Chris@49
|
2065 Mat<eT>::operator*=(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2066 {
|
Chris@49
|
2067 arma_extra_debug_sigprint();
|
Chris@49
|
2068
|
Chris@49
|
2069 glue_times::apply_inplace(*this, X);
|
Chris@49
|
2070
|
Chris@49
|
2071 return *this;
|
Chris@49
|
2072 }
|
Chris@49
|
2073
|
Chris@49
|
2074
|
Chris@49
|
2075
|
Chris@49
|
2076 template<typename eT>
|
Chris@49
|
2077 template<typename T1, typename T2>
|
Chris@49
|
2078 inline
|
Chris@49
|
2079 const Mat<eT>&
|
Chris@49
|
2080 Mat<eT>::operator%=(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2081 {
|
Chris@49
|
2082 arma_extra_debug_sigprint();
|
Chris@49
|
2083
|
Chris@49
|
2084 subview_elem2<eT,T1,T2>::schur_inplace(*this, X);
|
Chris@49
|
2085
|
Chris@49
|
2086 return *this;
|
Chris@49
|
2087 }
|
Chris@49
|
2088
|
Chris@49
|
2089
|
Chris@49
|
2090
|
Chris@49
|
2091 template<typename eT>
|
Chris@49
|
2092 template<typename T1, typename T2>
|
Chris@49
|
2093 inline
|
Chris@49
|
2094 const Mat<eT>&
|
Chris@49
|
2095 Mat<eT>::operator/=(const subview_elem2<eT,T1,T2>& X)
|
Chris@49
|
2096 {
|
Chris@49
|
2097 arma_extra_debug_sigprint();
|
Chris@49
|
2098
|
Chris@49
|
2099 subview_elem2<eT,T1,T2>::div_inplace(*this, X);
|
Chris@49
|
2100
|
Chris@49
|
2101 return *this;
|
Chris@49
|
2102 }
|
Chris@49
|
2103
|
Chris@49
|
2104
|
Chris@49
|
2105
|
Chris@49
|
2106 template<typename eT>
|
Chris@49
|
2107 template<typename T1>
|
Chris@49
|
2108 inline
|
Chris@49
|
2109 Mat<eT>::Mat(const SpBase<eT, T1>& m)
|
Chris@49
|
2110 : n_rows(0)
|
Chris@49
|
2111 , n_cols(0)
|
Chris@49
|
2112 , n_elem(0)
|
Chris@49
|
2113 , vec_state(0)
|
Chris@49
|
2114 , mem_state(0)
|
Chris@49
|
2115 , mem()
|
Chris@49
|
2116 {
|
Chris@49
|
2117 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
2118
|
Chris@49
|
2119 const SpProxy<T1> p(m.get_ref());
|
Chris@49
|
2120
|
Chris@49
|
2121 access::rw(n_rows) = p.get_n_rows();
|
Chris@49
|
2122 access::rw(n_cols) = p.get_n_cols();
|
Chris@49
|
2123 access::rw(n_elem) = p.get_n_elem();
|
Chris@49
|
2124
|
Chris@49
|
2125 init_cold();
|
Chris@49
|
2126 fill(eT(0));
|
Chris@49
|
2127
|
Chris@49
|
2128 typename SpProxy<T1>::const_iterator_type it = p.begin();
|
Chris@49
|
2129 typename SpProxy<T1>::const_iterator_type it_end = p.end();
|
Chris@49
|
2130
|
Chris@49
|
2131 while(it != it_end)
|
Chris@49
|
2132 {
|
Chris@49
|
2133 at(it.row(), it.col()) = (*it);
|
Chris@49
|
2134 ++it;
|
Chris@49
|
2135 }
|
Chris@49
|
2136 }
|
Chris@49
|
2137
|
Chris@49
|
2138
|
Chris@49
|
2139
|
Chris@49
|
2140 template<typename eT>
|
Chris@49
|
2141 template<typename T1>
|
Chris@49
|
2142 inline
|
Chris@49
|
2143 const Mat<eT>&
|
Chris@49
|
2144 Mat<eT>::operator=(const SpBase<eT, T1>& m)
|
Chris@49
|
2145 {
|
Chris@49
|
2146 arma_extra_debug_sigprint();
|
Chris@49
|
2147
|
Chris@49
|
2148 const SpProxy<T1> p(m.get_ref());
|
Chris@49
|
2149
|
Chris@49
|
2150 init_warm(p.get_n_rows(), p.get_n_cols());
|
Chris@49
|
2151
|
Chris@49
|
2152 fill(eT(0));
|
Chris@49
|
2153
|
Chris@49
|
2154 typename SpProxy<T1>::const_iterator_type it = p.begin();
|
Chris@49
|
2155 typename SpProxy<T1>::const_iterator_type it_end = p.end();
|
Chris@49
|
2156
|
Chris@49
|
2157 while(it != it_end)
|
Chris@49
|
2158 {
|
Chris@49
|
2159 at(it.row(), it.col()) = (*it);
|
Chris@49
|
2160 ++it;
|
Chris@49
|
2161 }
|
Chris@49
|
2162
|
Chris@49
|
2163 return *this;
|
Chris@49
|
2164 }
|
Chris@49
|
2165
|
Chris@49
|
2166
|
Chris@49
|
2167
|
Chris@49
|
2168 template<typename eT>
|
Chris@49
|
2169 template<typename T1>
|
Chris@49
|
2170 inline
|
Chris@49
|
2171 const Mat<eT>&
|
Chris@49
|
2172 Mat<eT>::operator+=(const SpBase<eT, T1>& m)
|
Chris@49
|
2173 {
|
Chris@49
|
2174 arma_extra_debug_sigprint();
|
Chris@49
|
2175
|
Chris@49
|
2176 const SpProxy<T1> p(m.get_ref());
|
Chris@49
|
2177
|
Chris@49
|
2178 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "addition");
|
Chris@49
|
2179
|
Chris@49
|
2180 typename SpProxy<T1>::const_iterator_type it = p.begin();
|
Chris@49
|
2181 typename SpProxy<T1>::const_iterator_type it_end = p.end();
|
Chris@49
|
2182
|
Chris@49
|
2183 while(it != it_end)
|
Chris@49
|
2184 {
|
Chris@49
|
2185 at(it.row(), it.col()) += (*it);
|
Chris@49
|
2186 ++it;
|
Chris@49
|
2187 }
|
Chris@49
|
2188
|
Chris@49
|
2189 return *this;
|
Chris@49
|
2190 }
|
Chris@49
|
2191
|
Chris@49
|
2192
|
Chris@49
|
2193
|
Chris@49
|
2194 template<typename eT>
|
Chris@49
|
2195 template<typename T1>
|
Chris@49
|
2196 inline
|
Chris@49
|
2197 const Mat<eT>&
|
Chris@49
|
2198 Mat<eT>::operator-=(const SpBase<eT, T1>& m)
|
Chris@49
|
2199 {
|
Chris@49
|
2200 arma_extra_debug_sigprint();
|
Chris@49
|
2201
|
Chris@49
|
2202 const SpProxy<T1> p(m.get_ref());
|
Chris@49
|
2203
|
Chris@49
|
2204 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "subtraction");
|
Chris@49
|
2205
|
Chris@49
|
2206 typename SpProxy<T1>::const_iterator_type it = p.begin();
|
Chris@49
|
2207 typename SpProxy<T1>::const_iterator_type it_end = p.end();
|
Chris@49
|
2208
|
Chris@49
|
2209 while(it != it_end)
|
Chris@49
|
2210 {
|
Chris@49
|
2211 at(it.row(), it.col()) -= (*it);
|
Chris@49
|
2212 ++it;
|
Chris@49
|
2213 }
|
Chris@49
|
2214
|
Chris@49
|
2215 return *this;
|
Chris@49
|
2216 }
|
Chris@49
|
2217
|
Chris@49
|
2218
|
Chris@49
|
2219
|
Chris@49
|
2220 template<typename eT>
|
Chris@49
|
2221 template<typename T1>
|
Chris@49
|
2222 inline
|
Chris@49
|
2223 const Mat<eT>&
|
Chris@49
|
2224 Mat<eT>::operator*=(const SpBase<eT, T1>& m)
|
Chris@49
|
2225 {
|
Chris@49
|
2226 arma_extra_debug_sigprint();
|
Chris@49
|
2227
|
Chris@49
|
2228 Mat<eT> z;
|
Chris@49
|
2229 z = (*this) * m.get_ref();
|
Chris@49
|
2230 steal_mem(z);
|
Chris@49
|
2231
|
Chris@49
|
2232 return *this;
|
Chris@49
|
2233 }
|
Chris@49
|
2234
|
Chris@49
|
2235
|
Chris@49
|
2236
|
Chris@49
|
2237 template<typename eT>
|
Chris@49
|
2238 template<typename T1>
|
Chris@49
|
2239 inline
|
Chris@49
|
2240 const Mat<eT>&
|
Chris@49
|
2241 Mat<eT>::operator%=(const SpBase<eT, T1>& m)
|
Chris@49
|
2242 {
|
Chris@49
|
2243 arma_extra_debug_sigprint();
|
Chris@49
|
2244
|
Chris@49
|
2245 const SpProxy<T1> p(m.get_ref());
|
Chris@49
|
2246
|
Chris@49
|
2247 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise multiplication");
|
Chris@49
|
2248
|
Chris@49
|
2249 typename SpProxy<T1>::const_iterator_type it = p.begin();
|
Chris@49
|
2250 typename SpProxy<T1>::const_iterator_type it_end = p.end();
|
Chris@49
|
2251
|
Chris@49
|
2252 // We have to zero everything that isn't being used.
|
Chris@49
|
2253 arrayops::inplace_set(memptr(), eT(0), (it.col() * n_rows) + it.row());
|
Chris@49
|
2254
|
Chris@49
|
2255 while(it != it_end)
|
Chris@49
|
2256 {
|
Chris@49
|
2257 const uword cur_loc = (it.col() * n_rows) + it.row();
|
Chris@49
|
2258
|
Chris@49
|
2259 access::rw(mem[cur_loc]) *= (*it);
|
Chris@49
|
2260
|
Chris@49
|
2261 ++it;
|
Chris@49
|
2262
|
Chris@49
|
2263 const uword next_loc = (it == it_end)
|
Chris@49
|
2264 ? (p.get_n_cols() * n_rows)
|
Chris@49
|
2265 : (it.col() * n_rows) + it.row();
|
Chris@49
|
2266
|
Chris@49
|
2267 arrayops::inplace_set(memptr() + cur_loc + 1, eT(0), (next_loc - cur_loc - 1));
|
Chris@49
|
2268 }
|
Chris@49
|
2269
|
Chris@49
|
2270 return *this;
|
Chris@49
|
2271 }
|
Chris@49
|
2272
|
Chris@49
|
2273
|
Chris@49
|
2274
|
Chris@49
|
2275 template<typename eT>
|
Chris@49
|
2276 template<typename T1>
|
Chris@49
|
2277 inline
|
Chris@49
|
2278 const Mat<eT>&
|
Chris@49
|
2279 Mat<eT>::operator/=(const SpBase<eT, T1>& m)
|
Chris@49
|
2280 {
|
Chris@49
|
2281 arma_extra_debug_sigprint();
|
Chris@49
|
2282
|
Chris@49
|
2283 const SpProxy<T1> p(m.get_ref());
|
Chris@49
|
2284
|
Chris@49
|
2285 arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise division");
|
Chris@49
|
2286
|
Chris@49
|
2287 // If you use this method, you are probably stupid or misguided, but for completeness it is implemented.
|
Chris@49
|
2288 // Unfortunately the best way to do this is loop over every element.
|
Chris@49
|
2289 for(uword c = 0; c < n_cols; ++c)
|
Chris@49
|
2290 for(uword r = 0; r < n_rows; ++r)
|
Chris@49
|
2291 {
|
Chris@49
|
2292 at(r, c) /= p.at(r, c);
|
Chris@49
|
2293 }
|
Chris@49
|
2294
|
Chris@49
|
2295 return *this;
|
Chris@49
|
2296 }
|
Chris@49
|
2297
|
Chris@49
|
2298
|
Chris@49
|
2299
|
Chris@49
|
2300 template<typename eT>
|
Chris@49
|
2301 inline
|
Chris@49
|
2302 mat_injector< Mat<eT> >
|
Chris@49
|
2303 Mat<eT>::operator<<(const eT val)
|
Chris@49
|
2304 {
|
Chris@49
|
2305 return mat_injector< Mat<eT> >(*this, val);
|
Chris@49
|
2306 }
|
Chris@49
|
2307
|
Chris@49
|
2308
|
Chris@49
|
2309
|
Chris@49
|
2310 template<typename eT>
|
Chris@49
|
2311 inline
|
Chris@49
|
2312 mat_injector< Mat<eT> >
|
Chris@49
|
2313 Mat<eT>::operator<<(const injector_end_of_row<>& x)
|
Chris@49
|
2314 {
|
Chris@49
|
2315 return mat_injector< Mat<eT> >(*this, x);
|
Chris@49
|
2316 }
|
Chris@49
|
2317
|
Chris@49
|
2318
|
Chris@49
|
2319
|
Chris@49
|
2320 //! creation of subview (row vector)
|
Chris@49
|
2321 template<typename eT>
|
Chris@49
|
2322 arma_inline
|
Chris@49
|
2323 subview_row<eT>
|
Chris@49
|
2324 Mat<eT>::row(const uword row_num)
|
Chris@49
|
2325 {
|
Chris@49
|
2326 arma_extra_debug_sigprint();
|
Chris@49
|
2327
|
Chris@49
|
2328 arma_debug_check( row_num >= n_rows, "Mat::row(): index out of bounds" );
|
Chris@49
|
2329
|
Chris@49
|
2330 return subview_row<eT>(*this, row_num);
|
Chris@49
|
2331 }
|
Chris@49
|
2332
|
Chris@49
|
2333
|
Chris@49
|
2334
|
Chris@49
|
2335 //! creation of subview (row vector)
|
Chris@49
|
2336 template<typename eT>
|
Chris@49
|
2337 arma_inline
|
Chris@49
|
2338 const subview_row<eT>
|
Chris@49
|
2339 Mat<eT>::row(const uword row_num) const
|
Chris@49
|
2340 {
|
Chris@49
|
2341 arma_extra_debug_sigprint();
|
Chris@49
|
2342
|
Chris@49
|
2343 arma_debug_check( row_num >= n_rows, "Mat::row(): index out of bounds" );
|
Chris@49
|
2344
|
Chris@49
|
2345 return subview_row<eT>(*this, row_num);
|
Chris@49
|
2346 }
|
Chris@49
|
2347
|
Chris@49
|
2348
|
Chris@49
|
2349
|
Chris@49
|
2350 template<typename eT>
|
Chris@49
|
2351 inline
|
Chris@49
|
2352 subview_row<eT>
|
Chris@49
|
2353 Mat<eT>::operator()(const uword row_num, const span& col_span)
|
Chris@49
|
2354 {
|
Chris@49
|
2355 arma_extra_debug_sigprint();
|
Chris@49
|
2356
|
Chris@49
|
2357 const bool col_all = col_span.whole;
|
Chris@49
|
2358
|
Chris@49
|
2359 const uword local_n_cols = n_cols;
|
Chris@49
|
2360
|
Chris@49
|
2361 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
2362 const uword in_col2 = col_span.b;
|
Chris@49
|
2363 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
2364
|
Chris@49
|
2365 arma_debug_check
|
Chris@49
|
2366 (
|
Chris@49
|
2367 (row_num >= n_rows)
|
Chris@49
|
2368 ||
|
Chris@49
|
2369 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
2370 ,
|
Chris@49
|
2371 "Mat::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
2372 );
|
Chris@49
|
2373
|
Chris@49
|
2374 return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);
|
Chris@49
|
2375 }
|
Chris@49
|
2376
|
Chris@49
|
2377
|
Chris@49
|
2378
|
Chris@49
|
2379 template<typename eT>
|
Chris@49
|
2380 inline
|
Chris@49
|
2381 const subview_row<eT>
|
Chris@49
|
2382 Mat<eT>::operator()(const uword row_num, const span& col_span) const
|
Chris@49
|
2383 {
|
Chris@49
|
2384 arma_extra_debug_sigprint();
|
Chris@49
|
2385
|
Chris@49
|
2386 const bool col_all = col_span.whole;
|
Chris@49
|
2387
|
Chris@49
|
2388 const uword local_n_cols = n_cols;
|
Chris@49
|
2389
|
Chris@49
|
2390 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
2391 const uword in_col2 = col_span.b;
|
Chris@49
|
2392 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
2393
|
Chris@49
|
2394 arma_debug_check
|
Chris@49
|
2395 (
|
Chris@49
|
2396 (row_num >= n_rows)
|
Chris@49
|
2397 ||
|
Chris@49
|
2398 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
2399 ,
|
Chris@49
|
2400 "Mat::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
2401 );
|
Chris@49
|
2402
|
Chris@49
|
2403 return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);
|
Chris@49
|
2404 }
|
Chris@49
|
2405
|
Chris@49
|
2406
|
Chris@49
|
2407
|
Chris@49
|
2408 //! creation of subview (column vector)
|
Chris@49
|
2409 template<typename eT>
|
Chris@49
|
2410 arma_inline
|
Chris@49
|
2411 subview_col<eT>
|
Chris@49
|
2412 Mat<eT>::col(const uword col_num)
|
Chris@49
|
2413 {
|
Chris@49
|
2414 arma_extra_debug_sigprint();
|
Chris@49
|
2415
|
Chris@49
|
2416 arma_debug_check( col_num >= n_cols, "Mat::col(): index out of bounds");
|
Chris@49
|
2417
|
Chris@49
|
2418 return subview_col<eT>(*this, col_num);
|
Chris@49
|
2419 }
|
Chris@49
|
2420
|
Chris@49
|
2421
|
Chris@49
|
2422
|
Chris@49
|
2423 //! creation of subview (column vector)
|
Chris@49
|
2424 template<typename eT>
|
Chris@49
|
2425 arma_inline
|
Chris@49
|
2426 const subview_col<eT>
|
Chris@49
|
2427 Mat<eT>::col(const uword col_num) const
|
Chris@49
|
2428 {
|
Chris@49
|
2429 arma_extra_debug_sigprint();
|
Chris@49
|
2430
|
Chris@49
|
2431 arma_debug_check( col_num >= n_cols, "Mat::col(): index out of bounds");
|
Chris@49
|
2432
|
Chris@49
|
2433 return subview_col<eT>(*this, col_num);
|
Chris@49
|
2434 }
|
Chris@49
|
2435
|
Chris@49
|
2436
|
Chris@49
|
2437
|
Chris@49
|
2438 template<typename eT>
|
Chris@49
|
2439 inline
|
Chris@49
|
2440 subview_col<eT>
|
Chris@49
|
2441 Mat<eT>::operator()(const span& row_span, const uword col_num)
|
Chris@49
|
2442 {
|
Chris@49
|
2443 arma_extra_debug_sigprint();
|
Chris@49
|
2444
|
Chris@49
|
2445 const bool row_all = row_span.whole;
|
Chris@49
|
2446
|
Chris@49
|
2447 const uword local_n_rows = n_rows;
|
Chris@49
|
2448
|
Chris@49
|
2449 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
2450 const uword in_row2 = row_span.b;
|
Chris@49
|
2451 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
2452
|
Chris@49
|
2453 arma_debug_check
|
Chris@49
|
2454 (
|
Chris@49
|
2455 (col_num >= n_cols)
|
Chris@49
|
2456 ||
|
Chris@49
|
2457 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
2458 ,
|
Chris@49
|
2459 "Mat::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
2460 );
|
Chris@49
|
2461
|
Chris@49
|
2462 return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);
|
Chris@49
|
2463 }
|
Chris@49
|
2464
|
Chris@49
|
2465
|
Chris@49
|
2466
|
Chris@49
|
2467 template<typename eT>
|
Chris@49
|
2468 inline
|
Chris@49
|
2469 const subview_col<eT>
|
Chris@49
|
2470 Mat<eT>::operator()(const span& row_span, const uword col_num) const
|
Chris@49
|
2471 {
|
Chris@49
|
2472 arma_extra_debug_sigprint();
|
Chris@49
|
2473
|
Chris@49
|
2474 const bool row_all = row_span.whole;
|
Chris@49
|
2475
|
Chris@49
|
2476 const uword local_n_rows = n_rows;
|
Chris@49
|
2477
|
Chris@49
|
2478 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
2479 const uword in_row2 = row_span.b;
|
Chris@49
|
2480 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
2481
|
Chris@49
|
2482 arma_debug_check
|
Chris@49
|
2483 (
|
Chris@49
|
2484 (col_num >= n_cols)
|
Chris@49
|
2485 ||
|
Chris@49
|
2486 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
2487 ,
|
Chris@49
|
2488 "Mat::operator(): indices out of bounds or incorrectly used"
|
Chris@49
|
2489 );
|
Chris@49
|
2490
|
Chris@49
|
2491 return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);
|
Chris@49
|
2492 }
|
Chris@49
|
2493
|
Chris@49
|
2494
|
Chris@49
|
2495
|
Chris@49
|
2496 //! create a Col object which uses memory from an existing matrix object.
|
Chris@49
|
2497 //! this approach is currently not alias safe
|
Chris@49
|
2498 //! and does not take into account that the parent matrix object could be deleted.
|
Chris@49
|
2499 //! if deleted memory is accessed by the created Col object,
|
Chris@49
|
2500 //! it will cause memory corruption and/or a crash
|
Chris@49
|
2501 template<typename eT>
|
Chris@49
|
2502 inline
|
Chris@49
|
2503 Col<eT>
|
Chris@49
|
2504 Mat<eT>::unsafe_col(const uword col_num)
|
Chris@49
|
2505 {
|
Chris@49
|
2506 arma_extra_debug_sigprint();
|
Chris@49
|
2507
|
Chris@49
|
2508 arma_debug_check( col_num >= n_cols, "Mat::unsafe_col(): index out of bounds");
|
Chris@49
|
2509
|
Chris@49
|
2510 return Col<eT>(colptr(col_num), n_rows, false, true);
|
Chris@49
|
2511 }
|
Chris@49
|
2512
|
Chris@49
|
2513
|
Chris@49
|
2514
|
Chris@49
|
2515 //! create a Col object which uses memory from an existing matrix object.
|
Chris@49
|
2516 //! this approach is currently not alias safe
|
Chris@49
|
2517 //! and does not take into account that the parent matrix object could be deleted.
|
Chris@49
|
2518 //! if deleted memory is accessed by the created Col object,
|
Chris@49
|
2519 //! it will cause memory corruption and/or a crash
|
Chris@49
|
2520 template<typename eT>
|
Chris@49
|
2521 inline
|
Chris@49
|
2522 const Col<eT>
|
Chris@49
|
2523 Mat<eT>::unsafe_col(const uword col_num) const
|
Chris@49
|
2524 {
|
Chris@49
|
2525 arma_extra_debug_sigprint();
|
Chris@49
|
2526
|
Chris@49
|
2527 arma_debug_check( col_num >= n_cols, "Mat::unsafe_col(): index out of bounds");
|
Chris@49
|
2528
|
Chris@49
|
2529 typedef const Col<eT> out_type;
|
Chris@49
|
2530
|
Chris@49
|
2531 return out_type(const_cast<eT*>(colptr(col_num)), n_rows, false, true);
|
Chris@49
|
2532 }
|
Chris@49
|
2533
|
Chris@49
|
2534
|
Chris@49
|
2535
|
Chris@49
|
2536 //! creation of subview (submatrix comprised of specified row vectors)
|
Chris@49
|
2537 template<typename eT>
|
Chris@49
|
2538 arma_inline
|
Chris@49
|
2539 subview<eT>
|
Chris@49
|
2540 Mat<eT>::rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
2541 {
|
Chris@49
|
2542 arma_extra_debug_sigprint();
|
Chris@49
|
2543
|
Chris@49
|
2544 arma_debug_check
|
Chris@49
|
2545 (
|
Chris@49
|
2546 (in_row1 > in_row2) || (in_row2 >= n_rows),
|
Chris@49
|
2547 "Mat::rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
2548 );
|
Chris@49
|
2549
|
Chris@49
|
2550 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2551
|
Chris@49
|
2552 return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );
|
Chris@49
|
2553 }
|
Chris@49
|
2554
|
Chris@49
|
2555
|
Chris@49
|
2556
|
Chris@49
|
2557 //! creation of subview (submatrix comprised of specified row vectors)
|
Chris@49
|
2558 template<typename eT>
|
Chris@49
|
2559 arma_inline
|
Chris@49
|
2560 const subview<eT>
|
Chris@49
|
2561 Mat<eT>::rows(const uword in_row1, const uword in_row2) const
|
Chris@49
|
2562 {
|
Chris@49
|
2563 arma_extra_debug_sigprint();
|
Chris@49
|
2564
|
Chris@49
|
2565 arma_debug_check
|
Chris@49
|
2566 (
|
Chris@49
|
2567 (in_row1 > in_row2) || (in_row2 >= n_rows),
|
Chris@49
|
2568 "Mat::rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
2569 );
|
Chris@49
|
2570
|
Chris@49
|
2571 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2572
|
Chris@49
|
2573 return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );
|
Chris@49
|
2574 }
|
Chris@49
|
2575
|
Chris@49
|
2576
|
Chris@49
|
2577
|
Chris@49
|
2578 //! creation of subview (submatrix comprised of specified column vectors)
|
Chris@49
|
2579 template<typename eT>
|
Chris@49
|
2580 arma_inline
|
Chris@49
|
2581 subview<eT>
|
Chris@49
|
2582 Mat<eT>::cols(const uword in_col1, const uword in_col2)
|
Chris@49
|
2583 {
|
Chris@49
|
2584 arma_extra_debug_sigprint();
|
Chris@49
|
2585
|
Chris@49
|
2586 arma_debug_check
|
Chris@49
|
2587 (
|
Chris@49
|
2588 (in_col1 > in_col2) || (in_col2 >= n_cols),
|
Chris@49
|
2589 "Mat::cols(): indices out of bounds or incorrectly used"
|
Chris@49
|
2590 );
|
Chris@49
|
2591
|
Chris@49
|
2592 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2593
|
Chris@49
|
2594 return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);
|
Chris@49
|
2595 }
|
Chris@49
|
2596
|
Chris@49
|
2597
|
Chris@49
|
2598
|
Chris@49
|
2599 //! creation of subview (submatrix comprised of specified column vectors)
|
Chris@49
|
2600 template<typename eT>
|
Chris@49
|
2601 arma_inline
|
Chris@49
|
2602 const subview<eT>
|
Chris@49
|
2603 Mat<eT>::cols(const uword in_col1, const uword in_col2) const
|
Chris@49
|
2604 {
|
Chris@49
|
2605 arma_extra_debug_sigprint();
|
Chris@49
|
2606
|
Chris@49
|
2607 arma_debug_check
|
Chris@49
|
2608 (
|
Chris@49
|
2609 (in_col1 > in_col2) || (in_col2 >= n_cols),
|
Chris@49
|
2610 "Mat::cols(): indices out of bounds or incorrectly used"
|
Chris@49
|
2611 );
|
Chris@49
|
2612
|
Chris@49
|
2613 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2614
|
Chris@49
|
2615 return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);
|
Chris@49
|
2616 }
|
Chris@49
|
2617
|
Chris@49
|
2618
|
Chris@49
|
2619
|
Chris@49
|
2620 //! creation of subview (submatrix)
|
Chris@49
|
2621 template<typename eT>
|
Chris@49
|
2622 arma_inline
|
Chris@49
|
2623 subview<eT>
|
Chris@49
|
2624 Mat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)
|
Chris@49
|
2625 {
|
Chris@49
|
2626 arma_extra_debug_sigprint();
|
Chris@49
|
2627
|
Chris@49
|
2628 arma_debug_check
|
Chris@49
|
2629 (
|
Chris@49
|
2630 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
|
Chris@49
|
2631 "Mat::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2632 );
|
Chris@49
|
2633
|
Chris@49
|
2634 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2635 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2636
|
Chris@49
|
2637 return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);
|
Chris@49
|
2638 }
|
Chris@49
|
2639
|
Chris@49
|
2640
|
Chris@49
|
2641
|
Chris@49
|
2642 //! creation of subview (generic submatrix)
|
Chris@49
|
2643 template<typename eT>
|
Chris@49
|
2644 arma_inline
|
Chris@49
|
2645 const subview<eT>
|
Chris@49
|
2646 Mat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const
|
Chris@49
|
2647 {
|
Chris@49
|
2648 arma_extra_debug_sigprint();
|
Chris@49
|
2649
|
Chris@49
|
2650 arma_debug_check
|
Chris@49
|
2651 (
|
Chris@49
|
2652 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),
|
Chris@49
|
2653 "Mat::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2654 );
|
Chris@49
|
2655
|
Chris@49
|
2656 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
2657 const uword subview_n_cols = in_col2 - in_col1 + 1;
|
Chris@49
|
2658
|
Chris@49
|
2659 return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);
|
Chris@49
|
2660 }
|
Chris@49
|
2661
|
Chris@49
|
2662
|
Chris@49
|
2663
|
Chris@49
|
2664 //! creation of subview (submatrix)
|
Chris@49
|
2665 template<typename eT>
|
Chris@49
|
2666 inline
|
Chris@49
|
2667 subview<eT>
|
Chris@49
|
2668 Mat<eT>::submat(const span& row_span, const span& col_span)
|
Chris@49
|
2669 {
|
Chris@49
|
2670 arma_extra_debug_sigprint();
|
Chris@49
|
2671
|
Chris@49
|
2672 const bool row_all = row_span.whole;
|
Chris@49
|
2673 const bool col_all = col_span.whole;
|
Chris@49
|
2674
|
Chris@49
|
2675 const uword local_n_rows = n_rows;
|
Chris@49
|
2676 const uword local_n_cols = n_cols;
|
Chris@49
|
2677
|
Chris@49
|
2678 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
2679 const uword in_row2 = row_span.b;
|
Chris@49
|
2680 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
2681
|
Chris@49
|
2682 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
2683 const uword in_col2 = col_span.b;
|
Chris@49
|
2684 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
2685
|
Chris@49
|
2686 arma_debug_check
|
Chris@49
|
2687 (
|
Chris@49
|
2688 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
2689 ||
|
Chris@49
|
2690 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
2691 ,
|
Chris@49
|
2692 "Mat::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2693 );
|
Chris@49
|
2694
|
Chris@49
|
2695 return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);
|
Chris@49
|
2696 }
|
Chris@49
|
2697
|
Chris@49
|
2698
|
Chris@49
|
2699
|
Chris@49
|
2700 //! creation of subview (generic submatrix)
|
Chris@49
|
2701 template<typename eT>
|
Chris@49
|
2702 inline
|
Chris@49
|
2703 const subview<eT>
|
Chris@49
|
2704 Mat<eT>::submat(const span& row_span, const span& col_span) const
|
Chris@49
|
2705 {
|
Chris@49
|
2706 arma_extra_debug_sigprint();
|
Chris@49
|
2707
|
Chris@49
|
2708 const bool row_all = row_span.whole;
|
Chris@49
|
2709 const bool col_all = col_span.whole;
|
Chris@49
|
2710
|
Chris@49
|
2711 const uword local_n_rows = n_rows;
|
Chris@49
|
2712 const uword local_n_cols = n_cols;
|
Chris@49
|
2713
|
Chris@49
|
2714 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
2715 const uword in_row2 = row_span.b;
|
Chris@49
|
2716 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
2717
|
Chris@49
|
2718 const uword in_col1 = col_all ? 0 : col_span.a;
|
Chris@49
|
2719 const uword in_col2 = col_span.b;
|
Chris@49
|
2720 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
|
Chris@49
|
2721
|
Chris@49
|
2722 arma_debug_check
|
Chris@49
|
2723 (
|
Chris@49
|
2724 ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
|
Chris@49
|
2725 ||
|
Chris@49
|
2726 ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
|
Chris@49
|
2727 ,
|
Chris@49
|
2728 "Mat::submat(): indices out of bounds or incorrectly used"
|
Chris@49
|
2729 );
|
Chris@49
|
2730
|
Chris@49
|
2731 return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);
|
Chris@49
|
2732 }
|
Chris@49
|
2733
|
Chris@49
|
2734
|
Chris@49
|
2735
|
Chris@49
|
2736 template<typename eT>
|
Chris@49
|
2737 inline
|
Chris@49
|
2738 subview<eT>
|
Chris@49
|
2739 Mat<eT>::operator()(const span& row_span, const span& col_span)
|
Chris@49
|
2740 {
|
Chris@49
|
2741 arma_extra_debug_sigprint();
|
Chris@49
|
2742
|
Chris@49
|
2743 return (*this).submat(row_span, col_span);
|
Chris@49
|
2744 }
|
Chris@49
|
2745
|
Chris@49
|
2746
|
Chris@49
|
2747
|
Chris@49
|
2748 template<typename eT>
|
Chris@49
|
2749 inline
|
Chris@49
|
2750 const subview<eT>
|
Chris@49
|
2751 Mat<eT>::operator()(const span& row_span, const span& col_span) const
|
Chris@49
|
2752 {
|
Chris@49
|
2753 arma_extra_debug_sigprint();
|
Chris@49
|
2754
|
Chris@49
|
2755 return (*this).submat(row_span, col_span);
|
Chris@49
|
2756 }
|
Chris@49
|
2757
|
Chris@49
|
2758
|
Chris@49
|
2759
|
Chris@49
|
2760 template<typename eT>
|
Chris@49
|
2761 template<typename T1>
|
Chris@49
|
2762 arma_inline
|
Chris@49
|
2763 subview_elem1<eT,T1>
|
Chris@49
|
2764 Mat<eT>::elem(const Base<uword,T1>& a)
|
Chris@49
|
2765 {
|
Chris@49
|
2766 arma_extra_debug_sigprint();
|
Chris@49
|
2767
|
Chris@49
|
2768 return subview_elem1<eT,T1>(*this, a);
|
Chris@49
|
2769 }
|
Chris@49
|
2770
|
Chris@49
|
2771
|
Chris@49
|
2772
|
Chris@49
|
2773 template<typename eT>
|
Chris@49
|
2774 template<typename T1>
|
Chris@49
|
2775 arma_inline
|
Chris@49
|
2776 const subview_elem1<eT,T1>
|
Chris@49
|
2777 Mat<eT>::elem(const Base<uword,T1>& a) const
|
Chris@49
|
2778 {
|
Chris@49
|
2779 arma_extra_debug_sigprint();
|
Chris@49
|
2780
|
Chris@49
|
2781 return subview_elem1<eT,T1>(*this, a);
|
Chris@49
|
2782 }
|
Chris@49
|
2783
|
Chris@49
|
2784
|
Chris@49
|
2785
|
Chris@49
|
2786 template<typename eT>
|
Chris@49
|
2787 template<typename T1>
|
Chris@49
|
2788 arma_inline
|
Chris@49
|
2789 subview_elem1<eT,T1>
|
Chris@49
|
2790 Mat<eT>::operator()(const Base<uword,T1>& a)
|
Chris@49
|
2791 {
|
Chris@49
|
2792 arma_extra_debug_sigprint();
|
Chris@49
|
2793
|
Chris@49
|
2794 return subview_elem1<eT,T1>(*this, a);
|
Chris@49
|
2795 }
|
Chris@49
|
2796
|
Chris@49
|
2797
|
Chris@49
|
2798
|
Chris@49
|
2799 template<typename eT>
|
Chris@49
|
2800 template<typename T1>
|
Chris@49
|
2801 arma_inline
|
Chris@49
|
2802 const subview_elem1<eT,T1>
|
Chris@49
|
2803 Mat<eT>::operator()(const Base<uword,T1>& a) const
|
Chris@49
|
2804 {
|
Chris@49
|
2805 arma_extra_debug_sigprint();
|
Chris@49
|
2806
|
Chris@49
|
2807 return subview_elem1<eT,T1>(*this, a);
|
Chris@49
|
2808 }
|
Chris@49
|
2809
|
Chris@49
|
2810
|
Chris@49
|
2811
|
Chris@49
|
2812 template<typename eT>
|
Chris@49
|
2813 template<typename T1, typename T2>
|
Chris@49
|
2814 arma_inline
|
Chris@49
|
2815 subview_elem2<eT,T1,T2>
|
Chris@49
|
2816 Mat<eT>::elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci)
|
Chris@49
|
2817 {
|
Chris@49
|
2818 arma_extra_debug_sigprint();
|
Chris@49
|
2819
|
Chris@49
|
2820 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
|
Chris@49
|
2821 }
|
Chris@49
|
2822
|
Chris@49
|
2823
|
Chris@49
|
2824
|
Chris@49
|
2825 template<typename eT>
|
Chris@49
|
2826 template<typename T1, typename T2>
|
Chris@49
|
2827 arma_inline
|
Chris@49
|
2828 const subview_elem2<eT,T1,T2>
|
Chris@49
|
2829 Mat<eT>::elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const
|
Chris@49
|
2830 {
|
Chris@49
|
2831 arma_extra_debug_sigprint();
|
Chris@49
|
2832
|
Chris@49
|
2833 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
|
Chris@49
|
2834 }
|
Chris@49
|
2835
|
Chris@49
|
2836
|
Chris@49
|
2837
|
Chris@49
|
2838 template<typename eT>
|
Chris@49
|
2839 template<typename T1, typename T2>
|
Chris@49
|
2840 arma_inline
|
Chris@49
|
2841 subview_elem2<eT,T1,T2>
|
Chris@49
|
2842 Mat<eT>::submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci)
|
Chris@49
|
2843 {
|
Chris@49
|
2844 arma_extra_debug_sigprint();
|
Chris@49
|
2845
|
Chris@49
|
2846 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
|
Chris@49
|
2847 }
|
Chris@49
|
2848
|
Chris@49
|
2849
|
Chris@49
|
2850
|
Chris@49
|
2851 template<typename eT>
|
Chris@49
|
2852 template<typename T1, typename T2>
|
Chris@49
|
2853 arma_inline
|
Chris@49
|
2854 const subview_elem2<eT,T1,T2>
|
Chris@49
|
2855 Mat<eT>::submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const
|
Chris@49
|
2856 {
|
Chris@49
|
2857 arma_extra_debug_sigprint();
|
Chris@49
|
2858
|
Chris@49
|
2859 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
|
Chris@49
|
2860 }
|
Chris@49
|
2861
|
Chris@49
|
2862
|
Chris@49
|
2863
|
Chris@49
|
2864 template<typename eT>
|
Chris@49
|
2865 template<typename T1, typename T2>
|
Chris@49
|
2866 arma_inline
|
Chris@49
|
2867 subview_elem2<eT,T1,T2>
|
Chris@49
|
2868 Mat<eT>::operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci)
|
Chris@49
|
2869 {
|
Chris@49
|
2870 arma_extra_debug_sigprint();
|
Chris@49
|
2871
|
Chris@49
|
2872 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
|
Chris@49
|
2873 }
|
Chris@49
|
2874
|
Chris@49
|
2875
|
Chris@49
|
2876
|
Chris@49
|
2877 template<typename eT>
|
Chris@49
|
2878 template<typename T1, typename T2>
|
Chris@49
|
2879 arma_inline
|
Chris@49
|
2880 const subview_elem2<eT,T1,T2>
|
Chris@49
|
2881 Mat<eT>::operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const
|
Chris@49
|
2882 {
|
Chris@49
|
2883 arma_extra_debug_sigprint();
|
Chris@49
|
2884
|
Chris@49
|
2885 return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);
|
Chris@49
|
2886 }
|
Chris@49
|
2887
|
Chris@49
|
2888
|
Chris@49
|
2889
|
Chris@49
|
2890 template<typename eT>
|
Chris@49
|
2891 template<typename T1>
|
Chris@49
|
2892 arma_inline
|
Chris@49
|
2893 subview_elem2<eT,T1,T1>
|
Chris@49
|
2894 Mat<eT>::rows(const Base<uword,T1>& ri)
|
Chris@49
|
2895 {
|
Chris@49
|
2896 arma_extra_debug_sigprint();
|
Chris@49
|
2897
|
Chris@49
|
2898 return subview_elem2<eT,T1,T1>(*this, ri, ri, false, true);
|
Chris@49
|
2899 }
|
Chris@49
|
2900
|
Chris@49
|
2901
|
Chris@49
|
2902
|
Chris@49
|
2903 template<typename eT>
|
Chris@49
|
2904 template<typename T1>
|
Chris@49
|
2905 arma_inline
|
Chris@49
|
2906 const subview_elem2<eT,T1,T1>
|
Chris@49
|
2907 Mat<eT>::rows(const Base<uword,T1>& ri) const
|
Chris@49
|
2908 {
|
Chris@49
|
2909 arma_extra_debug_sigprint();
|
Chris@49
|
2910
|
Chris@49
|
2911 return subview_elem2<eT,T1,T1>(*this, ri, ri, false, true);
|
Chris@49
|
2912 }
|
Chris@49
|
2913
|
Chris@49
|
2914
|
Chris@49
|
2915
|
Chris@49
|
2916 template<typename eT>
|
Chris@49
|
2917 template<typename T2>
|
Chris@49
|
2918 arma_inline
|
Chris@49
|
2919 subview_elem2<eT,T2,T2>
|
Chris@49
|
2920 Mat<eT>::cols(const Base<uword,T2>& ci)
|
Chris@49
|
2921 {
|
Chris@49
|
2922 arma_extra_debug_sigprint();
|
Chris@49
|
2923
|
Chris@49
|
2924 return subview_elem2<eT,T2,T2>(*this, ci, ci, true, false);
|
Chris@49
|
2925 }
|
Chris@49
|
2926
|
Chris@49
|
2927
|
Chris@49
|
2928
|
Chris@49
|
2929 template<typename eT>
|
Chris@49
|
2930 template<typename T2>
|
Chris@49
|
2931 arma_inline
|
Chris@49
|
2932 const subview_elem2<eT,T2,T2>
|
Chris@49
|
2933 Mat<eT>::cols(const Base<uword,T2>& ci) const
|
Chris@49
|
2934 {
|
Chris@49
|
2935 arma_extra_debug_sigprint();
|
Chris@49
|
2936
|
Chris@49
|
2937 return subview_elem2<eT,T2,T2>(*this, ci, ci, true, false);
|
Chris@49
|
2938 }
|
Chris@49
|
2939
|
Chris@49
|
2940
|
Chris@49
|
2941
|
Chris@49
|
2942 template<typename eT>
|
Chris@49
|
2943 arma_inline
|
Chris@49
|
2944 subview_each1< Mat<eT>, 0 >
|
Chris@49
|
2945 Mat<eT>::each_col()
|
Chris@49
|
2946 {
|
Chris@49
|
2947 arma_extra_debug_sigprint();
|
Chris@49
|
2948
|
Chris@49
|
2949 return subview_each1< Mat<eT>, 0>(*this);
|
Chris@49
|
2950 }
|
Chris@49
|
2951
|
Chris@49
|
2952
|
Chris@49
|
2953
|
Chris@49
|
2954 template<typename eT>
|
Chris@49
|
2955 arma_inline
|
Chris@49
|
2956 subview_each1< Mat<eT>, 1 >
|
Chris@49
|
2957 Mat<eT>::each_row()
|
Chris@49
|
2958 {
|
Chris@49
|
2959 arma_extra_debug_sigprint();
|
Chris@49
|
2960
|
Chris@49
|
2961 return subview_each1< Mat<eT>, 1>(*this);
|
Chris@49
|
2962 }
|
Chris@49
|
2963
|
Chris@49
|
2964
|
Chris@49
|
2965
|
Chris@49
|
2966 template<typename eT>
|
Chris@49
|
2967 template<typename T1>
|
Chris@49
|
2968 inline
|
Chris@49
|
2969 subview_each2< Mat<eT>, 0, T1 >
|
Chris@49
|
2970 Mat<eT>::each_col(const Base<uword, T1>& indices)
|
Chris@49
|
2971 {
|
Chris@49
|
2972 arma_extra_debug_sigprint();
|
Chris@49
|
2973
|
Chris@49
|
2974 return subview_each2< Mat<eT>, 0, T1 >(*this, indices);
|
Chris@49
|
2975 }
|
Chris@49
|
2976
|
Chris@49
|
2977
|
Chris@49
|
2978
|
Chris@49
|
2979 template<typename eT>
|
Chris@49
|
2980 template<typename T1>
|
Chris@49
|
2981 inline
|
Chris@49
|
2982 subview_each2< Mat<eT>, 1, T1 >
|
Chris@49
|
2983 Mat<eT>::each_row(const Base<uword, T1>& indices)
|
Chris@49
|
2984 {
|
Chris@49
|
2985 arma_extra_debug_sigprint();
|
Chris@49
|
2986
|
Chris@49
|
2987 return subview_each2< Mat<eT>, 1, T1 >(*this, indices);
|
Chris@49
|
2988 }
|
Chris@49
|
2989
|
Chris@49
|
2990
|
Chris@49
|
2991
|
Chris@49
|
2992 //! creation of diagview (diagonal)
|
Chris@49
|
2993 template<typename eT>
|
Chris@49
|
2994 arma_inline
|
Chris@49
|
2995 diagview<eT>
|
Chris@49
|
2996 Mat<eT>::diag(const sword in_id)
|
Chris@49
|
2997 {
|
Chris@49
|
2998 arma_extra_debug_sigprint();
|
Chris@49
|
2999
|
Chris@49
|
3000 const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;
|
Chris@49
|
3001 const uword col_offset = (in_id > 0) ? uword( in_id) : 0;
|
Chris@49
|
3002
|
Chris@49
|
3003 arma_debug_check
|
Chris@49
|
3004 (
|
Chris@49
|
3005 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
|
Chris@49
|
3006 "Mat::diag(): requested diagonal out of bounds"
|
Chris@49
|
3007 );
|
Chris@49
|
3008
|
Chris@49
|
3009 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
|
Chris@49
|
3010
|
Chris@49
|
3011 return diagview<eT>(*this, row_offset, col_offset, len);
|
Chris@49
|
3012 }
|
Chris@49
|
3013
|
Chris@49
|
3014
|
Chris@49
|
3015
|
Chris@49
|
3016 //! creation of diagview (diagonal)
|
Chris@49
|
3017 template<typename eT>
|
Chris@49
|
3018 arma_inline
|
Chris@49
|
3019 const diagview<eT>
|
Chris@49
|
3020 Mat<eT>::diag(const sword in_id) const
|
Chris@49
|
3021 {
|
Chris@49
|
3022 arma_extra_debug_sigprint();
|
Chris@49
|
3023
|
Chris@49
|
3024 const uword row_offset = (in_id < 0) ? -in_id : 0;
|
Chris@49
|
3025 const uword col_offset = (in_id > 0) ? in_id : 0;
|
Chris@49
|
3026
|
Chris@49
|
3027 arma_debug_check
|
Chris@49
|
3028 (
|
Chris@49
|
3029 ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),
|
Chris@49
|
3030 "Mat::diag(): requested diagonal out of bounds"
|
Chris@49
|
3031 );
|
Chris@49
|
3032
|
Chris@49
|
3033 const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);
|
Chris@49
|
3034
|
Chris@49
|
3035 return diagview<eT>(*this, row_offset, col_offset, len);
|
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 void
|
Chris@49
|
3043 Mat<eT>::swap_rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
3044 {
|
Chris@49
|
3045 arma_extra_debug_sigprint();
|
Chris@49
|
3046
|
Chris@49
|
3047 const uword local_n_rows = n_rows;
|
Chris@49
|
3048 const uword local_n_cols = n_cols;
|
Chris@49
|
3049
|
Chris@49
|
3050 arma_debug_check
|
Chris@49
|
3051 (
|
Chris@49
|
3052 (in_row1 >= local_n_rows) || (in_row2 >= local_n_rows),
|
Chris@49
|
3053 "Mat::swap_rows(): index out of bounds"
|
Chris@49
|
3054 );
|
Chris@49
|
3055
|
Chris@49
|
3056 if(n_elem > 0)
|
Chris@49
|
3057 {
|
Chris@49
|
3058 for(uword ucol=0; ucol < local_n_cols; ++ucol)
|
Chris@49
|
3059 {
|
Chris@49
|
3060 const uword offset = ucol * local_n_rows;
|
Chris@49
|
3061 const uword pos1 = in_row1 + offset;
|
Chris@49
|
3062 const uword pos2 = in_row2 + offset;
|
Chris@49
|
3063
|
Chris@49
|
3064 std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) );
|
Chris@49
|
3065 }
|
Chris@49
|
3066 }
|
Chris@49
|
3067 }
|
Chris@49
|
3068
|
Chris@49
|
3069
|
Chris@49
|
3070
|
Chris@49
|
3071 template<typename eT>
|
Chris@49
|
3072 inline
|
Chris@49
|
3073 void
|
Chris@49
|
3074 Mat<eT>::swap_cols(const uword in_colA, const uword in_colB)
|
Chris@49
|
3075 {
|
Chris@49
|
3076 arma_extra_debug_sigprint();
|
Chris@49
|
3077
|
Chris@49
|
3078 const uword local_n_rows = n_rows;
|
Chris@49
|
3079 const uword local_n_cols = n_cols;
|
Chris@49
|
3080
|
Chris@49
|
3081 arma_debug_check
|
Chris@49
|
3082 (
|
Chris@49
|
3083 (in_colA >= local_n_cols) || (in_colB >= local_n_cols),
|
Chris@49
|
3084 "Mat::swap_cols(): index out of bounds"
|
Chris@49
|
3085 );
|
Chris@49
|
3086
|
Chris@49
|
3087 if(n_elem > 0)
|
Chris@49
|
3088 {
|
Chris@49
|
3089 eT* ptrA = colptr(in_colA);
|
Chris@49
|
3090 eT* ptrB = colptr(in_colB);
|
Chris@49
|
3091
|
Chris@49
|
3092 eT tmp_i;
|
Chris@49
|
3093 eT tmp_j;
|
Chris@49
|
3094
|
Chris@49
|
3095 uword iq,jq;
|
Chris@49
|
3096 for(iq=0, jq=1; jq < local_n_rows; iq+=2, jq+=2)
|
Chris@49
|
3097 {
|
Chris@49
|
3098 tmp_i = ptrA[iq];
|
Chris@49
|
3099 tmp_j = ptrA[jq];
|
Chris@49
|
3100
|
Chris@49
|
3101 ptrA[iq] = ptrB[iq];
|
Chris@49
|
3102 ptrA[jq] = ptrB[jq];
|
Chris@49
|
3103
|
Chris@49
|
3104 ptrB[iq] = tmp_i;
|
Chris@49
|
3105 ptrB[jq] = tmp_j;
|
Chris@49
|
3106 }
|
Chris@49
|
3107
|
Chris@49
|
3108 if(iq < local_n_rows)
|
Chris@49
|
3109 {
|
Chris@49
|
3110 std::swap( ptrA[iq], ptrB[iq] );
|
Chris@49
|
3111 }
|
Chris@49
|
3112 }
|
Chris@49
|
3113 }
|
Chris@49
|
3114
|
Chris@49
|
3115
|
Chris@49
|
3116
|
Chris@49
|
3117 //! remove specified row
|
Chris@49
|
3118 template<typename eT>
|
Chris@49
|
3119 inline
|
Chris@49
|
3120 void
|
Chris@49
|
3121 Mat<eT>::shed_row(const uword row_num)
|
Chris@49
|
3122 {
|
Chris@49
|
3123 arma_extra_debug_sigprint();
|
Chris@49
|
3124
|
Chris@49
|
3125 arma_debug_check( row_num >= n_rows, "Mat::shed_row(): index out of bounds");
|
Chris@49
|
3126
|
Chris@49
|
3127 shed_rows(row_num, row_num);
|
Chris@49
|
3128 }
|
Chris@49
|
3129
|
Chris@49
|
3130
|
Chris@49
|
3131
|
Chris@49
|
3132 //! remove specified column
|
Chris@49
|
3133 template<typename eT>
|
Chris@49
|
3134 inline
|
Chris@49
|
3135 void
|
Chris@49
|
3136 Mat<eT>::shed_col(const uword col_num)
|
Chris@49
|
3137 {
|
Chris@49
|
3138 arma_extra_debug_sigprint();
|
Chris@49
|
3139
|
Chris@49
|
3140 arma_debug_check( col_num >= n_cols, "Mat::shed_col(): index out of bounds");
|
Chris@49
|
3141
|
Chris@49
|
3142 shed_cols(col_num, col_num);
|
Chris@49
|
3143 }
|
Chris@49
|
3144
|
Chris@49
|
3145
|
Chris@49
|
3146
|
Chris@49
|
3147 //! remove specified rows
|
Chris@49
|
3148 template<typename eT>
|
Chris@49
|
3149 inline
|
Chris@49
|
3150 void
|
Chris@49
|
3151 Mat<eT>::shed_rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
3152 {
|
Chris@49
|
3153 arma_extra_debug_sigprint();
|
Chris@49
|
3154
|
Chris@49
|
3155 arma_debug_check
|
Chris@49
|
3156 (
|
Chris@49
|
3157 (in_row1 > in_row2) || (in_row2 >= n_rows),
|
Chris@49
|
3158 "Mat::shed_rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
3159 );
|
Chris@49
|
3160
|
Chris@49
|
3161 const uword n_keep_front = in_row1;
|
Chris@49
|
3162 const uword n_keep_back = n_rows - (in_row2 + 1);
|
Chris@49
|
3163
|
Chris@49
|
3164 Mat<eT> X(n_keep_front + n_keep_back, n_cols);
|
Chris@49
|
3165
|
Chris@49
|
3166 if(n_keep_front > 0)
|
Chris@49
|
3167 {
|
Chris@49
|
3168 X.rows( 0, (n_keep_front-1) ) = rows( 0, (in_row1-1) );
|
Chris@49
|
3169 }
|
Chris@49
|
3170
|
Chris@49
|
3171 if(n_keep_back > 0)
|
Chris@49
|
3172 {
|
Chris@49
|
3173 X.rows( n_keep_front, (n_keep_front+n_keep_back-1) ) = rows( (in_row2+1), (n_rows-1) );
|
Chris@49
|
3174 }
|
Chris@49
|
3175
|
Chris@49
|
3176 steal_mem(X);
|
Chris@49
|
3177 }
|
Chris@49
|
3178
|
Chris@49
|
3179
|
Chris@49
|
3180
|
Chris@49
|
3181 //! remove specified columns
|
Chris@49
|
3182 template<typename eT>
|
Chris@49
|
3183 inline
|
Chris@49
|
3184 void
|
Chris@49
|
3185 Mat<eT>::shed_cols(const uword in_col1, const uword in_col2)
|
Chris@49
|
3186 {
|
Chris@49
|
3187 arma_extra_debug_sigprint();
|
Chris@49
|
3188
|
Chris@49
|
3189 arma_debug_check
|
Chris@49
|
3190 (
|
Chris@49
|
3191 (in_col1 > in_col2) || (in_col2 >= n_cols),
|
Chris@49
|
3192 "Mat::shed_cols(): indices out of bounds or incorrectly used"
|
Chris@49
|
3193 );
|
Chris@49
|
3194
|
Chris@49
|
3195 const uword n_keep_front = in_col1;
|
Chris@49
|
3196 const uword n_keep_back = n_cols - (in_col2 + 1);
|
Chris@49
|
3197
|
Chris@49
|
3198 Mat<eT> X(n_rows, n_keep_front + n_keep_back);
|
Chris@49
|
3199
|
Chris@49
|
3200 if(n_keep_front > 0)
|
Chris@49
|
3201 {
|
Chris@49
|
3202 X.cols( 0, (n_keep_front-1) ) = cols( 0, (in_col1-1) );
|
Chris@49
|
3203 }
|
Chris@49
|
3204
|
Chris@49
|
3205 if(n_keep_back > 0)
|
Chris@49
|
3206 {
|
Chris@49
|
3207 X.cols( n_keep_front, (n_keep_front+n_keep_back-1) ) = cols( (in_col2+1), (n_cols-1) );
|
Chris@49
|
3208 }
|
Chris@49
|
3209
|
Chris@49
|
3210 steal_mem(X);
|
Chris@49
|
3211 }
|
Chris@49
|
3212
|
Chris@49
|
3213
|
Chris@49
|
3214
|
Chris@49
|
3215 //! insert N rows at the specified row position,
|
Chris@49
|
3216 //! optionally setting the elements of the inserted rows to zero
|
Chris@49
|
3217 template<typename eT>
|
Chris@49
|
3218 inline
|
Chris@49
|
3219 void
|
Chris@49
|
3220 Mat<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)
|
Chris@49
|
3221 {
|
Chris@49
|
3222 arma_extra_debug_sigprint();
|
Chris@49
|
3223
|
Chris@49
|
3224 const uword t_n_rows = n_rows;
|
Chris@49
|
3225 const uword t_n_cols = n_cols;
|
Chris@49
|
3226
|
Chris@49
|
3227 const uword A_n_rows = row_num;
|
Chris@49
|
3228 const uword B_n_rows = t_n_rows - row_num;
|
Chris@49
|
3229
|
Chris@49
|
3230 // insertion at row_num == n_rows is in effect an append operation
|
Chris@49
|
3231 arma_debug_check( (row_num > t_n_rows), "Mat::insert_rows(): index out of bounds");
|
Chris@49
|
3232
|
Chris@49
|
3233 if(N > 0)
|
Chris@49
|
3234 {
|
Chris@49
|
3235 Mat<eT> out(t_n_rows + N, t_n_cols);
|
Chris@49
|
3236
|
Chris@49
|
3237 if(A_n_rows > 0)
|
Chris@49
|
3238 {
|
Chris@49
|
3239 out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);
|
Chris@49
|
3240 }
|
Chris@49
|
3241
|
Chris@49
|
3242 if(B_n_rows > 0)
|
Chris@49
|
3243 {
|
Chris@49
|
3244 out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1);
|
Chris@49
|
3245 }
|
Chris@49
|
3246
|
Chris@49
|
3247 if(set_to_zero == true)
|
Chris@49
|
3248 {
|
Chris@49
|
3249 out.rows(row_num, row_num + N - 1).zeros();
|
Chris@49
|
3250 }
|
Chris@49
|
3251
|
Chris@49
|
3252 steal_mem(out);
|
Chris@49
|
3253 }
|
Chris@49
|
3254 }
|
Chris@49
|
3255
|
Chris@49
|
3256
|
Chris@49
|
3257
|
Chris@49
|
3258 //! insert N columns at the specified column position,
|
Chris@49
|
3259 //! optionally setting the elements of the inserted columns to zero
|
Chris@49
|
3260 template<typename eT>
|
Chris@49
|
3261 inline
|
Chris@49
|
3262 void
|
Chris@49
|
3263 Mat<eT>::insert_cols(const uword col_num, const uword N, const bool set_to_zero)
|
Chris@49
|
3264 {
|
Chris@49
|
3265 arma_extra_debug_sigprint();
|
Chris@49
|
3266
|
Chris@49
|
3267 const uword t_n_rows = n_rows;
|
Chris@49
|
3268 const uword t_n_cols = n_cols;
|
Chris@49
|
3269
|
Chris@49
|
3270 const uword A_n_cols = col_num;
|
Chris@49
|
3271 const uword B_n_cols = t_n_cols - col_num;
|
Chris@49
|
3272
|
Chris@49
|
3273 // insertion at col_num == n_cols is in effect an append operation
|
Chris@49
|
3274 arma_debug_check( (col_num > t_n_cols), "Mat::insert_cols(): index out of bounds");
|
Chris@49
|
3275
|
Chris@49
|
3276 if(N > 0)
|
Chris@49
|
3277 {
|
Chris@49
|
3278 Mat<eT> out(t_n_rows, t_n_cols + N);
|
Chris@49
|
3279
|
Chris@49
|
3280 if(A_n_cols > 0)
|
Chris@49
|
3281 {
|
Chris@49
|
3282 out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);
|
Chris@49
|
3283 }
|
Chris@49
|
3284
|
Chris@49
|
3285 if(B_n_cols > 0)
|
Chris@49
|
3286 {
|
Chris@49
|
3287 out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1);
|
Chris@49
|
3288 }
|
Chris@49
|
3289
|
Chris@49
|
3290 if(set_to_zero == true)
|
Chris@49
|
3291 {
|
Chris@49
|
3292 out.cols(col_num, col_num + N - 1).zeros();
|
Chris@49
|
3293 }
|
Chris@49
|
3294
|
Chris@49
|
3295 steal_mem(out);
|
Chris@49
|
3296 }
|
Chris@49
|
3297 }
|
Chris@49
|
3298
|
Chris@49
|
3299
|
Chris@49
|
3300
|
Chris@49
|
3301 //! insert the given object at the specified row position;
|
Chris@49
|
3302 //! the given object must have the same number of columns as the matrix
|
Chris@49
|
3303 template<typename eT>
|
Chris@49
|
3304 template<typename T1>
|
Chris@49
|
3305 inline
|
Chris@49
|
3306 void
|
Chris@49
|
3307 Mat<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)
|
Chris@49
|
3308 {
|
Chris@49
|
3309 arma_extra_debug_sigprint();
|
Chris@49
|
3310
|
Chris@49
|
3311 const unwrap<T1> tmp(X.get_ref());
|
Chris@49
|
3312 const Mat<eT>& C = tmp.M;
|
Chris@49
|
3313
|
Chris@49
|
3314 const uword C_n_rows = C.n_rows;
|
Chris@49
|
3315 const uword C_n_cols = C.n_cols;
|
Chris@49
|
3316
|
Chris@49
|
3317 const uword t_n_rows = n_rows;
|
Chris@49
|
3318 const uword t_n_cols = n_cols;
|
Chris@49
|
3319
|
Chris@49
|
3320 const uword A_n_rows = row_num;
|
Chris@49
|
3321 const uword B_n_rows = t_n_rows - row_num;
|
Chris@49
|
3322
|
Chris@49
|
3323 bool err_state = false;
|
Chris@49
|
3324 char* err_msg = 0;
|
Chris@49
|
3325
|
Chris@49
|
3326 // insertion at row_num == n_rows is in effect an append operation
|
Chris@49
|
3327
|
Chris@49
|
3328 arma_debug_set_error
|
Chris@49
|
3329 (
|
Chris@49
|
3330 err_state,
|
Chris@49
|
3331 err_msg,
|
Chris@49
|
3332 (row_num > t_n_rows),
|
Chris@49
|
3333 "Mat::insert_rows(): index out of bounds"
|
Chris@49
|
3334 );
|
Chris@49
|
3335
|
Chris@49
|
3336 arma_debug_set_error
|
Chris@49
|
3337 (
|
Chris@49
|
3338 err_state,
|
Chris@49
|
3339 err_msg,
|
Chris@49
|
3340 ( (C_n_cols != t_n_cols) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),
|
Chris@49
|
3341 "Mat::insert_rows(): given object has an incompatible number of columns"
|
Chris@49
|
3342 );
|
Chris@49
|
3343
|
Chris@49
|
3344 arma_debug_check(err_state, err_msg);
|
Chris@49
|
3345
|
Chris@49
|
3346 if(C_n_rows > 0)
|
Chris@49
|
3347 {
|
Chris@49
|
3348 Mat<eT> out( t_n_rows + C_n_rows, (std::max)(t_n_cols, C_n_cols) );
|
Chris@49
|
3349
|
Chris@49
|
3350 if(t_n_cols > 0)
|
Chris@49
|
3351 {
|
Chris@49
|
3352 if(A_n_rows > 0)
|
Chris@49
|
3353 {
|
Chris@49
|
3354 out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);
|
Chris@49
|
3355 }
|
Chris@49
|
3356
|
Chris@49
|
3357 if( (t_n_cols > 0) && (B_n_rows > 0) )
|
Chris@49
|
3358 {
|
Chris@49
|
3359 out.rows(row_num + C_n_rows, t_n_rows + C_n_rows - 1) = rows(row_num, t_n_rows - 1);
|
Chris@49
|
3360 }
|
Chris@49
|
3361 }
|
Chris@49
|
3362
|
Chris@49
|
3363 if(C_n_cols > 0)
|
Chris@49
|
3364 {
|
Chris@49
|
3365 out.rows(row_num, row_num + C_n_rows - 1) = C;
|
Chris@49
|
3366 }
|
Chris@49
|
3367
|
Chris@49
|
3368 steal_mem(out);
|
Chris@49
|
3369 }
|
Chris@49
|
3370 }
|
Chris@49
|
3371
|
Chris@49
|
3372
|
Chris@49
|
3373
|
Chris@49
|
3374 //! insert the given object at the specified column position;
|
Chris@49
|
3375 //! the given object must have the same number of rows as the matrix
|
Chris@49
|
3376 template<typename eT>
|
Chris@49
|
3377 template<typename T1>
|
Chris@49
|
3378 inline
|
Chris@49
|
3379 void
|
Chris@49
|
3380 Mat<eT>::insert_cols(const uword col_num, const Base<eT,T1>& X)
|
Chris@49
|
3381 {
|
Chris@49
|
3382 arma_extra_debug_sigprint();
|
Chris@49
|
3383
|
Chris@49
|
3384 const unwrap<T1> tmp(X.get_ref());
|
Chris@49
|
3385 const Mat<eT>& C = tmp.M;
|
Chris@49
|
3386
|
Chris@49
|
3387 const uword C_n_rows = C.n_rows;
|
Chris@49
|
3388 const uword C_n_cols = C.n_cols;
|
Chris@49
|
3389
|
Chris@49
|
3390 const uword t_n_rows = n_rows;
|
Chris@49
|
3391 const uword t_n_cols = n_cols;
|
Chris@49
|
3392
|
Chris@49
|
3393 const uword A_n_cols = col_num;
|
Chris@49
|
3394 const uword B_n_cols = t_n_cols - col_num;
|
Chris@49
|
3395
|
Chris@49
|
3396 bool err_state = false;
|
Chris@49
|
3397 char* err_msg = 0;
|
Chris@49
|
3398
|
Chris@49
|
3399 // insertion at col_num == n_cols is in effect an append operation
|
Chris@49
|
3400
|
Chris@49
|
3401 arma_debug_set_error
|
Chris@49
|
3402 (
|
Chris@49
|
3403 err_state,
|
Chris@49
|
3404 err_msg,
|
Chris@49
|
3405 (col_num > t_n_cols),
|
Chris@49
|
3406 "Mat::insert_cols(): index out of bounds"
|
Chris@49
|
3407 );
|
Chris@49
|
3408
|
Chris@49
|
3409 arma_debug_set_error
|
Chris@49
|
3410 (
|
Chris@49
|
3411 err_state,
|
Chris@49
|
3412 err_msg,
|
Chris@49
|
3413 ( (C_n_rows != t_n_rows) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),
|
Chris@49
|
3414 "Mat::insert_cols(): given object has an incompatible number of rows"
|
Chris@49
|
3415 );
|
Chris@49
|
3416
|
Chris@49
|
3417 arma_debug_check(err_state, err_msg);
|
Chris@49
|
3418
|
Chris@49
|
3419 if(C_n_cols > 0)
|
Chris@49
|
3420 {
|
Chris@49
|
3421 Mat<eT> out( (std::max)(t_n_rows, C_n_rows), t_n_cols + C_n_cols );
|
Chris@49
|
3422
|
Chris@49
|
3423 if(t_n_rows > 0)
|
Chris@49
|
3424 {
|
Chris@49
|
3425 if(A_n_cols > 0)
|
Chris@49
|
3426 {
|
Chris@49
|
3427 out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);
|
Chris@49
|
3428 }
|
Chris@49
|
3429
|
Chris@49
|
3430 if(B_n_cols > 0)
|
Chris@49
|
3431 {
|
Chris@49
|
3432 out.cols(col_num + C_n_cols, t_n_cols + C_n_cols - 1) = cols(col_num, t_n_cols - 1);
|
Chris@49
|
3433 }
|
Chris@49
|
3434 }
|
Chris@49
|
3435
|
Chris@49
|
3436 if(C_n_rows > 0)
|
Chris@49
|
3437 {
|
Chris@49
|
3438 out.cols(col_num, col_num + C_n_cols - 1) = C;
|
Chris@49
|
3439 }
|
Chris@49
|
3440
|
Chris@49
|
3441 steal_mem(out);
|
Chris@49
|
3442 }
|
Chris@49
|
3443 }
|
Chris@49
|
3444
|
Chris@49
|
3445
|
Chris@49
|
3446
|
Chris@49
|
3447 template<typename eT>
|
Chris@49
|
3448 template<typename T1, typename gen_type>
|
Chris@49
|
3449 inline
|
Chris@49
|
3450 Mat<eT>::Mat(const Gen<T1, gen_type>& X)
|
Chris@49
|
3451 : n_rows(X.n_rows)
|
Chris@49
|
3452 , n_cols(X.n_cols)
|
Chris@49
|
3453 , n_elem(n_rows*n_cols)
|
Chris@49
|
3454 , vec_state(0)
|
Chris@49
|
3455 , mem_state(0)
|
Chris@49
|
3456 , mem()
|
Chris@49
|
3457 {
|
Chris@49
|
3458 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
3459
|
Chris@49
|
3460 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3461
|
Chris@49
|
3462 init_cold();
|
Chris@49
|
3463
|
Chris@49
|
3464 X.apply(*this);
|
Chris@49
|
3465 }
|
Chris@49
|
3466
|
Chris@49
|
3467
|
Chris@49
|
3468
|
Chris@49
|
3469 template<typename eT>
|
Chris@49
|
3470 template<typename T1, typename gen_type>
|
Chris@49
|
3471 inline
|
Chris@49
|
3472 const Mat<eT>&
|
Chris@49
|
3473 Mat<eT>::operator=(const Gen<T1, gen_type>& X)
|
Chris@49
|
3474 {
|
Chris@49
|
3475 arma_extra_debug_sigprint();
|
Chris@49
|
3476
|
Chris@49
|
3477 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3478
|
Chris@49
|
3479 init_warm(X.n_rows, X.n_cols);
|
Chris@49
|
3480
|
Chris@49
|
3481 X.apply(*this);
|
Chris@49
|
3482
|
Chris@49
|
3483 return *this;
|
Chris@49
|
3484 }
|
Chris@49
|
3485
|
Chris@49
|
3486
|
Chris@49
|
3487
|
Chris@49
|
3488 template<typename eT>
|
Chris@49
|
3489 template<typename T1, typename gen_type>
|
Chris@49
|
3490 inline
|
Chris@49
|
3491 const Mat<eT>&
|
Chris@49
|
3492 Mat<eT>::operator+=(const Gen<T1, gen_type>& X)
|
Chris@49
|
3493 {
|
Chris@49
|
3494 arma_extra_debug_sigprint();
|
Chris@49
|
3495
|
Chris@49
|
3496 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3497
|
Chris@49
|
3498 X.apply_inplace_plus(*this);
|
Chris@49
|
3499
|
Chris@49
|
3500 return *this;
|
Chris@49
|
3501 }
|
Chris@49
|
3502
|
Chris@49
|
3503
|
Chris@49
|
3504
|
Chris@49
|
3505 template<typename eT>
|
Chris@49
|
3506 template<typename T1, typename gen_type>
|
Chris@49
|
3507 inline
|
Chris@49
|
3508 const Mat<eT>&
|
Chris@49
|
3509 Mat<eT>::operator-=(const Gen<T1, gen_type>& X)
|
Chris@49
|
3510 {
|
Chris@49
|
3511 arma_extra_debug_sigprint();
|
Chris@49
|
3512
|
Chris@49
|
3513 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3514
|
Chris@49
|
3515 X.apply_inplace_minus(*this);
|
Chris@49
|
3516
|
Chris@49
|
3517 return *this;
|
Chris@49
|
3518 }
|
Chris@49
|
3519
|
Chris@49
|
3520
|
Chris@49
|
3521
|
Chris@49
|
3522 template<typename eT>
|
Chris@49
|
3523 template<typename T1, typename gen_type>
|
Chris@49
|
3524 inline
|
Chris@49
|
3525 const Mat<eT>&
|
Chris@49
|
3526 Mat<eT>::operator*=(const Gen<T1, gen_type>& X)
|
Chris@49
|
3527 {
|
Chris@49
|
3528 arma_extra_debug_sigprint();
|
Chris@49
|
3529
|
Chris@49
|
3530 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3531
|
Chris@49
|
3532 const Mat<eT> tmp(X);
|
Chris@49
|
3533
|
Chris@49
|
3534 return (*this).operator*=(tmp);
|
Chris@49
|
3535 }
|
Chris@49
|
3536
|
Chris@49
|
3537
|
Chris@49
|
3538
|
Chris@49
|
3539 template<typename eT>
|
Chris@49
|
3540 template<typename T1, typename gen_type>
|
Chris@49
|
3541 inline
|
Chris@49
|
3542 const Mat<eT>&
|
Chris@49
|
3543 Mat<eT>::operator%=(const Gen<T1, gen_type>& X)
|
Chris@49
|
3544 {
|
Chris@49
|
3545 arma_extra_debug_sigprint();
|
Chris@49
|
3546
|
Chris@49
|
3547 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3548
|
Chris@49
|
3549 X.apply_inplace_schur(*this);
|
Chris@49
|
3550
|
Chris@49
|
3551 return *this;
|
Chris@49
|
3552 }
|
Chris@49
|
3553
|
Chris@49
|
3554
|
Chris@49
|
3555
|
Chris@49
|
3556 template<typename eT>
|
Chris@49
|
3557 template<typename T1, typename gen_type>
|
Chris@49
|
3558 inline
|
Chris@49
|
3559 const Mat<eT>&
|
Chris@49
|
3560 Mat<eT>::operator/=(const Gen<T1, gen_type>& X)
|
Chris@49
|
3561 {
|
Chris@49
|
3562 arma_extra_debug_sigprint();
|
Chris@49
|
3563
|
Chris@49
|
3564 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3565
|
Chris@49
|
3566 X.apply_inplace_div(*this);
|
Chris@49
|
3567
|
Chris@49
|
3568 return *this;
|
Chris@49
|
3569 }
|
Chris@49
|
3570
|
Chris@49
|
3571
|
Chris@49
|
3572
|
Chris@49
|
3573 //! create a matrix from Op, i.e. run the previously delayed unary operations
|
Chris@49
|
3574 template<typename eT>
|
Chris@49
|
3575 template<typename T1, typename op_type>
|
Chris@49
|
3576 inline
|
Chris@49
|
3577 Mat<eT>::Mat(const Op<T1, op_type>& X)
|
Chris@49
|
3578 : n_rows(0)
|
Chris@49
|
3579 , n_cols(0)
|
Chris@49
|
3580 , n_elem(0)
|
Chris@49
|
3581 , vec_state(0)
|
Chris@49
|
3582 , mem_state(0)
|
Chris@49
|
3583 , mem()
|
Chris@49
|
3584 {
|
Chris@49
|
3585 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
3586
|
Chris@49
|
3587 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3588
|
Chris@49
|
3589 op_type::apply(*this, X);
|
Chris@49
|
3590 }
|
Chris@49
|
3591
|
Chris@49
|
3592
|
Chris@49
|
3593
|
Chris@49
|
3594 //! create a matrix from Op, i.e. run the previously delayed unary operations
|
Chris@49
|
3595 template<typename eT>
|
Chris@49
|
3596 template<typename T1, typename op_type>
|
Chris@49
|
3597 inline
|
Chris@49
|
3598 const Mat<eT>&
|
Chris@49
|
3599 Mat<eT>::operator=(const Op<T1, op_type>& X)
|
Chris@49
|
3600 {
|
Chris@49
|
3601 arma_extra_debug_sigprint();
|
Chris@49
|
3602
|
Chris@49
|
3603 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3604
|
Chris@49
|
3605 op_type::apply(*this, X);
|
Chris@49
|
3606
|
Chris@49
|
3607 return *this;
|
Chris@49
|
3608 }
|
Chris@49
|
3609
|
Chris@49
|
3610
|
Chris@49
|
3611
|
Chris@49
|
3612 //! in-place matrix addition, with the right-hand-side operand having delayed operations
|
Chris@49
|
3613 template<typename eT>
|
Chris@49
|
3614 template<typename T1, typename op_type>
|
Chris@49
|
3615 inline
|
Chris@49
|
3616 const Mat<eT>&
|
Chris@49
|
3617 Mat<eT>::operator+=(const Op<T1, op_type>& X)
|
Chris@49
|
3618 {
|
Chris@49
|
3619 arma_extra_debug_sigprint();
|
Chris@49
|
3620
|
Chris@49
|
3621 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3622
|
Chris@49
|
3623 const Mat<eT> m(X);
|
Chris@49
|
3624
|
Chris@49
|
3625 return (*this).operator+=(m);
|
Chris@49
|
3626 }
|
Chris@49
|
3627
|
Chris@49
|
3628
|
Chris@49
|
3629
|
Chris@49
|
3630 //! in-place matrix subtraction, with the right-hand-side operand having delayed operations
|
Chris@49
|
3631 template<typename eT>
|
Chris@49
|
3632 template<typename T1, typename op_type>
|
Chris@49
|
3633 inline
|
Chris@49
|
3634 const Mat<eT>&
|
Chris@49
|
3635 Mat<eT>::operator-=(const Op<T1, op_type>& X)
|
Chris@49
|
3636 {
|
Chris@49
|
3637 arma_extra_debug_sigprint();
|
Chris@49
|
3638
|
Chris@49
|
3639 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3640
|
Chris@49
|
3641 const Mat<eT> m(X);
|
Chris@49
|
3642
|
Chris@49
|
3643 return (*this).operator-=(m);
|
Chris@49
|
3644 }
|
Chris@49
|
3645
|
Chris@49
|
3646
|
Chris@49
|
3647
|
Chris@49
|
3648 //! in-place matrix multiplication, with the right-hand-side operand having delayed operations
|
Chris@49
|
3649 template<typename eT>
|
Chris@49
|
3650 template<typename T1, typename op_type>
|
Chris@49
|
3651 inline
|
Chris@49
|
3652 const Mat<eT>&
|
Chris@49
|
3653 Mat<eT>::operator*=(const Op<T1, op_type>& X)
|
Chris@49
|
3654 {
|
Chris@49
|
3655 arma_extra_debug_sigprint();
|
Chris@49
|
3656
|
Chris@49
|
3657 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3658
|
Chris@49
|
3659 glue_times::apply_inplace(*this, X);
|
Chris@49
|
3660
|
Chris@49
|
3661 return *this;
|
Chris@49
|
3662 }
|
Chris@49
|
3663
|
Chris@49
|
3664
|
Chris@49
|
3665
|
Chris@49
|
3666 //! in-place matrix element-wise multiplication, with the right-hand-side operand having delayed operations
|
Chris@49
|
3667 template<typename eT>
|
Chris@49
|
3668 template<typename T1, typename op_type>
|
Chris@49
|
3669 inline
|
Chris@49
|
3670 const Mat<eT>&
|
Chris@49
|
3671 Mat<eT>::operator%=(const Op<T1, op_type>& X)
|
Chris@49
|
3672 {
|
Chris@49
|
3673 arma_extra_debug_sigprint();
|
Chris@49
|
3674
|
Chris@49
|
3675 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3676
|
Chris@49
|
3677 const Mat<eT> m(X);
|
Chris@49
|
3678
|
Chris@49
|
3679 return (*this).operator%=(m);
|
Chris@49
|
3680 }
|
Chris@49
|
3681
|
Chris@49
|
3682
|
Chris@49
|
3683
|
Chris@49
|
3684 //! in-place matrix element-wise division, with the right-hand-side operand having delayed operations
|
Chris@49
|
3685 template<typename eT>
|
Chris@49
|
3686 template<typename T1, typename op_type>
|
Chris@49
|
3687 inline
|
Chris@49
|
3688 const Mat<eT>&
|
Chris@49
|
3689 Mat<eT>::operator/=(const Op<T1, op_type>& X)
|
Chris@49
|
3690 {
|
Chris@49
|
3691 arma_extra_debug_sigprint();
|
Chris@49
|
3692
|
Chris@49
|
3693 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3694
|
Chris@49
|
3695 const Mat<eT> m(X);
|
Chris@49
|
3696
|
Chris@49
|
3697 return (*this).operator/=(m);
|
Chris@49
|
3698 }
|
Chris@49
|
3699
|
Chris@49
|
3700
|
Chris@49
|
3701
|
Chris@49
|
3702 //! create a matrix from eOp, i.e. run the previously delayed unary operations
|
Chris@49
|
3703 template<typename eT>
|
Chris@49
|
3704 template<typename T1, typename eop_type>
|
Chris@49
|
3705 inline
|
Chris@49
|
3706 Mat<eT>::Mat(const eOp<T1, eop_type>& X)
|
Chris@49
|
3707 : n_rows(X.get_n_rows())
|
Chris@49
|
3708 , n_cols(X.get_n_cols())
|
Chris@49
|
3709 , n_elem(X.get_n_elem())
|
Chris@49
|
3710 , vec_state(0)
|
Chris@49
|
3711 , mem_state(0)
|
Chris@49
|
3712 , mem()
|
Chris@49
|
3713 {
|
Chris@49
|
3714 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
3715
|
Chris@49
|
3716 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3717
|
Chris@49
|
3718 init_cold();
|
Chris@49
|
3719
|
Chris@49
|
3720 eop_type::apply(*this, X);
|
Chris@49
|
3721 }
|
Chris@49
|
3722
|
Chris@49
|
3723
|
Chris@49
|
3724
|
Chris@49
|
3725 //! create a matrix from eOp, i.e. run the previously delayed unary operations
|
Chris@49
|
3726 template<typename eT>
|
Chris@49
|
3727 template<typename T1, typename eop_type>
|
Chris@49
|
3728 inline
|
Chris@49
|
3729 const Mat<eT>&
|
Chris@49
|
3730 Mat<eT>::operator=(const eOp<T1, eop_type>& X)
|
Chris@49
|
3731 {
|
Chris@49
|
3732 arma_extra_debug_sigprint();
|
Chris@49
|
3733
|
Chris@49
|
3734 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3735
|
Chris@49
|
3736 const bool bad_alias = (eOp<T1, eop_type>::proxy_type::has_subview && X.P.is_alias(*this));
|
Chris@49
|
3737
|
Chris@49
|
3738 if(bad_alias == false)
|
Chris@49
|
3739 {
|
Chris@49
|
3740 init_warm(X.get_n_rows(), X.get_n_cols());
|
Chris@49
|
3741
|
Chris@49
|
3742 eop_type::apply(*this, X);
|
Chris@49
|
3743 }
|
Chris@49
|
3744 else
|
Chris@49
|
3745 {
|
Chris@49
|
3746 arma_extra_debug_print("bad_alias = true");
|
Chris@49
|
3747
|
Chris@49
|
3748 Mat<eT> tmp(X);
|
Chris@49
|
3749
|
Chris@49
|
3750 steal_mem(tmp);
|
Chris@49
|
3751 }
|
Chris@49
|
3752
|
Chris@49
|
3753 return *this;
|
Chris@49
|
3754 }
|
Chris@49
|
3755
|
Chris@49
|
3756
|
Chris@49
|
3757
|
Chris@49
|
3758 template<typename eT>
|
Chris@49
|
3759 template<typename T1, typename eop_type>
|
Chris@49
|
3760 inline
|
Chris@49
|
3761 const Mat<eT>&
|
Chris@49
|
3762 Mat<eT>::operator+=(const eOp<T1, eop_type>& X)
|
Chris@49
|
3763 {
|
Chris@49
|
3764 arma_extra_debug_sigprint();
|
Chris@49
|
3765
|
Chris@49
|
3766 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3767
|
Chris@49
|
3768 eop_type::apply_inplace_plus(*this, X);
|
Chris@49
|
3769
|
Chris@49
|
3770 return *this;
|
Chris@49
|
3771 }
|
Chris@49
|
3772
|
Chris@49
|
3773
|
Chris@49
|
3774
|
Chris@49
|
3775 template<typename eT>
|
Chris@49
|
3776 template<typename T1, typename eop_type>
|
Chris@49
|
3777 inline
|
Chris@49
|
3778 const Mat<eT>&
|
Chris@49
|
3779 Mat<eT>::operator-=(const eOp<T1, eop_type>& X)
|
Chris@49
|
3780 {
|
Chris@49
|
3781 arma_extra_debug_sigprint();
|
Chris@49
|
3782
|
Chris@49
|
3783 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3784
|
Chris@49
|
3785 eop_type::apply_inplace_minus(*this, X);
|
Chris@49
|
3786
|
Chris@49
|
3787 return *this;
|
Chris@49
|
3788 }
|
Chris@49
|
3789
|
Chris@49
|
3790
|
Chris@49
|
3791
|
Chris@49
|
3792 template<typename eT>
|
Chris@49
|
3793 template<typename T1, typename eop_type>
|
Chris@49
|
3794 inline
|
Chris@49
|
3795 const Mat<eT>&
|
Chris@49
|
3796 Mat<eT>::operator*=(const eOp<T1, eop_type>& X)
|
Chris@49
|
3797 {
|
Chris@49
|
3798 arma_extra_debug_sigprint();
|
Chris@49
|
3799
|
Chris@49
|
3800 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3801
|
Chris@49
|
3802 glue_times::apply_inplace(*this, X);
|
Chris@49
|
3803
|
Chris@49
|
3804 return *this;
|
Chris@49
|
3805 }
|
Chris@49
|
3806
|
Chris@49
|
3807
|
Chris@49
|
3808
|
Chris@49
|
3809 template<typename eT>
|
Chris@49
|
3810 template<typename T1, typename eop_type>
|
Chris@49
|
3811 inline
|
Chris@49
|
3812 const Mat<eT>&
|
Chris@49
|
3813 Mat<eT>::operator%=(const eOp<T1, eop_type>& X)
|
Chris@49
|
3814 {
|
Chris@49
|
3815 arma_extra_debug_sigprint();
|
Chris@49
|
3816
|
Chris@49
|
3817 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3818
|
Chris@49
|
3819 eop_type::apply_inplace_schur(*this, X);
|
Chris@49
|
3820
|
Chris@49
|
3821 return *this;
|
Chris@49
|
3822 }
|
Chris@49
|
3823
|
Chris@49
|
3824
|
Chris@49
|
3825
|
Chris@49
|
3826 template<typename eT>
|
Chris@49
|
3827 template<typename T1, typename eop_type>
|
Chris@49
|
3828 inline
|
Chris@49
|
3829 const Mat<eT>&
|
Chris@49
|
3830 Mat<eT>::operator/=(const eOp<T1, eop_type>& X)
|
Chris@49
|
3831 {
|
Chris@49
|
3832 arma_extra_debug_sigprint();
|
Chris@49
|
3833
|
Chris@49
|
3834 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3835
|
Chris@49
|
3836 eop_type::apply_inplace_div(*this, X);
|
Chris@49
|
3837
|
Chris@49
|
3838 return *this;
|
Chris@49
|
3839 }
|
Chris@49
|
3840
|
Chris@49
|
3841
|
Chris@49
|
3842
|
Chris@49
|
3843 //! EXPERIMENTAL
|
Chris@49
|
3844 template<typename eT>
|
Chris@49
|
3845 template<typename T1, typename op_type>
|
Chris@49
|
3846 inline
|
Chris@49
|
3847 Mat<eT>::Mat(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3848 : n_rows(0)
|
Chris@49
|
3849 , n_cols(0)
|
Chris@49
|
3850 , n_elem(0)
|
Chris@49
|
3851 , vec_state(0)
|
Chris@49
|
3852 , mem_state(0)
|
Chris@49
|
3853 , mem()
|
Chris@49
|
3854 {
|
Chris@49
|
3855 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
3856
|
Chris@49
|
3857 op_type::apply(*this, X);
|
Chris@49
|
3858 }
|
Chris@49
|
3859
|
Chris@49
|
3860
|
Chris@49
|
3861
|
Chris@49
|
3862 //! EXPERIMENTAL
|
Chris@49
|
3863 template<typename eT>
|
Chris@49
|
3864 template<typename T1, typename op_type>
|
Chris@49
|
3865 inline
|
Chris@49
|
3866 const Mat<eT>&
|
Chris@49
|
3867 Mat<eT>::operator=(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3868 {
|
Chris@49
|
3869 arma_extra_debug_sigprint();
|
Chris@49
|
3870
|
Chris@49
|
3871 op_type::apply(*this, X);
|
Chris@49
|
3872
|
Chris@49
|
3873 return *this;
|
Chris@49
|
3874 }
|
Chris@49
|
3875
|
Chris@49
|
3876
|
Chris@49
|
3877
|
Chris@49
|
3878 //! EXPERIMENTAL
|
Chris@49
|
3879 template<typename eT>
|
Chris@49
|
3880 template<typename T1, typename op_type>
|
Chris@49
|
3881 inline
|
Chris@49
|
3882 const Mat<eT>&
|
Chris@49
|
3883 Mat<eT>::operator+=(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3884 {
|
Chris@49
|
3885 arma_extra_debug_sigprint();
|
Chris@49
|
3886
|
Chris@49
|
3887 const Mat<eT> m(X);
|
Chris@49
|
3888
|
Chris@49
|
3889 return (*this).operator+=(m);
|
Chris@49
|
3890 }
|
Chris@49
|
3891
|
Chris@49
|
3892
|
Chris@49
|
3893
|
Chris@49
|
3894 //! EXPERIMENTAL
|
Chris@49
|
3895 template<typename eT>
|
Chris@49
|
3896 template<typename T1, typename op_type>
|
Chris@49
|
3897 inline
|
Chris@49
|
3898 const Mat<eT>&
|
Chris@49
|
3899 Mat<eT>::operator-=(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3900 {
|
Chris@49
|
3901 arma_extra_debug_sigprint();
|
Chris@49
|
3902
|
Chris@49
|
3903 const Mat<eT> m(X);
|
Chris@49
|
3904
|
Chris@49
|
3905 return (*this).operator-=(m);
|
Chris@49
|
3906 }
|
Chris@49
|
3907
|
Chris@49
|
3908
|
Chris@49
|
3909
|
Chris@49
|
3910 //! EXPERIMENTAL
|
Chris@49
|
3911 template<typename eT>
|
Chris@49
|
3912 template<typename T1, typename op_type>
|
Chris@49
|
3913 inline
|
Chris@49
|
3914 const Mat<eT>&
|
Chris@49
|
3915 Mat<eT>::operator*=(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3916 {
|
Chris@49
|
3917 arma_extra_debug_sigprint();
|
Chris@49
|
3918
|
Chris@49
|
3919 const Mat<eT> m(X);
|
Chris@49
|
3920
|
Chris@49
|
3921 return (*this).operator*=(m);
|
Chris@49
|
3922 }
|
Chris@49
|
3923
|
Chris@49
|
3924
|
Chris@49
|
3925
|
Chris@49
|
3926 //! EXPERIMENTAL
|
Chris@49
|
3927 template<typename eT>
|
Chris@49
|
3928 template<typename T1, typename op_type>
|
Chris@49
|
3929 inline
|
Chris@49
|
3930 const Mat<eT>&
|
Chris@49
|
3931 Mat<eT>::operator%=(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3932 {
|
Chris@49
|
3933 arma_extra_debug_sigprint();
|
Chris@49
|
3934
|
Chris@49
|
3935 const Mat<eT> m(X);
|
Chris@49
|
3936
|
Chris@49
|
3937 return (*this).operator%=(m);
|
Chris@49
|
3938 }
|
Chris@49
|
3939
|
Chris@49
|
3940
|
Chris@49
|
3941
|
Chris@49
|
3942 //! EXPERIMENTAL
|
Chris@49
|
3943 template<typename eT>
|
Chris@49
|
3944 template<typename T1, typename op_type>
|
Chris@49
|
3945 inline
|
Chris@49
|
3946 const Mat<eT>&
|
Chris@49
|
3947 Mat<eT>::operator/=(const mtOp<eT, T1, op_type>& X)
|
Chris@49
|
3948 {
|
Chris@49
|
3949 arma_extra_debug_sigprint();
|
Chris@49
|
3950
|
Chris@49
|
3951 const Mat<eT> m(X);
|
Chris@49
|
3952
|
Chris@49
|
3953 return (*this).operator/=(m);
|
Chris@49
|
3954 }
|
Chris@49
|
3955
|
Chris@49
|
3956
|
Chris@49
|
3957
|
Chris@49
|
3958 //! create a matrix from Glue, i.e. run the previously delayed binary operations
|
Chris@49
|
3959 template<typename eT>
|
Chris@49
|
3960 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
3961 inline
|
Chris@49
|
3962 Mat<eT>::Mat(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
3963 : n_rows(0)
|
Chris@49
|
3964 , n_cols(0)
|
Chris@49
|
3965 , n_elem(0)
|
Chris@49
|
3966 , vec_state(0)
|
Chris@49
|
3967 , mem_state(0)
|
Chris@49
|
3968 , mem()
|
Chris@49
|
3969 {
|
Chris@49
|
3970 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
3971
|
Chris@49
|
3972 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3973 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
3974
|
Chris@49
|
3975 glue_type::apply(*this, X);
|
Chris@49
|
3976 }
|
Chris@49
|
3977
|
Chris@49
|
3978
|
Chris@49
|
3979
|
Chris@49
|
3980 //! create a matrix from Glue, i.e. run the previously delayed binary operations
|
Chris@49
|
3981 template<typename eT>
|
Chris@49
|
3982 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
3983 inline
|
Chris@49
|
3984 const Mat<eT>&
|
Chris@49
|
3985 Mat<eT>::operator=(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
3986 {
|
Chris@49
|
3987 arma_extra_debug_sigprint();
|
Chris@49
|
3988
|
Chris@49
|
3989 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
3990 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
3991
|
Chris@49
|
3992 glue_type::apply(*this, X);
|
Chris@49
|
3993
|
Chris@49
|
3994 return *this;
|
Chris@49
|
3995 }
|
Chris@49
|
3996
|
Chris@49
|
3997
|
Chris@49
|
3998
|
Chris@49
|
3999 //! in-place matrix addition, with the right-hand-side operands having delayed operations
|
Chris@49
|
4000 template<typename eT>
|
Chris@49
|
4001 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4002 inline
|
Chris@49
|
4003 const Mat<eT>&
|
Chris@49
|
4004 Mat<eT>::operator+=(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
4005 {
|
Chris@49
|
4006 arma_extra_debug_sigprint();
|
Chris@49
|
4007
|
Chris@49
|
4008 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4009 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4010
|
Chris@49
|
4011 const Mat<eT> m(X);
|
Chris@49
|
4012
|
Chris@49
|
4013 return (*this).operator+=(m);
|
Chris@49
|
4014 }
|
Chris@49
|
4015
|
Chris@49
|
4016
|
Chris@49
|
4017
|
Chris@49
|
4018 //! in-place matrix subtraction, with the right-hand-side operands having delayed operations
|
Chris@49
|
4019 template<typename eT>
|
Chris@49
|
4020 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4021 inline
|
Chris@49
|
4022 const Mat<eT>&
|
Chris@49
|
4023 Mat<eT>::operator-=(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
4024 {
|
Chris@49
|
4025 arma_extra_debug_sigprint();
|
Chris@49
|
4026
|
Chris@49
|
4027 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4028 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4029
|
Chris@49
|
4030 const Mat<eT> m(X);
|
Chris@49
|
4031
|
Chris@49
|
4032 return (*this).operator-=(m);
|
Chris@49
|
4033 }
|
Chris@49
|
4034
|
Chris@49
|
4035
|
Chris@49
|
4036
|
Chris@49
|
4037 //! in-place matrix multiplications, with the right-hand-side operands having delayed operations
|
Chris@49
|
4038 template<typename eT>
|
Chris@49
|
4039 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4040 inline
|
Chris@49
|
4041 const Mat<eT>&
|
Chris@49
|
4042 Mat<eT>::operator*=(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
4043 {
|
Chris@49
|
4044 arma_extra_debug_sigprint();
|
Chris@49
|
4045
|
Chris@49
|
4046 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4047 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4048
|
Chris@49
|
4049 glue_times::apply_inplace(*this, X);
|
Chris@49
|
4050
|
Chris@49
|
4051 return *this;
|
Chris@49
|
4052 }
|
Chris@49
|
4053
|
Chris@49
|
4054
|
Chris@49
|
4055
|
Chris@49
|
4056 //! in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations
|
Chris@49
|
4057 template<typename eT>
|
Chris@49
|
4058 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4059 inline
|
Chris@49
|
4060 const Mat<eT>&
|
Chris@49
|
4061 Mat<eT>::operator%=(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
4062 {
|
Chris@49
|
4063 arma_extra_debug_sigprint();
|
Chris@49
|
4064
|
Chris@49
|
4065 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4066 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4067
|
Chris@49
|
4068 const Mat<eT> m(X);
|
Chris@49
|
4069
|
Chris@49
|
4070 return (*this).operator%=(m);
|
Chris@49
|
4071 }
|
Chris@49
|
4072
|
Chris@49
|
4073
|
Chris@49
|
4074
|
Chris@49
|
4075 //! in-place matrix element-wise division, with the right-hand-side operands having delayed operations
|
Chris@49
|
4076 template<typename eT>
|
Chris@49
|
4077 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4078 inline
|
Chris@49
|
4079 const Mat<eT>&
|
Chris@49
|
4080 Mat<eT>::operator/=(const Glue<T1, T2, glue_type>& X)
|
Chris@49
|
4081 {
|
Chris@49
|
4082 arma_extra_debug_sigprint();
|
Chris@49
|
4083
|
Chris@49
|
4084 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4085 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4086
|
Chris@49
|
4087 const Mat<eT> m(X);
|
Chris@49
|
4088
|
Chris@49
|
4089 return (*this).operator/=(m);
|
Chris@49
|
4090 }
|
Chris@49
|
4091
|
Chris@49
|
4092
|
Chris@49
|
4093
|
Chris@49
|
4094 template<typename eT>
|
Chris@49
|
4095 template<typename T1, typename T2>
|
Chris@49
|
4096 inline
|
Chris@49
|
4097 const Mat<eT>&
|
Chris@49
|
4098 Mat<eT>::operator+=(const Glue<T1, T2, glue_times>& X)
|
Chris@49
|
4099 {
|
Chris@49
|
4100 arma_extra_debug_sigprint();
|
Chris@49
|
4101
|
Chris@49
|
4102 glue_times::apply_inplace_plus(*this, X, sword(+1));
|
Chris@49
|
4103
|
Chris@49
|
4104 return *this;
|
Chris@49
|
4105 }
|
Chris@49
|
4106
|
Chris@49
|
4107
|
Chris@49
|
4108
|
Chris@49
|
4109 template<typename eT>
|
Chris@49
|
4110 template<typename T1, typename T2>
|
Chris@49
|
4111 inline
|
Chris@49
|
4112 const Mat<eT>&
|
Chris@49
|
4113 Mat<eT>::operator-=(const Glue<T1, T2, glue_times>& X)
|
Chris@49
|
4114 {
|
Chris@49
|
4115 arma_extra_debug_sigprint();
|
Chris@49
|
4116
|
Chris@49
|
4117 glue_times::apply_inplace_plus(*this, X, sword(-1));
|
Chris@49
|
4118
|
Chris@49
|
4119 return *this;
|
Chris@49
|
4120 }
|
Chris@49
|
4121
|
Chris@49
|
4122
|
Chris@49
|
4123
|
Chris@49
|
4124 //! create a matrix from eGlue, i.e. run the previously delayed binary operations
|
Chris@49
|
4125 template<typename eT>
|
Chris@49
|
4126 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4127 inline
|
Chris@49
|
4128 Mat<eT>::Mat(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4129 : n_rows(X.get_n_rows())
|
Chris@49
|
4130 , n_cols(X.get_n_cols())
|
Chris@49
|
4131 , n_elem(X.get_n_elem())
|
Chris@49
|
4132 , vec_state(0)
|
Chris@49
|
4133 , mem_state(0)
|
Chris@49
|
4134 , mem()
|
Chris@49
|
4135 {
|
Chris@49
|
4136 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
4137
|
Chris@49
|
4138 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4139 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4140
|
Chris@49
|
4141 init_cold();
|
Chris@49
|
4142
|
Chris@49
|
4143 eglue_type::apply(*this, X);
|
Chris@49
|
4144 }
|
Chris@49
|
4145
|
Chris@49
|
4146
|
Chris@49
|
4147
|
Chris@49
|
4148 //! create a matrix from eGlue, i.e. run the previously delayed binary operations
|
Chris@49
|
4149 template<typename eT>
|
Chris@49
|
4150 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4151 inline
|
Chris@49
|
4152 const Mat<eT>&
|
Chris@49
|
4153 Mat<eT>::operator=(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4154 {
|
Chris@49
|
4155 arma_extra_debug_sigprint();
|
Chris@49
|
4156
|
Chris@49
|
4157 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4158 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4159
|
Chris@49
|
4160 const bool bad_alias =
|
Chris@49
|
4161 (
|
Chris@49
|
4162 (eGlue<T1, T2, eglue_type>::proxy1_type::has_subview && X.P1.is_alias(*this))
|
Chris@49
|
4163 ||
|
Chris@49
|
4164 (eGlue<T1, T2, eglue_type>::proxy2_type::has_subview && X.P2.is_alias(*this))
|
Chris@49
|
4165 );
|
Chris@49
|
4166
|
Chris@49
|
4167 if(bad_alias == false)
|
Chris@49
|
4168 {
|
Chris@49
|
4169 init_warm(X.get_n_rows(), X.get_n_cols());
|
Chris@49
|
4170
|
Chris@49
|
4171 eglue_type::apply(*this, X);
|
Chris@49
|
4172 }
|
Chris@49
|
4173 else
|
Chris@49
|
4174 {
|
Chris@49
|
4175 arma_extra_debug_print("bad_alias = true");
|
Chris@49
|
4176
|
Chris@49
|
4177 Mat<eT> tmp(X);
|
Chris@49
|
4178
|
Chris@49
|
4179 steal_mem(tmp);
|
Chris@49
|
4180 }
|
Chris@49
|
4181
|
Chris@49
|
4182 return *this;
|
Chris@49
|
4183 }
|
Chris@49
|
4184
|
Chris@49
|
4185
|
Chris@49
|
4186
|
Chris@49
|
4187 //! in-place matrix addition, with the right-hand-side operands having delayed operations
|
Chris@49
|
4188 template<typename eT>
|
Chris@49
|
4189 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4190 inline
|
Chris@49
|
4191 const Mat<eT>&
|
Chris@49
|
4192 Mat<eT>::operator+=(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4193 {
|
Chris@49
|
4194 arma_extra_debug_sigprint();
|
Chris@49
|
4195
|
Chris@49
|
4196 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4197 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4198
|
Chris@49
|
4199 eglue_type::apply_inplace_plus(*this, X);
|
Chris@49
|
4200
|
Chris@49
|
4201 return *this;
|
Chris@49
|
4202 }
|
Chris@49
|
4203
|
Chris@49
|
4204
|
Chris@49
|
4205
|
Chris@49
|
4206 //! in-place matrix subtraction, with the right-hand-side operands having delayed operations
|
Chris@49
|
4207 template<typename eT>
|
Chris@49
|
4208 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4209 inline
|
Chris@49
|
4210 const Mat<eT>&
|
Chris@49
|
4211 Mat<eT>::operator-=(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4212 {
|
Chris@49
|
4213 arma_extra_debug_sigprint();
|
Chris@49
|
4214
|
Chris@49
|
4215 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4216 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4217
|
Chris@49
|
4218 eglue_type::apply_inplace_minus(*this, X);
|
Chris@49
|
4219
|
Chris@49
|
4220 return *this;
|
Chris@49
|
4221 }
|
Chris@49
|
4222
|
Chris@49
|
4223
|
Chris@49
|
4224
|
Chris@49
|
4225 template<typename eT>
|
Chris@49
|
4226 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4227 inline
|
Chris@49
|
4228 const Mat<eT>&
|
Chris@49
|
4229 Mat<eT>::operator*=(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4230 {
|
Chris@49
|
4231 arma_extra_debug_sigprint();
|
Chris@49
|
4232
|
Chris@49
|
4233 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4234 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4235
|
Chris@49
|
4236 glue_times::apply_inplace(*this, X);
|
Chris@49
|
4237 return *this;
|
Chris@49
|
4238 }
|
Chris@49
|
4239
|
Chris@49
|
4240
|
Chris@49
|
4241
|
Chris@49
|
4242 template<typename eT>
|
Chris@49
|
4243 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4244 inline
|
Chris@49
|
4245 const Mat<eT>&
|
Chris@49
|
4246 Mat<eT>::operator%=(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4247 {
|
Chris@49
|
4248 arma_extra_debug_sigprint();
|
Chris@49
|
4249
|
Chris@49
|
4250 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4251 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4252
|
Chris@49
|
4253 eglue_type::apply_inplace_schur(*this, X);
|
Chris@49
|
4254 return *this;
|
Chris@49
|
4255 }
|
Chris@49
|
4256
|
Chris@49
|
4257
|
Chris@49
|
4258
|
Chris@49
|
4259 template<typename eT>
|
Chris@49
|
4260 template<typename T1, typename T2, typename eglue_type>
|
Chris@49
|
4261 inline
|
Chris@49
|
4262 const Mat<eT>&
|
Chris@49
|
4263 Mat<eT>::operator/=(const eGlue<T1, T2, eglue_type>& X)
|
Chris@49
|
4264 {
|
Chris@49
|
4265 arma_extra_debug_sigprint();
|
Chris@49
|
4266
|
Chris@49
|
4267 arma_type_check(( is_same_type< eT, typename T1::elem_type >::value == false ));
|
Chris@49
|
4268 arma_type_check(( is_same_type< eT, typename T2::elem_type >::value == false ));
|
Chris@49
|
4269
|
Chris@49
|
4270 eglue_type::apply_inplace_div(*this, X);
|
Chris@49
|
4271 return *this;
|
Chris@49
|
4272 }
|
Chris@49
|
4273
|
Chris@49
|
4274
|
Chris@49
|
4275
|
Chris@49
|
4276 //! EXPERIMENTAL: create a matrix from mtGlue, i.e. run the previously delayed binary operations
|
Chris@49
|
4277 template<typename eT>
|
Chris@49
|
4278 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4279 inline
|
Chris@49
|
4280 Mat<eT>::Mat(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4281 : n_rows(0)
|
Chris@49
|
4282 , n_cols(0)
|
Chris@49
|
4283 , n_elem(0)
|
Chris@49
|
4284 , vec_state(0)
|
Chris@49
|
4285 , mem_state(0)
|
Chris@49
|
4286 , mem()
|
Chris@49
|
4287 {
|
Chris@49
|
4288 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
4289
|
Chris@49
|
4290 glue_type::apply(*this, X);
|
Chris@49
|
4291 }
|
Chris@49
|
4292
|
Chris@49
|
4293
|
Chris@49
|
4294
|
Chris@49
|
4295 //! EXPERIMENTAL: create a matrix from Glue, i.e. run the previously delayed binary operations
|
Chris@49
|
4296 template<typename eT>
|
Chris@49
|
4297 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4298 inline
|
Chris@49
|
4299 const Mat<eT>&
|
Chris@49
|
4300 Mat<eT>::operator=(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4301 {
|
Chris@49
|
4302 arma_extra_debug_sigprint();
|
Chris@49
|
4303
|
Chris@49
|
4304 glue_type::apply(*this, X);
|
Chris@49
|
4305
|
Chris@49
|
4306 return *this;
|
Chris@49
|
4307 }
|
Chris@49
|
4308
|
Chris@49
|
4309
|
Chris@49
|
4310
|
Chris@49
|
4311 //! EXPERIMENTAL: in-place matrix addition, with the right-hand-side operands having delayed operations
|
Chris@49
|
4312 template<typename eT>
|
Chris@49
|
4313 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4314 inline
|
Chris@49
|
4315 const Mat<eT>&
|
Chris@49
|
4316 Mat<eT>::operator+=(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4317 {
|
Chris@49
|
4318 arma_extra_debug_sigprint();
|
Chris@49
|
4319
|
Chris@49
|
4320 const Mat<eT> m(X);
|
Chris@49
|
4321
|
Chris@49
|
4322 return (*this).operator+=(m);
|
Chris@49
|
4323 }
|
Chris@49
|
4324
|
Chris@49
|
4325
|
Chris@49
|
4326
|
Chris@49
|
4327 //! EXPERIMENTAL: in-place matrix subtraction, with the right-hand-side operands having delayed operations
|
Chris@49
|
4328 template<typename eT>
|
Chris@49
|
4329 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4330 inline
|
Chris@49
|
4331 const Mat<eT>&
|
Chris@49
|
4332 Mat<eT>::operator-=(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4333 {
|
Chris@49
|
4334 arma_extra_debug_sigprint();
|
Chris@49
|
4335
|
Chris@49
|
4336 const Mat<eT> m(X);
|
Chris@49
|
4337
|
Chris@49
|
4338 return (*this).operator-=(m);
|
Chris@49
|
4339 }
|
Chris@49
|
4340
|
Chris@49
|
4341
|
Chris@49
|
4342
|
Chris@49
|
4343 //! EXPERIMENTAL: in-place matrix multiplications, with the right-hand-side operands having delayed operations
|
Chris@49
|
4344 template<typename eT>
|
Chris@49
|
4345 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4346 inline
|
Chris@49
|
4347 const Mat<eT>&
|
Chris@49
|
4348 Mat<eT>::operator*=(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4349 {
|
Chris@49
|
4350 arma_extra_debug_sigprint();
|
Chris@49
|
4351
|
Chris@49
|
4352 const Mat<eT> m(X);
|
Chris@49
|
4353
|
Chris@49
|
4354 glue_times::apply_inplace(*this, m);
|
Chris@49
|
4355
|
Chris@49
|
4356 return *this;
|
Chris@49
|
4357 }
|
Chris@49
|
4358
|
Chris@49
|
4359
|
Chris@49
|
4360
|
Chris@49
|
4361 //! EXPERIMENTAL: in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations
|
Chris@49
|
4362 template<typename eT>
|
Chris@49
|
4363 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4364 inline
|
Chris@49
|
4365 const Mat<eT>&
|
Chris@49
|
4366 Mat<eT>::operator%=(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4367 {
|
Chris@49
|
4368 arma_extra_debug_sigprint();
|
Chris@49
|
4369
|
Chris@49
|
4370 const Mat<eT> m(X);
|
Chris@49
|
4371
|
Chris@49
|
4372 return (*this).operator%=(m);
|
Chris@49
|
4373 }
|
Chris@49
|
4374
|
Chris@49
|
4375
|
Chris@49
|
4376
|
Chris@49
|
4377 //! EXPERIMENTAL: in-place matrix element-wise division, with the right-hand-side operands having delayed operations
|
Chris@49
|
4378 template<typename eT>
|
Chris@49
|
4379 template<typename T1, typename T2, typename glue_type>
|
Chris@49
|
4380 inline
|
Chris@49
|
4381 const Mat<eT>&
|
Chris@49
|
4382 Mat<eT>::operator/=(const mtGlue<eT, T1, T2, glue_type>& X)
|
Chris@49
|
4383 {
|
Chris@49
|
4384 arma_extra_debug_sigprint();
|
Chris@49
|
4385
|
Chris@49
|
4386 const Mat<eT> m(X);
|
Chris@49
|
4387
|
Chris@49
|
4388 return (*this).operator/=(m);
|
Chris@49
|
4389 }
|
Chris@49
|
4390
|
Chris@49
|
4391
|
Chris@49
|
4392
|
Chris@49
|
4393 //! linear element accessor (treats the matrix as a vector); no bounds check; assumes memory is aligned
|
Chris@49
|
4394 template<typename eT>
|
Chris@49
|
4395 arma_inline
|
Chris@49
|
4396 arma_warn_unused
|
Chris@49
|
4397 const eT&
|
Chris@49
|
4398 Mat<eT>::at_alt(const uword ii) const
|
Chris@49
|
4399 {
|
Chris@49
|
4400 const eT* mem_aligned = mem;
|
Chris@49
|
4401 memory::mark_as_aligned(mem_aligned);
|
Chris@49
|
4402
|
Chris@49
|
4403 return mem_aligned[ii];
|
Chris@49
|
4404 }
|
Chris@49
|
4405
|
Chris@49
|
4406
|
Chris@49
|
4407
|
Chris@49
|
4408 //! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined
|
Chris@49
|
4409 template<typename eT>
|
Chris@49
|
4410 arma_inline
|
Chris@49
|
4411 arma_warn_unused
|
Chris@49
|
4412 eT&
|
Chris@49
|
4413 Mat<eT>::operator() (const uword ii)
|
Chris@49
|
4414 {
|
Chris@49
|
4415 arma_debug_check( (ii >= n_elem), "Mat::operator(): index out of bounds");
|
Chris@49
|
4416 return access::rw(mem[ii]);
|
Chris@49
|
4417 }
|
Chris@49
|
4418
|
Chris@49
|
4419
|
Chris@49
|
4420
|
Chris@49
|
4421 //! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined
|
Chris@49
|
4422 template<typename eT>
|
Chris@49
|
4423 arma_inline
|
Chris@49
|
4424 arma_warn_unused
|
Chris@49
|
4425 const eT&
|
Chris@49
|
4426 Mat<eT>::operator() (const uword ii) const
|
Chris@49
|
4427 {
|
Chris@49
|
4428 arma_debug_check( (ii >= n_elem), "Mat::operator(): index out of bounds");
|
Chris@49
|
4429 return mem[ii];
|
Chris@49
|
4430 }
|
Chris@49
|
4431
|
Chris@49
|
4432
|
Chris@49
|
4433 //! linear element accessor (treats the matrix as a vector); no bounds check.
|
Chris@49
|
4434 template<typename eT>
|
Chris@49
|
4435 arma_inline
|
Chris@49
|
4436 arma_warn_unused
|
Chris@49
|
4437 eT&
|
Chris@49
|
4438 Mat<eT>::operator[] (const uword ii)
|
Chris@49
|
4439 {
|
Chris@49
|
4440 return access::rw(mem[ii]);
|
Chris@49
|
4441 }
|
Chris@49
|
4442
|
Chris@49
|
4443
|
Chris@49
|
4444
|
Chris@49
|
4445 //! linear element accessor (treats the matrix as a vector); no bounds check
|
Chris@49
|
4446 template<typename eT>
|
Chris@49
|
4447 arma_inline
|
Chris@49
|
4448 arma_warn_unused
|
Chris@49
|
4449 const eT&
|
Chris@49
|
4450 Mat<eT>::operator[] (const uword ii) const
|
Chris@49
|
4451 {
|
Chris@49
|
4452 return mem[ii];
|
Chris@49
|
4453 }
|
Chris@49
|
4454
|
Chris@49
|
4455
|
Chris@49
|
4456
|
Chris@49
|
4457 //! linear element accessor (treats the matrix as a vector); no bounds check.
|
Chris@49
|
4458 template<typename eT>
|
Chris@49
|
4459 arma_inline
|
Chris@49
|
4460 arma_warn_unused
|
Chris@49
|
4461 eT&
|
Chris@49
|
4462 Mat<eT>::at(const uword ii)
|
Chris@49
|
4463 {
|
Chris@49
|
4464 return access::rw(mem[ii]);
|
Chris@49
|
4465 }
|
Chris@49
|
4466
|
Chris@49
|
4467
|
Chris@49
|
4468
|
Chris@49
|
4469 //! linear element accessor (treats the matrix as a vector); no bounds check
|
Chris@49
|
4470 template<typename eT>
|
Chris@49
|
4471 arma_inline
|
Chris@49
|
4472 arma_warn_unused
|
Chris@49
|
4473 const eT&
|
Chris@49
|
4474 Mat<eT>::at(const uword ii) const
|
Chris@49
|
4475 {
|
Chris@49
|
4476 return mem[ii];
|
Chris@49
|
4477 }
|
Chris@49
|
4478
|
Chris@49
|
4479
|
Chris@49
|
4480
|
Chris@49
|
4481 //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined
|
Chris@49
|
4482 template<typename eT>
|
Chris@49
|
4483 arma_inline
|
Chris@49
|
4484 arma_warn_unused
|
Chris@49
|
4485 eT&
|
Chris@49
|
4486 Mat<eT>::operator() (const uword in_row, const uword in_col)
|
Chris@49
|
4487 {
|
Chris@49
|
4488 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): index out of bounds");
|
Chris@49
|
4489 return access::rw(mem[in_row + in_col*n_rows]);
|
Chris@49
|
4490 }
|
Chris@49
|
4491
|
Chris@49
|
4492
|
Chris@49
|
4493
|
Chris@49
|
4494 //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined
|
Chris@49
|
4495 template<typename eT>
|
Chris@49
|
4496 arma_inline
|
Chris@49
|
4497 arma_warn_unused
|
Chris@49
|
4498 const eT&
|
Chris@49
|
4499 Mat<eT>::operator() (const uword in_row, const uword in_col) const
|
Chris@49
|
4500 {
|
Chris@49
|
4501 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): index out of bounds");
|
Chris@49
|
4502 return mem[in_row + in_col*n_rows];
|
Chris@49
|
4503 }
|
Chris@49
|
4504
|
Chris@49
|
4505
|
Chris@49
|
4506
|
Chris@49
|
4507 //! element accessor; no bounds check
|
Chris@49
|
4508 template<typename eT>
|
Chris@49
|
4509 arma_inline
|
Chris@49
|
4510 arma_warn_unused
|
Chris@49
|
4511 eT&
|
Chris@49
|
4512 Mat<eT>::at(const uword in_row, const uword in_col)
|
Chris@49
|
4513 {
|
Chris@49
|
4514 return access::rw( mem[in_row + in_col*n_rows] );
|
Chris@49
|
4515 }
|
Chris@49
|
4516
|
Chris@49
|
4517
|
Chris@49
|
4518
|
Chris@49
|
4519 //! element accessor; no bounds check
|
Chris@49
|
4520 template<typename eT>
|
Chris@49
|
4521 arma_inline
|
Chris@49
|
4522 arma_warn_unused
|
Chris@49
|
4523 const eT&
|
Chris@49
|
4524 Mat<eT>::at(const uword in_row, const uword in_col) const
|
Chris@49
|
4525 {
|
Chris@49
|
4526 return mem[in_row + in_col*n_rows];
|
Chris@49
|
4527 }
|
Chris@49
|
4528
|
Chris@49
|
4529
|
Chris@49
|
4530
|
Chris@49
|
4531 //! prefix ++
|
Chris@49
|
4532 template<typename eT>
|
Chris@49
|
4533 arma_inline
|
Chris@49
|
4534 const Mat<eT>&
|
Chris@49
|
4535 Mat<eT>::operator++()
|
Chris@49
|
4536 {
|
Chris@49
|
4537 Mat_aux::prefix_pp(*this);
|
Chris@49
|
4538 return *this;
|
Chris@49
|
4539 }
|
Chris@49
|
4540
|
Chris@49
|
4541
|
Chris@49
|
4542
|
Chris@49
|
4543 //! postfix ++ (must not return the object by reference)
|
Chris@49
|
4544 template<typename eT>
|
Chris@49
|
4545 arma_inline
|
Chris@49
|
4546 void
|
Chris@49
|
4547 Mat<eT>::operator++(int)
|
Chris@49
|
4548 {
|
Chris@49
|
4549 Mat_aux::postfix_pp(*this);
|
Chris@49
|
4550 }
|
Chris@49
|
4551
|
Chris@49
|
4552
|
Chris@49
|
4553
|
Chris@49
|
4554 //! prefix --
|
Chris@49
|
4555 template<typename eT>
|
Chris@49
|
4556 arma_inline
|
Chris@49
|
4557 const Mat<eT>&
|
Chris@49
|
4558 Mat<eT>::operator--()
|
Chris@49
|
4559 {
|
Chris@49
|
4560 Mat_aux::prefix_mm(*this);
|
Chris@49
|
4561 return *this;
|
Chris@49
|
4562 }
|
Chris@49
|
4563
|
Chris@49
|
4564
|
Chris@49
|
4565
|
Chris@49
|
4566 //! postfix -- (must not return the object by reference)
|
Chris@49
|
4567 template<typename eT>
|
Chris@49
|
4568 arma_inline
|
Chris@49
|
4569 void
|
Chris@49
|
4570 Mat<eT>::operator--(int)
|
Chris@49
|
4571 {
|
Chris@49
|
4572 Mat_aux::postfix_mm(*this);
|
Chris@49
|
4573 }
|
Chris@49
|
4574
|
Chris@49
|
4575
|
Chris@49
|
4576
|
Chris@49
|
4577 //! returns true if the matrix has no elements
|
Chris@49
|
4578 template<typename eT>
|
Chris@49
|
4579 arma_inline
|
Chris@49
|
4580 arma_warn_unused
|
Chris@49
|
4581 bool
|
Chris@49
|
4582 Mat<eT>::is_empty() const
|
Chris@49
|
4583 {
|
Chris@49
|
4584 return (n_elem == 0);
|
Chris@49
|
4585 }
|
Chris@49
|
4586
|
Chris@49
|
4587
|
Chris@49
|
4588
|
Chris@49
|
4589 //! returns true if the object can be interpreted as a column or row vector
|
Chris@49
|
4590 template<typename eT>
|
Chris@49
|
4591 arma_inline
|
Chris@49
|
4592 arma_warn_unused
|
Chris@49
|
4593 bool
|
Chris@49
|
4594 Mat<eT>::is_vec() const
|
Chris@49
|
4595 {
|
Chris@49
|
4596 return ( (n_rows == 1) || (n_cols == 1) );
|
Chris@49
|
4597 }
|
Chris@49
|
4598
|
Chris@49
|
4599
|
Chris@49
|
4600
|
Chris@49
|
4601 //! returns true if the object can be interpreted as a row vector
|
Chris@49
|
4602 template<typename eT>
|
Chris@49
|
4603 arma_inline
|
Chris@49
|
4604 arma_warn_unused
|
Chris@49
|
4605 bool
|
Chris@49
|
4606 Mat<eT>::is_rowvec() const
|
Chris@49
|
4607 {
|
Chris@49
|
4608 return (n_rows == 1);
|
Chris@49
|
4609 }
|
Chris@49
|
4610
|
Chris@49
|
4611
|
Chris@49
|
4612
|
Chris@49
|
4613 //! returns true if the object can be interpreted as a column vector
|
Chris@49
|
4614 template<typename eT>
|
Chris@49
|
4615 arma_inline
|
Chris@49
|
4616 arma_warn_unused
|
Chris@49
|
4617 bool
|
Chris@49
|
4618 Mat<eT>::is_colvec() const
|
Chris@49
|
4619 {
|
Chris@49
|
4620 return (n_cols == 1);
|
Chris@49
|
4621 }
|
Chris@49
|
4622
|
Chris@49
|
4623
|
Chris@49
|
4624
|
Chris@49
|
4625 //! returns true if the object has the same number of non-zero rows and columnns
|
Chris@49
|
4626 template<typename eT>
|
Chris@49
|
4627 arma_inline
|
Chris@49
|
4628 arma_warn_unused
|
Chris@49
|
4629 bool
|
Chris@49
|
4630 Mat<eT>::is_square() const
|
Chris@49
|
4631 {
|
Chris@49
|
4632 return (n_rows == n_cols);
|
Chris@49
|
4633 }
|
Chris@49
|
4634
|
Chris@49
|
4635
|
Chris@49
|
4636
|
Chris@49
|
4637 //! returns true if all of the elements are finite
|
Chris@49
|
4638 template<typename eT>
|
Chris@49
|
4639 inline
|
Chris@49
|
4640 arma_warn_unused
|
Chris@49
|
4641 bool
|
Chris@49
|
4642 Mat<eT>::is_finite() const
|
Chris@49
|
4643 {
|
Chris@49
|
4644 return arrayops::is_finite( memptr(), n_elem );
|
Chris@49
|
4645 }
|
Chris@49
|
4646
|
Chris@49
|
4647
|
Chris@49
|
4648
|
Chris@49
|
4649 //! returns true if the given index is currently in range
|
Chris@49
|
4650 template<typename eT>
|
Chris@49
|
4651 arma_inline
|
Chris@49
|
4652 arma_warn_unused
|
Chris@49
|
4653 bool
|
Chris@49
|
4654 Mat<eT>::in_range(const uword ii) const
|
Chris@49
|
4655 {
|
Chris@49
|
4656 return (ii < n_elem);
|
Chris@49
|
4657 }
|
Chris@49
|
4658
|
Chris@49
|
4659
|
Chris@49
|
4660
|
Chris@49
|
4661 //! returns true if the given start and end indices are currently in range
|
Chris@49
|
4662 template<typename eT>
|
Chris@49
|
4663 arma_inline
|
Chris@49
|
4664 arma_warn_unused
|
Chris@49
|
4665 bool
|
Chris@49
|
4666 Mat<eT>::in_range(const span& x) const
|
Chris@49
|
4667 {
|
Chris@49
|
4668 arma_extra_debug_sigprint();
|
Chris@49
|
4669
|
Chris@49
|
4670 if(x.whole == true)
|
Chris@49
|
4671 {
|
Chris@49
|
4672 return true;
|
Chris@49
|
4673 }
|
Chris@49
|
4674 else
|
Chris@49
|
4675 {
|
Chris@49
|
4676 const uword a = x.a;
|
Chris@49
|
4677 const uword b = x.b;
|
Chris@49
|
4678
|
Chris@49
|
4679 return ( (a <= b) && (b < n_elem) );
|
Chris@49
|
4680 }
|
Chris@49
|
4681 }
|
Chris@49
|
4682
|
Chris@49
|
4683
|
Chris@49
|
4684
|
Chris@49
|
4685 //! returns true if the given location is currently in range
|
Chris@49
|
4686 template<typename eT>
|
Chris@49
|
4687 arma_inline
|
Chris@49
|
4688 arma_warn_unused
|
Chris@49
|
4689 bool
|
Chris@49
|
4690 Mat<eT>::in_range(const uword in_row, const uword in_col) const
|
Chris@49
|
4691 {
|
Chris@49
|
4692 return ( (in_row < n_rows) && (in_col < n_cols) );
|
Chris@49
|
4693 }
|
Chris@49
|
4694
|
Chris@49
|
4695
|
Chris@49
|
4696
|
Chris@49
|
4697 template<typename eT>
|
Chris@49
|
4698 arma_inline
|
Chris@49
|
4699 arma_warn_unused
|
Chris@49
|
4700 bool
|
Chris@49
|
4701 Mat<eT>::in_range(const span& row_span, const uword in_col) const
|
Chris@49
|
4702 {
|
Chris@49
|
4703 arma_extra_debug_sigprint();
|
Chris@49
|
4704
|
Chris@49
|
4705 if(row_span.whole == true)
|
Chris@49
|
4706 {
|
Chris@49
|
4707 return (in_col < n_cols);
|
Chris@49
|
4708 }
|
Chris@49
|
4709 else
|
Chris@49
|
4710 {
|
Chris@49
|
4711 const uword in_row1 = row_span.a;
|
Chris@49
|
4712 const uword in_row2 = row_span.b;
|
Chris@49
|
4713
|
Chris@49
|
4714 return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) );
|
Chris@49
|
4715 }
|
Chris@49
|
4716 }
|
Chris@49
|
4717
|
Chris@49
|
4718
|
Chris@49
|
4719
|
Chris@49
|
4720 template<typename eT>
|
Chris@49
|
4721 arma_inline
|
Chris@49
|
4722 arma_warn_unused
|
Chris@49
|
4723 bool
|
Chris@49
|
4724 Mat<eT>::in_range(const uword in_row, const span& col_span) const
|
Chris@49
|
4725 {
|
Chris@49
|
4726 arma_extra_debug_sigprint();
|
Chris@49
|
4727
|
Chris@49
|
4728 if(col_span.whole == true)
|
Chris@49
|
4729 {
|
Chris@49
|
4730 return (in_row < n_rows);
|
Chris@49
|
4731 }
|
Chris@49
|
4732 else
|
Chris@49
|
4733 {
|
Chris@49
|
4734 const uword in_col1 = col_span.a;
|
Chris@49
|
4735 const uword in_col2 = col_span.b;
|
Chris@49
|
4736
|
Chris@49
|
4737 return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) );
|
Chris@49
|
4738 }
|
Chris@49
|
4739 }
|
Chris@49
|
4740
|
Chris@49
|
4741
|
Chris@49
|
4742
|
Chris@49
|
4743 template<typename eT>
|
Chris@49
|
4744 arma_inline
|
Chris@49
|
4745 arma_warn_unused
|
Chris@49
|
4746 bool
|
Chris@49
|
4747 Mat<eT>::in_range(const span& row_span, const span& col_span) const
|
Chris@49
|
4748 {
|
Chris@49
|
4749 arma_extra_debug_sigprint();
|
Chris@49
|
4750
|
Chris@49
|
4751 const uword in_row1 = row_span.a;
|
Chris@49
|
4752 const uword in_row2 = row_span.b;
|
Chris@49
|
4753
|
Chris@49
|
4754 const uword in_col1 = col_span.a;
|
Chris@49
|
4755 const uword in_col2 = col_span.b;
|
Chris@49
|
4756
|
Chris@49
|
4757 const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) );
|
Chris@49
|
4758 const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) );
|
Chris@49
|
4759
|
Chris@49
|
4760 return ( (rows_ok == true) && (cols_ok == true) );
|
Chris@49
|
4761 }
|
Chris@49
|
4762
|
Chris@49
|
4763
|
Chris@49
|
4764
|
Chris@49
|
4765 //! returns a pointer to array of eTs for a specified column; no bounds check
|
Chris@49
|
4766 template<typename eT>
|
Chris@49
|
4767 arma_inline
|
Chris@49
|
4768 arma_warn_unused
|
Chris@49
|
4769 eT*
|
Chris@49
|
4770 Mat<eT>::colptr(const uword in_col)
|
Chris@49
|
4771 {
|
Chris@49
|
4772 return & access::rw(mem[in_col*n_rows]);
|
Chris@49
|
4773 }
|
Chris@49
|
4774
|
Chris@49
|
4775
|
Chris@49
|
4776
|
Chris@49
|
4777 //! returns a pointer to array of eTs for a specified column; no bounds check
|
Chris@49
|
4778 template<typename eT>
|
Chris@49
|
4779 arma_inline
|
Chris@49
|
4780 arma_warn_unused
|
Chris@49
|
4781 const eT*
|
Chris@49
|
4782 Mat<eT>::colptr(const uword in_col) const
|
Chris@49
|
4783 {
|
Chris@49
|
4784 return & mem[in_col*n_rows];
|
Chris@49
|
4785 }
|
Chris@49
|
4786
|
Chris@49
|
4787
|
Chris@49
|
4788
|
Chris@49
|
4789 //! returns a pointer to array of eTs used by the matrix
|
Chris@49
|
4790 template<typename eT>
|
Chris@49
|
4791 arma_inline
|
Chris@49
|
4792 arma_warn_unused
|
Chris@49
|
4793 eT*
|
Chris@49
|
4794 Mat<eT>::memptr()
|
Chris@49
|
4795 {
|
Chris@49
|
4796 return const_cast<eT*>(mem);
|
Chris@49
|
4797 }
|
Chris@49
|
4798
|
Chris@49
|
4799
|
Chris@49
|
4800
|
Chris@49
|
4801 //! returns a pointer to array of eTs used by the matrix
|
Chris@49
|
4802 template<typename eT>
|
Chris@49
|
4803 arma_inline
|
Chris@49
|
4804 arma_warn_unused
|
Chris@49
|
4805 const eT*
|
Chris@49
|
4806 Mat<eT>::memptr() const
|
Chris@49
|
4807 {
|
Chris@49
|
4808 return mem;
|
Chris@49
|
4809 }
|
Chris@49
|
4810
|
Chris@49
|
4811
|
Chris@49
|
4812
|
Chris@49
|
4813 //! print contents of the matrix (to the cout stream),
|
Chris@49
|
4814 //! optionally preceding with a user specified line of text.
|
Chris@49
|
4815 //! the precision and cell width are modified.
|
Chris@49
|
4816 //! on return, the stream's state are restored to their original values.
|
Chris@49
|
4817 template<typename eT>
|
Chris@49
|
4818 inline
|
Chris@49
|
4819 void
|
Chris@49
|
4820 Mat<eT>::impl_print(const std::string& extra_text) const
|
Chris@49
|
4821 {
|
Chris@49
|
4822 arma_extra_debug_sigprint();
|
Chris@49
|
4823
|
Chris@49
|
4824 if(extra_text.length() != 0)
|
Chris@49
|
4825 {
|
Chris@49
|
4826 const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();
|
Chris@49
|
4827
|
Chris@49
|
4828 ARMA_DEFAULT_OSTREAM << extra_text << '\n';
|
Chris@49
|
4829
|
Chris@49
|
4830 ARMA_DEFAULT_OSTREAM.width(orig_width);
|
Chris@49
|
4831 }
|
Chris@49
|
4832
|
Chris@49
|
4833 arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, true);
|
Chris@49
|
4834 }
|
Chris@49
|
4835
|
Chris@49
|
4836
|
Chris@49
|
4837
|
Chris@49
|
4838 //! print contents of the matrix to a user specified stream,
|
Chris@49
|
4839 //! optionally preceding with a user specified line of text.
|
Chris@49
|
4840 //! the precision and cell width are modified.
|
Chris@49
|
4841 //! on return, the stream's state are restored to their original values.
|
Chris@49
|
4842 template<typename eT>
|
Chris@49
|
4843 inline
|
Chris@49
|
4844 void
|
Chris@49
|
4845 Mat<eT>::impl_print(std::ostream& user_stream, const std::string& extra_text) const
|
Chris@49
|
4846 {
|
Chris@49
|
4847 arma_extra_debug_sigprint();
|
Chris@49
|
4848
|
Chris@49
|
4849 if(extra_text.length() != 0)
|
Chris@49
|
4850 {
|
Chris@49
|
4851 const std::streamsize orig_width = user_stream.width();
|
Chris@49
|
4852
|
Chris@49
|
4853 user_stream << extra_text << '\n';
|
Chris@49
|
4854
|
Chris@49
|
4855 user_stream.width(orig_width);
|
Chris@49
|
4856 }
|
Chris@49
|
4857
|
Chris@49
|
4858 arma_ostream::print(user_stream, *this, true);
|
Chris@49
|
4859 }
|
Chris@49
|
4860
|
Chris@49
|
4861
|
Chris@49
|
4862
|
Chris@49
|
4863 //! print contents of the matrix (to the cout stream),
|
Chris@49
|
4864 //! optionally preceding with a user specified line of text.
|
Chris@49
|
4865 //! the stream's state are used as is and are not modified
|
Chris@49
|
4866 //! (i.e. the precision and cell width are not modified).
|
Chris@49
|
4867 template<typename eT>
|
Chris@49
|
4868 inline
|
Chris@49
|
4869 void
|
Chris@49
|
4870 Mat<eT>::impl_raw_print(const std::string& extra_text) const
|
Chris@49
|
4871 {
|
Chris@49
|
4872 arma_extra_debug_sigprint();
|
Chris@49
|
4873
|
Chris@49
|
4874 if(extra_text.length() != 0)
|
Chris@49
|
4875 {
|
Chris@49
|
4876 const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();
|
Chris@49
|
4877
|
Chris@49
|
4878 ARMA_DEFAULT_OSTREAM << extra_text << '\n';
|
Chris@49
|
4879
|
Chris@49
|
4880 ARMA_DEFAULT_OSTREAM.width(orig_width);
|
Chris@49
|
4881 }
|
Chris@49
|
4882
|
Chris@49
|
4883 arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, false);
|
Chris@49
|
4884 }
|
Chris@49
|
4885
|
Chris@49
|
4886
|
Chris@49
|
4887
|
Chris@49
|
4888 //! print contents of the matrix to a user specified stream,
|
Chris@49
|
4889 //! optionally preceding with a user specified line of text.
|
Chris@49
|
4890 //! the stream's state are used as is and are not modified.
|
Chris@49
|
4891 //! (i.e. the precision and cell width are not modified).
|
Chris@49
|
4892 template<typename eT>
|
Chris@49
|
4893 inline
|
Chris@49
|
4894 void
|
Chris@49
|
4895 Mat<eT>::impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const
|
Chris@49
|
4896 {
|
Chris@49
|
4897 arma_extra_debug_sigprint();
|
Chris@49
|
4898
|
Chris@49
|
4899 if(extra_text.length() != 0)
|
Chris@49
|
4900 {
|
Chris@49
|
4901 const std::streamsize orig_width = user_stream.width();
|
Chris@49
|
4902
|
Chris@49
|
4903 user_stream << extra_text << '\n';
|
Chris@49
|
4904
|
Chris@49
|
4905 user_stream.width(orig_width);
|
Chris@49
|
4906 }
|
Chris@49
|
4907
|
Chris@49
|
4908 arma_ostream::print(user_stream, *this, false);
|
Chris@49
|
4909 }
|
Chris@49
|
4910
|
Chris@49
|
4911
|
Chris@49
|
4912
|
Chris@49
|
4913 //! change the matrix to have user specified dimensions (data is not preserved)
|
Chris@49
|
4914 template<typename eT>
|
Chris@49
|
4915 inline
|
Chris@49
|
4916 void
|
Chris@49
|
4917 Mat<eT>::set_size(const uword in_elem)
|
Chris@49
|
4918 {
|
Chris@49
|
4919 arma_extra_debug_sigprint();
|
Chris@49
|
4920
|
Chris@49
|
4921 switch(vec_state)
|
Chris@49
|
4922 {
|
Chris@49
|
4923 case 0:
|
Chris@49
|
4924 case 1:
|
Chris@49
|
4925 init_warm(in_elem, 1);
|
Chris@49
|
4926 break;
|
Chris@49
|
4927
|
Chris@49
|
4928 case 2:
|
Chris@49
|
4929 init_warm(1, in_elem);
|
Chris@49
|
4930 break;
|
Chris@49
|
4931
|
Chris@49
|
4932 default:
|
Chris@49
|
4933 ;
|
Chris@49
|
4934 }
|
Chris@49
|
4935 }
|
Chris@49
|
4936
|
Chris@49
|
4937
|
Chris@49
|
4938
|
Chris@49
|
4939 //! change the matrix to have user specified dimensions (data is not preserved)
|
Chris@49
|
4940 template<typename eT>
|
Chris@49
|
4941 inline
|
Chris@49
|
4942 void
|
Chris@49
|
4943 Mat<eT>::set_size(const uword in_rows, const uword in_cols)
|
Chris@49
|
4944 {
|
Chris@49
|
4945 arma_extra_debug_sigprint();
|
Chris@49
|
4946
|
Chris@49
|
4947 init_warm(in_rows, in_cols);
|
Chris@49
|
4948 }
|
Chris@49
|
4949
|
Chris@49
|
4950
|
Chris@49
|
4951
|
Chris@49
|
4952 //! change the matrix to have user specified dimensions (data is preserved)
|
Chris@49
|
4953 template<typename eT>
|
Chris@49
|
4954 inline
|
Chris@49
|
4955 void
|
Chris@49
|
4956 Mat<eT>::resize(const uword in_elem)
|
Chris@49
|
4957 {
|
Chris@49
|
4958 arma_extra_debug_sigprint();
|
Chris@49
|
4959
|
Chris@49
|
4960 switch(vec_state)
|
Chris@49
|
4961 {
|
Chris@49
|
4962 case 0:
|
Chris@49
|
4963 case 1:
|
Chris@49
|
4964 (*this).resize(in_elem, 1);
|
Chris@49
|
4965 break;
|
Chris@49
|
4966
|
Chris@49
|
4967 case 2:
|
Chris@49
|
4968 (*this).resize(1, in_elem);
|
Chris@49
|
4969 break;
|
Chris@49
|
4970
|
Chris@49
|
4971 default:
|
Chris@49
|
4972 ;
|
Chris@49
|
4973 }
|
Chris@49
|
4974 }
|
Chris@49
|
4975
|
Chris@49
|
4976
|
Chris@49
|
4977
|
Chris@49
|
4978 //! change the matrix to have user specified dimensions (data is preserved)
|
Chris@49
|
4979 template<typename eT>
|
Chris@49
|
4980 inline
|
Chris@49
|
4981 void
|
Chris@49
|
4982 Mat<eT>::resize(const uword in_rows, const uword in_cols)
|
Chris@49
|
4983 {
|
Chris@49
|
4984 arma_extra_debug_sigprint();
|
Chris@49
|
4985
|
Chris@49
|
4986 *this = arma::resize(*this, in_rows, in_cols);
|
Chris@49
|
4987 }
|
Chris@49
|
4988
|
Chris@49
|
4989
|
Chris@49
|
4990
|
Chris@49
|
4991 //! change the matrix to have user specified dimensions (data is preserved)
|
Chris@49
|
4992 template<typename eT>
|
Chris@49
|
4993 inline
|
Chris@49
|
4994 void
|
Chris@49
|
4995 Mat<eT>::reshape(const uword in_rows, const uword in_cols, const uword dim)
|
Chris@49
|
4996 {
|
Chris@49
|
4997 arma_extra_debug_sigprint();
|
Chris@49
|
4998
|
Chris@49
|
4999 *this = arma::reshape(*this, in_rows, in_cols, dim);
|
Chris@49
|
5000 }
|
Chris@49
|
5001
|
Chris@49
|
5002
|
Chris@49
|
5003
|
Chris@49
|
5004 //! change the matrix (without preserving data) to have the same dimensions as the given expression
|
Chris@49
|
5005 template<typename eT>
|
Chris@49
|
5006 template<typename eT2, typename expr>
|
Chris@49
|
5007 inline
|
Chris@49
|
5008 void
|
Chris@49
|
5009 Mat<eT>::copy_size(const Base<eT2, expr>& X)
|
Chris@49
|
5010 {
|
Chris@49
|
5011 arma_extra_debug_sigprint();
|
Chris@49
|
5012
|
Chris@49
|
5013 const Proxy<expr> P(X.get_ref());
|
Chris@49
|
5014
|
Chris@49
|
5015 const uword X_n_rows = P.get_n_rows();
|
Chris@49
|
5016 const uword X_n_cols = P.get_n_cols();
|
Chris@49
|
5017
|
Chris@49
|
5018 init_warm(X_n_rows, X_n_cols);
|
Chris@49
|
5019 }
|
Chris@49
|
5020
|
Chris@49
|
5021
|
Chris@49
|
5022
|
Chris@49
|
5023 //! transform each element in the matrix using a functor
|
Chris@49
|
5024 template<typename eT>
|
Chris@49
|
5025 template<typename functor>
|
Chris@49
|
5026 inline
|
Chris@49
|
5027 const Mat<eT>&
|
Chris@49
|
5028 Mat<eT>::transform(functor F)
|
Chris@49
|
5029 {
|
Chris@49
|
5030 arma_extra_debug_sigprint();
|
Chris@49
|
5031
|
Chris@49
|
5032 eT* out_mem = memptr();
|
Chris@49
|
5033
|
Chris@49
|
5034 const uword N = n_elem;
|
Chris@49
|
5035
|
Chris@49
|
5036 uword ii, jj;
|
Chris@49
|
5037
|
Chris@49
|
5038 for(ii=0, jj=1; jj < N; ii+=2, jj+=2)
|
Chris@49
|
5039 {
|
Chris@49
|
5040 eT tmp_ii = out_mem[ii];
|
Chris@49
|
5041 eT tmp_jj = out_mem[jj];
|
Chris@49
|
5042
|
Chris@49
|
5043 tmp_ii = eT( F(tmp_ii) );
|
Chris@49
|
5044 tmp_jj = eT( F(tmp_jj) );
|
Chris@49
|
5045
|
Chris@49
|
5046 out_mem[ii] = tmp_ii;
|
Chris@49
|
5047 out_mem[jj] = tmp_jj;
|
Chris@49
|
5048 }
|
Chris@49
|
5049
|
Chris@49
|
5050 if(ii < N)
|
Chris@49
|
5051 {
|
Chris@49
|
5052 out_mem[ii] = eT( F(out_mem[ii]) );
|
Chris@49
|
5053 }
|
Chris@49
|
5054
|
Chris@49
|
5055 return *this;
|
Chris@49
|
5056 }
|
Chris@49
|
5057
|
Chris@49
|
5058
|
Chris@49
|
5059
|
Chris@49
|
5060 //! imbue (fill) the matrix with values provided by a functor
|
Chris@49
|
5061 template<typename eT>
|
Chris@49
|
5062 template<typename functor>
|
Chris@49
|
5063 inline
|
Chris@49
|
5064 const Mat<eT>&
|
Chris@49
|
5065 Mat<eT>::imbue(functor F)
|
Chris@49
|
5066 {
|
Chris@49
|
5067 arma_extra_debug_sigprint();
|
Chris@49
|
5068
|
Chris@49
|
5069 eT* out_mem = memptr();
|
Chris@49
|
5070
|
Chris@49
|
5071 const uword N = n_elem;
|
Chris@49
|
5072
|
Chris@49
|
5073 uword ii, jj;
|
Chris@49
|
5074
|
Chris@49
|
5075 for(ii=0, jj=1; jj < N; ii+=2, jj+=2)
|
Chris@49
|
5076 {
|
Chris@49
|
5077 const eT tmp_ii = eT( F() );
|
Chris@49
|
5078 const eT tmp_jj = eT( F() );
|
Chris@49
|
5079
|
Chris@49
|
5080 out_mem[ii] = tmp_ii;
|
Chris@49
|
5081 out_mem[jj] = tmp_jj;
|
Chris@49
|
5082 }
|
Chris@49
|
5083
|
Chris@49
|
5084 if(ii < N)
|
Chris@49
|
5085 {
|
Chris@49
|
5086 out_mem[ii] = eT( F() );
|
Chris@49
|
5087 }
|
Chris@49
|
5088
|
Chris@49
|
5089 return *this;
|
Chris@49
|
5090 }
|
Chris@49
|
5091
|
Chris@49
|
5092
|
Chris@49
|
5093
|
Chris@49
|
5094 //! fill the matrix with the specified value
|
Chris@49
|
5095 template<typename eT>
|
Chris@49
|
5096 arma_hot
|
Chris@49
|
5097 inline
|
Chris@49
|
5098 const Mat<eT>&
|
Chris@49
|
5099 Mat<eT>::fill(const eT val)
|
Chris@49
|
5100 {
|
Chris@49
|
5101 arma_extra_debug_sigprint();
|
Chris@49
|
5102
|
Chris@49
|
5103 arrayops::inplace_set( memptr(), val, n_elem );
|
Chris@49
|
5104
|
Chris@49
|
5105 return *this;
|
Chris@49
|
5106 }
|
Chris@49
|
5107
|
Chris@49
|
5108
|
Chris@49
|
5109
|
Chris@49
|
5110 template<typename eT>
|
Chris@49
|
5111 inline
|
Chris@49
|
5112 const Mat<eT>&
|
Chris@49
|
5113 Mat<eT>::zeros()
|
Chris@49
|
5114 {
|
Chris@49
|
5115 arma_extra_debug_sigprint();
|
Chris@49
|
5116
|
Chris@49
|
5117 return fill(eT(0));
|
Chris@49
|
5118 }
|
Chris@49
|
5119
|
Chris@49
|
5120
|
Chris@49
|
5121
|
Chris@49
|
5122 template<typename eT>
|
Chris@49
|
5123 inline
|
Chris@49
|
5124 const Mat<eT>&
|
Chris@49
|
5125 Mat<eT>::zeros(const uword in_elem)
|
Chris@49
|
5126 {
|
Chris@49
|
5127 arma_extra_debug_sigprint();
|
Chris@49
|
5128
|
Chris@49
|
5129 set_size(in_elem);
|
Chris@49
|
5130
|
Chris@49
|
5131 return fill(eT(0));
|
Chris@49
|
5132 }
|
Chris@49
|
5133
|
Chris@49
|
5134
|
Chris@49
|
5135
|
Chris@49
|
5136 template<typename eT>
|
Chris@49
|
5137 inline
|
Chris@49
|
5138 const Mat<eT>&
|
Chris@49
|
5139 Mat<eT>::zeros(const uword in_rows, const uword in_cols)
|
Chris@49
|
5140 {
|
Chris@49
|
5141 arma_extra_debug_sigprint();
|
Chris@49
|
5142
|
Chris@49
|
5143 set_size(in_rows, in_cols);
|
Chris@49
|
5144
|
Chris@49
|
5145 return fill(eT(0));
|
Chris@49
|
5146 }
|
Chris@49
|
5147
|
Chris@49
|
5148
|
Chris@49
|
5149
|
Chris@49
|
5150 template<typename eT>
|
Chris@49
|
5151 inline
|
Chris@49
|
5152 const Mat<eT>&
|
Chris@49
|
5153 Mat<eT>::ones()
|
Chris@49
|
5154 {
|
Chris@49
|
5155 arma_extra_debug_sigprint();
|
Chris@49
|
5156
|
Chris@49
|
5157 return fill(eT(1));
|
Chris@49
|
5158 }
|
Chris@49
|
5159
|
Chris@49
|
5160
|
Chris@49
|
5161
|
Chris@49
|
5162 template<typename eT>
|
Chris@49
|
5163 inline
|
Chris@49
|
5164 const Mat<eT>&
|
Chris@49
|
5165 Mat<eT>::ones(const uword in_elem)
|
Chris@49
|
5166 {
|
Chris@49
|
5167 arma_extra_debug_sigprint();
|
Chris@49
|
5168
|
Chris@49
|
5169 set_size(in_elem);
|
Chris@49
|
5170
|
Chris@49
|
5171 return fill(eT(1));
|
Chris@49
|
5172 }
|
Chris@49
|
5173
|
Chris@49
|
5174
|
Chris@49
|
5175
|
Chris@49
|
5176 template<typename eT>
|
Chris@49
|
5177 inline
|
Chris@49
|
5178 const Mat<eT>&
|
Chris@49
|
5179 Mat<eT>::ones(const uword in_rows, const uword in_cols)
|
Chris@49
|
5180 {
|
Chris@49
|
5181 arma_extra_debug_sigprint();
|
Chris@49
|
5182
|
Chris@49
|
5183 set_size(in_rows, in_cols);
|
Chris@49
|
5184
|
Chris@49
|
5185 return fill(eT(1));
|
Chris@49
|
5186 }
|
Chris@49
|
5187
|
Chris@49
|
5188
|
Chris@49
|
5189
|
Chris@49
|
5190 template<typename eT>
|
Chris@49
|
5191 inline
|
Chris@49
|
5192 const Mat<eT>&
|
Chris@49
|
5193 Mat<eT>::randu()
|
Chris@49
|
5194 {
|
Chris@49
|
5195 arma_extra_debug_sigprint();
|
Chris@49
|
5196
|
Chris@49
|
5197 eop_aux_randu<eT>::fill( memptr(), n_elem );
|
Chris@49
|
5198
|
Chris@49
|
5199 return *this;
|
Chris@49
|
5200 }
|
Chris@49
|
5201
|
Chris@49
|
5202
|
Chris@49
|
5203
|
Chris@49
|
5204 template<typename eT>
|
Chris@49
|
5205 inline
|
Chris@49
|
5206 const Mat<eT>&
|
Chris@49
|
5207 Mat<eT>::randu(const uword in_elem)
|
Chris@49
|
5208 {
|
Chris@49
|
5209 arma_extra_debug_sigprint();
|
Chris@49
|
5210
|
Chris@49
|
5211 set_size(in_elem);
|
Chris@49
|
5212
|
Chris@49
|
5213 return (*this).randu();
|
Chris@49
|
5214 }
|
Chris@49
|
5215
|
Chris@49
|
5216
|
Chris@49
|
5217
|
Chris@49
|
5218 template<typename eT>
|
Chris@49
|
5219 inline
|
Chris@49
|
5220 const Mat<eT>&
|
Chris@49
|
5221 Mat<eT>::randu(const uword in_rows, const uword in_cols)
|
Chris@49
|
5222 {
|
Chris@49
|
5223 arma_extra_debug_sigprint();
|
Chris@49
|
5224
|
Chris@49
|
5225 set_size(in_rows, in_cols);
|
Chris@49
|
5226
|
Chris@49
|
5227 return (*this).randu();
|
Chris@49
|
5228 }
|
Chris@49
|
5229
|
Chris@49
|
5230
|
Chris@49
|
5231
|
Chris@49
|
5232 template<typename eT>
|
Chris@49
|
5233 inline
|
Chris@49
|
5234 const Mat<eT>&
|
Chris@49
|
5235 Mat<eT>::randn()
|
Chris@49
|
5236 {
|
Chris@49
|
5237 arma_extra_debug_sigprint();
|
Chris@49
|
5238
|
Chris@49
|
5239 eop_aux_randn<eT>::fill( memptr(), n_elem );
|
Chris@49
|
5240
|
Chris@49
|
5241 return *this;
|
Chris@49
|
5242 }
|
Chris@49
|
5243
|
Chris@49
|
5244
|
Chris@49
|
5245
|
Chris@49
|
5246 template<typename eT>
|
Chris@49
|
5247 inline
|
Chris@49
|
5248 const Mat<eT>&
|
Chris@49
|
5249 Mat<eT>::randn(const uword in_elem)
|
Chris@49
|
5250 {
|
Chris@49
|
5251 arma_extra_debug_sigprint();
|
Chris@49
|
5252
|
Chris@49
|
5253 set_size(in_elem);
|
Chris@49
|
5254
|
Chris@49
|
5255 return (*this).randn();
|
Chris@49
|
5256 }
|
Chris@49
|
5257
|
Chris@49
|
5258
|
Chris@49
|
5259
|
Chris@49
|
5260 template<typename eT>
|
Chris@49
|
5261 inline
|
Chris@49
|
5262 const Mat<eT>&
|
Chris@49
|
5263 Mat<eT>::randn(const uword in_rows, const uword in_cols)
|
Chris@49
|
5264 {
|
Chris@49
|
5265 arma_extra_debug_sigprint();
|
Chris@49
|
5266
|
Chris@49
|
5267 set_size(in_rows, in_cols);
|
Chris@49
|
5268
|
Chris@49
|
5269 return (*this).randn();
|
Chris@49
|
5270 }
|
Chris@49
|
5271
|
Chris@49
|
5272
|
Chris@49
|
5273
|
Chris@49
|
5274 template<typename eT>
|
Chris@49
|
5275 inline
|
Chris@49
|
5276 const Mat<eT>&
|
Chris@49
|
5277 Mat<eT>::eye()
|
Chris@49
|
5278 {
|
Chris@49
|
5279 arma_extra_debug_sigprint();
|
Chris@49
|
5280
|
Chris@49
|
5281 fill(eT(0));
|
Chris@49
|
5282
|
Chris@49
|
5283 const uword N = (std::min)(n_rows, n_cols);
|
Chris@49
|
5284
|
Chris@49
|
5285 for(uword ii=0; ii<N; ++ii)
|
Chris@49
|
5286 {
|
Chris@49
|
5287 at(ii,ii) = eT(1);
|
Chris@49
|
5288 }
|
Chris@49
|
5289
|
Chris@49
|
5290 return *this;
|
Chris@49
|
5291 }
|
Chris@49
|
5292
|
Chris@49
|
5293
|
Chris@49
|
5294
|
Chris@49
|
5295 template<typename eT>
|
Chris@49
|
5296 inline
|
Chris@49
|
5297 const Mat<eT>&
|
Chris@49
|
5298 Mat<eT>::eye(const uword in_rows, const uword in_cols)
|
Chris@49
|
5299 {
|
Chris@49
|
5300 arma_extra_debug_sigprint();
|
Chris@49
|
5301
|
Chris@49
|
5302 set_size(in_rows, in_cols);
|
Chris@49
|
5303
|
Chris@49
|
5304 return (*this).eye();
|
Chris@49
|
5305 }
|
Chris@49
|
5306
|
Chris@49
|
5307
|
Chris@49
|
5308
|
Chris@49
|
5309 template<typename eT>
|
Chris@49
|
5310 inline
|
Chris@49
|
5311 void
|
Chris@49
|
5312 Mat<eT>::reset()
|
Chris@49
|
5313 {
|
Chris@49
|
5314 arma_extra_debug_sigprint();
|
Chris@49
|
5315
|
Chris@49
|
5316 switch(vec_state)
|
Chris@49
|
5317 {
|
Chris@49
|
5318 default:
|
Chris@49
|
5319 init_warm(0, 0);
|
Chris@49
|
5320 break;
|
Chris@49
|
5321
|
Chris@49
|
5322 case 1:
|
Chris@49
|
5323 init_warm(0, 1);
|
Chris@49
|
5324 break;
|
Chris@49
|
5325
|
Chris@49
|
5326 case 2:
|
Chris@49
|
5327 init_warm(1, 0);
|
Chris@49
|
5328 break;
|
Chris@49
|
5329 }
|
Chris@49
|
5330 }
|
Chris@49
|
5331
|
Chris@49
|
5332
|
Chris@49
|
5333
|
Chris@49
|
5334 template<typename eT>
|
Chris@49
|
5335 template<typename T1>
|
Chris@49
|
5336 inline
|
Chris@49
|
5337 void
|
Chris@49
|
5338 Mat<eT>::set_real(const Base<typename Mat<eT>::pod_type,T1>& X)
|
Chris@49
|
5339 {
|
Chris@49
|
5340 arma_extra_debug_sigprint();
|
Chris@49
|
5341
|
Chris@49
|
5342 Mat_aux::set_real(*this, X);
|
Chris@49
|
5343 }
|
Chris@49
|
5344
|
Chris@49
|
5345
|
Chris@49
|
5346
|
Chris@49
|
5347 template<typename eT>
|
Chris@49
|
5348 template<typename T1>
|
Chris@49
|
5349 inline
|
Chris@49
|
5350 void
|
Chris@49
|
5351 Mat<eT>::set_imag(const Base<typename Mat<eT>::pod_type,T1>& X)
|
Chris@49
|
5352 {
|
Chris@49
|
5353 arma_extra_debug_sigprint();
|
Chris@49
|
5354
|
Chris@49
|
5355 Mat_aux::set_imag(*this, X);
|
Chris@49
|
5356 }
|
Chris@49
|
5357
|
Chris@49
|
5358
|
Chris@49
|
5359
|
Chris@49
|
5360 template<typename eT>
|
Chris@49
|
5361 inline
|
Chris@49
|
5362 arma_warn_unused
|
Chris@49
|
5363 eT
|
Chris@49
|
5364 Mat<eT>::min() const
|
Chris@49
|
5365 {
|
Chris@49
|
5366 arma_extra_debug_sigprint();
|
Chris@49
|
5367
|
Chris@49
|
5368 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
|
Chris@49
|
5369
|
Chris@49
|
5370 return op_min::direct_min(memptr(), n_elem);
|
Chris@49
|
5371 }
|
Chris@49
|
5372
|
Chris@49
|
5373
|
Chris@49
|
5374
|
Chris@49
|
5375 template<typename eT>
|
Chris@49
|
5376 inline
|
Chris@49
|
5377 arma_warn_unused
|
Chris@49
|
5378 eT
|
Chris@49
|
5379 Mat<eT>::max() const
|
Chris@49
|
5380 {
|
Chris@49
|
5381 arma_extra_debug_sigprint();
|
Chris@49
|
5382
|
Chris@49
|
5383 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
|
Chris@49
|
5384
|
Chris@49
|
5385 return op_max::direct_max(memptr(), n_elem);
|
Chris@49
|
5386 }
|
Chris@49
|
5387
|
Chris@49
|
5388
|
Chris@49
|
5389
|
Chris@49
|
5390 template<typename eT>
|
Chris@49
|
5391 inline
|
Chris@49
|
5392 eT
|
Chris@49
|
5393 Mat<eT>::min(uword& index_of_min_val) const
|
Chris@49
|
5394 {
|
Chris@49
|
5395 arma_extra_debug_sigprint();
|
Chris@49
|
5396
|
Chris@49
|
5397 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
|
Chris@49
|
5398
|
Chris@49
|
5399 return op_min::direct_min(memptr(), n_elem, index_of_min_val);
|
Chris@49
|
5400 }
|
Chris@49
|
5401
|
Chris@49
|
5402
|
Chris@49
|
5403
|
Chris@49
|
5404 template<typename eT>
|
Chris@49
|
5405 inline
|
Chris@49
|
5406 eT
|
Chris@49
|
5407 Mat<eT>::max(uword& index_of_max_val) const
|
Chris@49
|
5408 {
|
Chris@49
|
5409 arma_extra_debug_sigprint();
|
Chris@49
|
5410
|
Chris@49
|
5411 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
|
Chris@49
|
5412
|
Chris@49
|
5413 return op_max::direct_max(memptr(), n_elem, index_of_max_val);
|
Chris@49
|
5414 }
|
Chris@49
|
5415
|
Chris@49
|
5416
|
Chris@49
|
5417
|
Chris@49
|
5418 template<typename eT>
|
Chris@49
|
5419 inline
|
Chris@49
|
5420 eT
|
Chris@49
|
5421 Mat<eT>::min(uword& row_of_min_val, uword& col_of_min_val) const
|
Chris@49
|
5422 {
|
Chris@49
|
5423 arma_extra_debug_sigprint();
|
Chris@49
|
5424
|
Chris@49
|
5425 arma_debug_check( (n_elem == 0), "min(): object has no elements" );
|
Chris@49
|
5426
|
Chris@49
|
5427 uword iq;
|
Chris@49
|
5428
|
Chris@49
|
5429 eT val = op_min::direct_min(memptr(), n_elem, iq);
|
Chris@49
|
5430
|
Chris@49
|
5431 row_of_min_val = iq % n_rows;
|
Chris@49
|
5432 col_of_min_val = iq / n_rows;
|
Chris@49
|
5433
|
Chris@49
|
5434 return val;
|
Chris@49
|
5435 }
|
Chris@49
|
5436
|
Chris@49
|
5437
|
Chris@49
|
5438
|
Chris@49
|
5439 template<typename eT>
|
Chris@49
|
5440 inline
|
Chris@49
|
5441 eT
|
Chris@49
|
5442 Mat<eT>::max(uword& row_of_max_val, uword& col_of_max_val) const
|
Chris@49
|
5443 {
|
Chris@49
|
5444 arma_extra_debug_sigprint();
|
Chris@49
|
5445
|
Chris@49
|
5446 arma_debug_check( (n_elem == 0), "max(): object has no elements" );
|
Chris@49
|
5447
|
Chris@49
|
5448 uword iq;
|
Chris@49
|
5449
|
Chris@49
|
5450 eT val = op_max::direct_max(memptr(), n_elem, iq);
|
Chris@49
|
5451
|
Chris@49
|
5452 row_of_max_val = iq % n_rows;
|
Chris@49
|
5453 col_of_max_val = iq / n_rows;
|
Chris@49
|
5454
|
Chris@49
|
5455 return val;
|
Chris@49
|
5456 }
|
Chris@49
|
5457
|
Chris@49
|
5458
|
Chris@49
|
5459
|
Chris@49
|
5460 //! save the matrix to a file
|
Chris@49
|
5461 template<typename eT>
|
Chris@49
|
5462 inline
|
Chris@49
|
5463 bool
|
Chris@49
|
5464 Mat<eT>::save(const std::string name, const file_type type, const bool print_status) const
|
Chris@49
|
5465 {
|
Chris@49
|
5466 arma_extra_debug_sigprint();
|
Chris@49
|
5467
|
Chris@49
|
5468 bool save_okay;
|
Chris@49
|
5469
|
Chris@49
|
5470 switch(type)
|
Chris@49
|
5471 {
|
Chris@49
|
5472 case raw_ascii:
|
Chris@49
|
5473 save_okay = diskio::save_raw_ascii(*this, name);
|
Chris@49
|
5474 break;
|
Chris@49
|
5475
|
Chris@49
|
5476 case arma_ascii:
|
Chris@49
|
5477 save_okay = diskio::save_arma_ascii(*this, name);
|
Chris@49
|
5478 break;
|
Chris@49
|
5479
|
Chris@49
|
5480 case csv_ascii:
|
Chris@49
|
5481 save_okay = diskio::save_csv_ascii(*this, name);
|
Chris@49
|
5482 break;
|
Chris@49
|
5483
|
Chris@49
|
5484 case raw_binary:
|
Chris@49
|
5485 save_okay = diskio::save_raw_binary(*this, name);
|
Chris@49
|
5486 break;
|
Chris@49
|
5487
|
Chris@49
|
5488 case arma_binary:
|
Chris@49
|
5489 save_okay = diskio::save_arma_binary(*this, name);
|
Chris@49
|
5490 break;
|
Chris@49
|
5491
|
Chris@49
|
5492 case pgm_binary:
|
Chris@49
|
5493 save_okay = diskio::save_pgm_binary(*this, name);
|
Chris@49
|
5494 break;
|
Chris@49
|
5495
|
Chris@49
|
5496 case hdf5_binary:
|
Chris@49
|
5497 save_okay = diskio::save_hdf5_binary(*this, name);
|
Chris@49
|
5498 break;
|
Chris@49
|
5499
|
Chris@49
|
5500 default:
|
Chris@49
|
5501 arma_warn(print_status, "Mat::save(): unsupported file type");
|
Chris@49
|
5502 save_okay = false;
|
Chris@49
|
5503 }
|
Chris@49
|
5504
|
Chris@49
|
5505 arma_warn( (print_status && (save_okay == false)), "Mat::save(): couldn't write to ", name);
|
Chris@49
|
5506
|
Chris@49
|
5507 return save_okay;
|
Chris@49
|
5508 }
|
Chris@49
|
5509
|
Chris@49
|
5510
|
Chris@49
|
5511
|
Chris@49
|
5512 //! save the matrix to a stream
|
Chris@49
|
5513 template<typename eT>
|
Chris@49
|
5514 inline
|
Chris@49
|
5515 bool
|
Chris@49
|
5516 Mat<eT>::save(std::ostream& os, const file_type type, const bool print_status) const
|
Chris@49
|
5517 {
|
Chris@49
|
5518 arma_extra_debug_sigprint();
|
Chris@49
|
5519
|
Chris@49
|
5520 bool save_okay;
|
Chris@49
|
5521
|
Chris@49
|
5522 switch(type)
|
Chris@49
|
5523 {
|
Chris@49
|
5524 case raw_ascii:
|
Chris@49
|
5525 save_okay = diskio::save_raw_ascii(*this, os);
|
Chris@49
|
5526 break;
|
Chris@49
|
5527
|
Chris@49
|
5528 case arma_ascii:
|
Chris@49
|
5529 save_okay = diskio::save_arma_ascii(*this, os);
|
Chris@49
|
5530 break;
|
Chris@49
|
5531
|
Chris@49
|
5532 case csv_ascii:
|
Chris@49
|
5533 save_okay = diskio::save_csv_ascii(*this, os);
|
Chris@49
|
5534 break;
|
Chris@49
|
5535
|
Chris@49
|
5536 case raw_binary:
|
Chris@49
|
5537 save_okay = diskio::save_raw_binary(*this, os);
|
Chris@49
|
5538 break;
|
Chris@49
|
5539
|
Chris@49
|
5540 case arma_binary:
|
Chris@49
|
5541 save_okay = diskio::save_arma_binary(*this, os);
|
Chris@49
|
5542 break;
|
Chris@49
|
5543
|
Chris@49
|
5544 case pgm_binary:
|
Chris@49
|
5545 save_okay = diskio::save_pgm_binary(*this, os);
|
Chris@49
|
5546 break;
|
Chris@49
|
5547
|
Chris@49
|
5548 default:
|
Chris@49
|
5549 arma_warn(print_status, "Mat::save(): unsupported file type");
|
Chris@49
|
5550 save_okay = false;
|
Chris@49
|
5551 }
|
Chris@49
|
5552
|
Chris@49
|
5553 arma_warn( (print_status && (save_okay == false)), "Mat::save(): couldn't write to the given stream");
|
Chris@49
|
5554
|
Chris@49
|
5555 return save_okay;
|
Chris@49
|
5556 }
|
Chris@49
|
5557
|
Chris@49
|
5558
|
Chris@49
|
5559
|
Chris@49
|
5560 //! load a matrix from a file
|
Chris@49
|
5561 template<typename eT>
|
Chris@49
|
5562 inline
|
Chris@49
|
5563 bool
|
Chris@49
|
5564 Mat<eT>::load(const std::string name, const file_type type, const bool print_status)
|
Chris@49
|
5565 {
|
Chris@49
|
5566 arma_extra_debug_sigprint();
|
Chris@49
|
5567
|
Chris@49
|
5568 bool load_okay;
|
Chris@49
|
5569 std::string err_msg;
|
Chris@49
|
5570
|
Chris@49
|
5571 switch(type)
|
Chris@49
|
5572 {
|
Chris@49
|
5573 case auto_detect:
|
Chris@49
|
5574 load_okay = diskio::load_auto_detect(*this, name, err_msg);
|
Chris@49
|
5575 break;
|
Chris@49
|
5576
|
Chris@49
|
5577 case raw_ascii:
|
Chris@49
|
5578 load_okay = diskio::load_raw_ascii(*this, name, err_msg);
|
Chris@49
|
5579 break;
|
Chris@49
|
5580
|
Chris@49
|
5581 case arma_ascii:
|
Chris@49
|
5582 load_okay = diskio::load_arma_ascii(*this, name, err_msg);
|
Chris@49
|
5583 break;
|
Chris@49
|
5584
|
Chris@49
|
5585 case csv_ascii:
|
Chris@49
|
5586 load_okay = diskio::load_csv_ascii(*this, name, err_msg);
|
Chris@49
|
5587 break;
|
Chris@49
|
5588
|
Chris@49
|
5589 case raw_binary:
|
Chris@49
|
5590 load_okay = diskio::load_raw_binary(*this, name, err_msg);
|
Chris@49
|
5591 break;
|
Chris@49
|
5592
|
Chris@49
|
5593 case arma_binary:
|
Chris@49
|
5594 load_okay = diskio::load_arma_binary(*this, name, err_msg);
|
Chris@49
|
5595 break;
|
Chris@49
|
5596
|
Chris@49
|
5597 case pgm_binary:
|
Chris@49
|
5598 load_okay = diskio::load_pgm_binary(*this, name, err_msg);
|
Chris@49
|
5599 break;
|
Chris@49
|
5600
|
Chris@49
|
5601 case hdf5_binary:
|
Chris@49
|
5602 load_okay = diskio::load_hdf5_binary(*this, name, err_msg);
|
Chris@49
|
5603 break;
|
Chris@49
|
5604
|
Chris@49
|
5605 default:
|
Chris@49
|
5606 arma_warn(print_status, "Mat::load(): unsupported file type");
|
Chris@49
|
5607 load_okay = false;
|
Chris@49
|
5608 }
|
Chris@49
|
5609
|
Chris@49
|
5610 if( (print_status == true) && (load_okay == false) )
|
Chris@49
|
5611 {
|
Chris@49
|
5612 if(err_msg.length() > 0)
|
Chris@49
|
5613 {
|
Chris@49
|
5614 arma_warn(true, "Mat::load(): ", err_msg, name);
|
Chris@49
|
5615 }
|
Chris@49
|
5616 else
|
Chris@49
|
5617 {
|
Chris@49
|
5618 arma_warn(true, "Mat::load(): couldn't read ", name);
|
Chris@49
|
5619 }
|
Chris@49
|
5620 }
|
Chris@49
|
5621
|
Chris@49
|
5622 if(load_okay == false)
|
Chris@49
|
5623 {
|
Chris@49
|
5624 (*this).reset();
|
Chris@49
|
5625 }
|
Chris@49
|
5626
|
Chris@49
|
5627 return load_okay;
|
Chris@49
|
5628 }
|
Chris@49
|
5629
|
Chris@49
|
5630
|
Chris@49
|
5631
|
Chris@49
|
5632 //! load a matrix from a stream
|
Chris@49
|
5633 template<typename eT>
|
Chris@49
|
5634 inline
|
Chris@49
|
5635 bool
|
Chris@49
|
5636 Mat<eT>::load(std::istream& is, const file_type type, const bool print_status)
|
Chris@49
|
5637 {
|
Chris@49
|
5638 arma_extra_debug_sigprint();
|
Chris@49
|
5639
|
Chris@49
|
5640 bool load_okay;
|
Chris@49
|
5641 std::string err_msg;
|
Chris@49
|
5642
|
Chris@49
|
5643 switch(type)
|
Chris@49
|
5644 {
|
Chris@49
|
5645 case auto_detect:
|
Chris@49
|
5646 load_okay = diskio::load_auto_detect(*this, is, err_msg);
|
Chris@49
|
5647 break;
|
Chris@49
|
5648
|
Chris@49
|
5649 case raw_ascii:
|
Chris@49
|
5650 load_okay = diskio::load_raw_ascii(*this, is, err_msg);
|
Chris@49
|
5651 break;
|
Chris@49
|
5652
|
Chris@49
|
5653 case arma_ascii:
|
Chris@49
|
5654 load_okay = diskio::load_arma_ascii(*this, is, err_msg);
|
Chris@49
|
5655 break;
|
Chris@49
|
5656
|
Chris@49
|
5657 case csv_ascii:
|
Chris@49
|
5658 load_okay = diskio::load_csv_ascii(*this, is, err_msg);
|
Chris@49
|
5659 break;
|
Chris@49
|
5660
|
Chris@49
|
5661 case raw_binary:
|
Chris@49
|
5662 load_okay = diskio::load_raw_binary(*this, is, err_msg);
|
Chris@49
|
5663 break;
|
Chris@49
|
5664
|
Chris@49
|
5665 case arma_binary:
|
Chris@49
|
5666 load_okay = diskio::load_arma_binary(*this, is, err_msg);
|
Chris@49
|
5667 break;
|
Chris@49
|
5668
|
Chris@49
|
5669 case pgm_binary:
|
Chris@49
|
5670 load_okay = diskio::load_pgm_binary(*this, is, err_msg);
|
Chris@49
|
5671 break;
|
Chris@49
|
5672
|
Chris@49
|
5673 default:
|
Chris@49
|
5674 arma_warn(print_status, "Mat::load(): unsupported file type");
|
Chris@49
|
5675 load_okay = false;
|
Chris@49
|
5676 }
|
Chris@49
|
5677
|
Chris@49
|
5678
|
Chris@49
|
5679 if( (print_status == true) && (load_okay == false) )
|
Chris@49
|
5680 {
|
Chris@49
|
5681 if(err_msg.length() > 0)
|
Chris@49
|
5682 {
|
Chris@49
|
5683 arma_warn(true, "Mat::load(): ", err_msg, "the given stream");
|
Chris@49
|
5684 }
|
Chris@49
|
5685 else
|
Chris@49
|
5686 {
|
Chris@49
|
5687 arma_warn(true, "Mat::load(): couldn't load from the given stream");
|
Chris@49
|
5688 }
|
Chris@49
|
5689 }
|
Chris@49
|
5690
|
Chris@49
|
5691 if(load_okay == false)
|
Chris@49
|
5692 {
|
Chris@49
|
5693 (*this).reset();
|
Chris@49
|
5694 }
|
Chris@49
|
5695
|
Chris@49
|
5696 return load_okay;
|
Chris@49
|
5697 }
|
Chris@49
|
5698
|
Chris@49
|
5699
|
Chris@49
|
5700
|
Chris@49
|
5701 //! save the matrix to a file, without printing any error messages
|
Chris@49
|
5702 template<typename eT>
|
Chris@49
|
5703 inline
|
Chris@49
|
5704 bool
|
Chris@49
|
5705 Mat<eT>::quiet_save(const std::string name, const file_type type) const
|
Chris@49
|
5706 {
|
Chris@49
|
5707 arma_extra_debug_sigprint();
|
Chris@49
|
5708
|
Chris@49
|
5709 return (*this).save(name, type, false);
|
Chris@49
|
5710 }
|
Chris@49
|
5711
|
Chris@49
|
5712
|
Chris@49
|
5713
|
Chris@49
|
5714 //! save the matrix to a stream, without printing any error messages
|
Chris@49
|
5715 template<typename eT>
|
Chris@49
|
5716 inline
|
Chris@49
|
5717 bool
|
Chris@49
|
5718 Mat<eT>::quiet_save(std::ostream& os, const file_type type) const
|
Chris@49
|
5719 {
|
Chris@49
|
5720 arma_extra_debug_sigprint();
|
Chris@49
|
5721
|
Chris@49
|
5722 return (*this).save(os, type, false);
|
Chris@49
|
5723 }
|
Chris@49
|
5724
|
Chris@49
|
5725
|
Chris@49
|
5726
|
Chris@49
|
5727 //! load a matrix from a file, without printing any error messages
|
Chris@49
|
5728 template<typename eT>
|
Chris@49
|
5729 inline
|
Chris@49
|
5730 bool
|
Chris@49
|
5731 Mat<eT>::quiet_load(const std::string name, const file_type type)
|
Chris@49
|
5732 {
|
Chris@49
|
5733 arma_extra_debug_sigprint();
|
Chris@49
|
5734
|
Chris@49
|
5735 return (*this).load(name, type, false);
|
Chris@49
|
5736 }
|
Chris@49
|
5737
|
Chris@49
|
5738
|
Chris@49
|
5739
|
Chris@49
|
5740 //! load a matrix from a stream, without printing any error messages
|
Chris@49
|
5741 template<typename eT>
|
Chris@49
|
5742 inline
|
Chris@49
|
5743 bool
|
Chris@49
|
5744 Mat<eT>::quiet_load(std::istream& is, const file_type type)
|
Chris@49
|
5745 {
|
Chris@49
|
5746 arma_extra_debug_sigprint();
|
Chris@49
|
5747
|
Chris@49
|
5748 return (*this).load(is, type, false);
|
Chris@49
|
5749 }
|
Chris@49
|
5750
|
Chris@49
|
5751
|
Chris@49
|
5752
|
Chris@49
|
5753 template<typename eT>
|
Chris@49
|
5754 inline
|
Chris@49
|
5755 Mat<eT>::row_iterator::row_iterator(Mat<eT>& in_M, const uword in_row)
|
Chris@49
|
5756 : M (in_M )
|
Chris@49
|
5757 , row(in_row)
|
Chris@49
|
5758 , col(0 )
|
Chris@49
|
5759 {
|
Chris@49
|
5760 arma_extra_debug_sigprint();
|
Chris@49
|
5761 }
|
Chris@49
|
5762
|
Chris@49
|
5763
|
Chris@49
|
5764
|
Chris@49
|
5765 template<typename eT>
|
Chris@49
|
5766 inline
|
Chris@49
|
5767 eT&
|
Chris@49
|
5768 Mat<eT>::row_iterator::operator*()
|
Chris@49
|
5769 {
|
Chris@49
|
5770 return M.at(row,col);
|
Chris@49
|
5771 }
|
Chris@49
|
5772
|
Chris@49
|
5773
|
Chris@49
|
5774
|
Chris@49
|
5775 template<typename eT>
|
Chris@49
|
5776 inline
|
Chris@49
|
5777 typename Mat<eT>::row_iterator&
|
Chris@49
|
5778 Mat<eT>::row_iterator::operator++()
|
Chris@49
|
5779 {
|
Chris@49
|
5780 ++col;
|
Chris@49
|
5781
|
Chris@49
|
5782 if(col >= M.n_cols)
|
Chris@49
|
5783 {
|
Chris@49
|
5784 col = 0;
|
Chris@49
|
5785 ++row;
|
Chris@49
|
5786 }
|
Chris@49
|
5787
|
Chris@49
|
5788 return *this;
|
Chris@49
|
5789 }
|
Chris@49
|
5790
|
Chris@49
|
5791
|
Chris@49
|
5792
|
Chris@49
|
5793 template<typename eT>
|
Chris@49
|
5794 inline
|
Chris@49
|
5795 void
|
Chris@49
|
5796 Mat<eT>::row_iterator::operator++(int)
|
Chris@49
|
5797 {
|
Chris@49
|
5798 operator++();
|
Chris@49
|
5799 }
|
Chris@49
|
5800
|
Chris@49
|
5801
|
Chris@49
|
5802
|
Chris@49
|
5803 template<typename eT>
|
Chris@49
|
5804 inline
|
Chris@49
|
5805 typename Mat<eT>::row_iterator&
|
Chris@49
|
5806 Mat<eT>::row_iterator::operator--()
|
Chris@49
|
5807 {
|
Chris@49
|
5808 if(col > 0)
|
Chris@49
|
5809 {
|
Chris@49
|
5810 --col;
|
Chris@49
|
5811 }
|
Chris@49
|
5812 else
|
Chris@49
|
5813 {
|
Chris@49
|
5814 if(row > 0)
|
Chris@49
|
5815 {
|
Chris@49
|
5816 col = M.n_cols - 1;
|
Chris@49
|
5817 --row;
|
Chris@49
|
5818 }
|
Chris@49
|
5819 }
|
Chris@49
|
5820
|
Chris@49
|
5821 return *this;
|
Chris@49
|
5822 }
|
Chris@49
|
5823
|
Chris@49
|
5824
|
Chris@49
|
5825
|
Chris@49
|
5826 template<typename eT>
|
Chris@49
|
5827 inline
|
Chris@49
|
5828 void
|
Chris@49
|
5829 Mat<eT>::row_iterator::operator--(int)
|
Chris@49
|
5830 {
|
Chris@49
|
5831 operator--();
|
Chris@49
|
5832 }
|
Chris@49
|
5833
|
Chris@49
|
5834
|
Chris@49
|
5835
|
Chris@49
|
5836 template<typename eT>
|
Chris@49
|
5837 inline
|
Chris@49
|
5838 bool
|
Chris@49
|
5839 Mat<eT>::row_iterator::operator!=(const typename Mat<eT>::row_iterator& X) const
|
Chris@49
|
5840 {
|
Chris@49
|
5841 return ( (row != X.row) || (col != X.col) ) ? true : false;
|
Chris@49
|
5842 }
|
Chris@49
|
5843
|
Chris@49
|
5844
|
Chris@49
|
5845
|
Chris@49
|
5846 template<typename eT>
|
Chris@49
|
5847 inline
|
Chris@49
|
5848 bool
|
Chris@49
|
5849 Mat<eT>::row_iterator::operator==(const typename Mat<eT>::row_iterator& X) const
|
Chris@49
|
5850 {
|
Chris@49
|
5851 return ( (row == X.row) && (col == X.col) ) ? true : false;
|
Chris@49
|
5852 }
|
Chris@49
|
5853
|
Chris@49
|
5854
|
Chris@49
|
5855
|
Chris@49
|
5856 template<typename eT>
|
Chris@49
|
5857 inline
|
Chris@49
|
5858 Mat<eT>::const_row_iterator::const_row_iterator(const Mat<eT>& in_M, const uword in_row)
|
Chris@49
|
5859 : M (in_M )
|
Chris@49
|
5860 , row(in_row)
|
Chris@49
|
5861 , col(0 )
|
Chris@49
|
5862 {
|
Chris@49
|
5863 arma_extra_debug_sigprint();
|
Chris@49
|
5864 }
|
Chris@49
|
5865
|
Chris@49
|
5866
|
Chris@49
|
5867
|
Chris@49
|
5868 template<typename eT>
|
Chris@49
|
5869 inline
|
Chris@49
|
5870 Mat<eT>::const_row_iterator::const_row_iterator(const typename Mat<eT>::row_iterator& X)
|
Chris@49
|
5871 : M (X.M)
|
Chris@49
|
5872 , row(X.row)
|
Chris@49
|
5873 , col(X.col)
|
Chris@49
|
5874 {
|
Chris@49
|
5875 arma_extra_debug_sigprint();
|
Chris@49
|
5876 }
|
Chris@49
|
5877
|
Chris@49
|
5878
|
Chris@49
|
5879
|
Chris@49
|
5880 template<typename eT>
|
Chris@49
|
5881 inline
|
Chris@49
|
5882 eT
|
Chris@49
|
5883 Mat<eT>::const_row_iterator::operator*() const
|
Chris@49
|
5884 {
|
Chris@49
|
5885 return M.at(row,col);
|
Chris@49
|
5886 }
|
Chris@49
|
5887
|
Chris@49
|
5888
|
Chris@49
|
5889
|
Chris@49
|
5890 template<typename eT>
|
Chris@49
|
5891 inline
|
Chris@49
|
5892 typename Mat<eT>::const_row_iterator&
|
Chris@49
|
5893 Mat<eT>::const_row_iterator::operator++()
|
Chris@49
|
5894 {
|
Chris@49
|
5895 ++col;
|
Chris@49
|
5896
|
Chris@49
|
5897 if(col >= M.n_cols)
|
Chris@49
|
5898 {
|
Chris@49
|
5899 col = 0;
|
Chris@49
|
5900 ++row;
|
Chris@49
|
5901 }
|
Chris@49
|
5902
|
Chris@49
|
5903 return *this;
|
Chris@49
|
5904 }
|
Chris@49
|
5905
|
Chris@49
|
5906
|
Chris@49
|
5907
|
Chris@49
|
5908 template<typename eT>
|
Chris@49
|
5909 inline
|
Chris@49
|
5910 void
|
Chris@49
|
5911 Mat<eT>::const_row_iterator::operator++(int)
|
Chris@49
|
5912 {
|
Chris@49
|
5913 operator++();
|
Chris@49
|
5914 }
|
Chris@49
|
5915
|
Chris@49
|
5916
|
Chris@49
|
5917
|
Chris@49
|
5918 template<typename eT>
|
Chris@49
|
5919 inline
|
Chris@49
|
5920 typename Mat<eT>::const_row_iterator&
|
Chris@49
|
5921 Mat<eT>::const_row_iterator::operator--()
|
Chris@49
|
5922 {
|
Chris@49
|
5923 if(col > 0)
|
Chris@49
|
5924 {
|
Chris@49
|
5925 --col;
|
Chris@49
|
5926 }
|
Chris@49
|
5927 else
|
Chris@49
|
5928 {
|
Chris@49
|
5929 if(row > 0)
|
Chris@49
|
5930 {
|
Chris@49
|
5931 col = M.n_cols - 1;
|
Chris@49
|
5932 --row;
|
Chris@49
|
5933 }
|
Chris@49
|
5934 }
|
Chris@49
|
5935
|
Chris@49
|
5936 return *this;
|
Chris@49
|
5937 }
|
Chris@49
|
5938
|
Chris@49
|
5939
|
Chris@49
|
5940
|
Chris@49
|
5941 template<typename eT>
|
Chris@49
|
5942 inline
|
Chris@49
|
5943 void
|
Chris@49
|
5944 Mat<eT>::const_row_iterator::operator--(int)
|
Chris@49
|
5945 {
|
Chris@49
|
5946 operator--();
|
Chris@49
|
5947 }
|
Chris@49
|
5948
|
Chris@49
|
5949
|
Chris@49
|
5950
|
Chris@49
|
5951 template<typename eT>
|
Chris@49
|
5952 inline
|
Chris@49
|
5953 bool
|
Chris@49
|
5954 Mat<eT>::const_row_iterator::operator!=(const typename Mat<eT>::const_row_iterator& X) const
|
Chris@49
|
5955 {
|
Chris@49
|
5956 return ( (row != X.row) || (col != X.col) ) ? true : false;
|
Chris@49
|
5957 }
|
Chris@49
|
5958
|
Chris@49
|
5959
|
Chris@49
|
5960
|
Chris@49
|
5961 template<typename eT>
|
Chris@49
|
5962 inline
|
Chris@49
|
5963 bool
|
Chris@49
|
5964 Mat<eT>::const_row_iterator::operator==(const typename Mat<eT>::const_row_iterator& X) const
|
Chris@49
|
5965 {
|
Chris@49
|
5966 return ( (row == X.row) && (col == X.col) ) ? true : false;
|
Chris@49
|
5967 }
|
Chris@49
|
5968
|
Chris@49
|
5969
|
Chris@49
|
5970
|
Chris@49
|
5971 template<typename eT>
|
Chris@49
|
5972 inline
|
Chris@49
|
5973 typename Mat<eT>::iterator
|
Chris@49
|
5974 Mat<eT>::begin()
|
Chris@49
|
5975 {
|
Chris@49
|
5976 arma_extra_debug_sigprint();
|
Chris@49
|
5977
|
Chris@49
|
5978 return memptr();
|
Chris@49
|
5979 }
|
Chris@49
|
5980
|
Chris@49
|
5981
|
Chris@49
|
5982
|
Chris@49
|
5983 template<typename eT>
|
Chris@49
|
5984 inline
|
Chris@49
|
5985 typename Mat<eT>::const_iterator
|
Chris@49
|
5986 Mat<eT>::begin() const
|
Chris@49
|
5987 {
|
Chris@49
|
5988 arma_extra_debug_sigprint();
|
Chris@49
|
5989
|
Chris@49
|
5990 return memptr();
|
Chris@49
|
5991 }
|
Chris@49
|
5992
|
Chris@49
|
5993
|
Chris@49
|
5994
|
Chris@49
|
5995 template<typename eT>
|
Chris@49
|
5996 inline
|
Chris@49
|
5997 typename Mat<eT>::const_iterator
|
Chris@49
|
5998 Mat<eT>::cbegin() const
|
Chris@49
|
5999 {
|
Chris@49
|
6000 arma_extra_debug_sigprint();
|
Chris@49
|
6001
|
Chris@49
|
6002 return memptr();
|
Chris@49
|
6003 }
|
Chris@49
|
6004
|
Chris@49
|
6005
|
Chris@49
|
6006
|
Chris@49
|
6007 template<typename eT>
|
Chris@49
|
6008 inline
|
Chris@49
|
6009 typename Mat<eT>::iterator
|
Chris@49
|
6010 Mat<eT>::end()
|
Chris@49
|
6011 {
|
Chris@49
|
6012 arma_extra_debug_sigprint();
|
Chris@49
|
6013
|
Chris@49
|
6014 return memptr() + n_elem;
|
Chris@49
|
6015 }
|
Chris@49
|
6016
|
Chris@49
|
6017
|
Chris@49
|
6018
|
Chris@49
|
6019 template<typename eT>
|
Chris@49
|
6020 inline
|
Chris@49
|
6021 typename Mat<eT>::const_iterator
|
Chris@49
|
6022 Mat<eT>::end() const
|
Chris@49
|
6023 {
|
Chris@49
|
6024 arma_extra_debug_sigprint();
|
Chris@49
|
6025
|
Chris@49
|
6026 return memptr() + n_elem;
|
Chris@49
|
6027 }
|
Chris@49
|
6028
|
Chris@49
|
6029
|
Chris@49
|
6030
|
Chris@49
|
6031 template<typename eT>
|
Chris@49
|
6032 inline
|
Chris@49
|
6033 typename Mat<eT>::const_iterator
|
Chris@49
|
6034 Mat<eT>::cend() const
|
Chris@49
|
6035 {
|
Chris@49
|
6036 arma_extra_debug_sigprint();
|
Chris@49
|
6037
|
Chris@49
|
6038 return memptr() + n_elem;
|
Chris@49
|
6039 }
|
Chris@49
|
6040
|
Chris@49
|
6041
|
Chris@49
|
6042
|
Chris@49
|
6043 template<typename eT>
|
Chris@49
|
6044 inline
|
Chris@49
|
6045 typename Mat<eT>::col_iterator
|
Chris@49
|
6046 Mat<eT>::begin_col(const uword col_num)
|
Chris@49
|
6047 {
|
Chris@49
|
6048 arma_extra_debug_sigprint();
|
Chris@49
|
6049
|
Chris@49
|
6050 arma_debug_check( (col_num >= n_cols), "begin_col(): index out of bounds");
|
Chris@49
|
6051
|
Chris@49
|
6052 return colptr(col_num);
|
Chris@49
|
6053 }
|
Chris@49
|
6054
|
Chris@49
|
6055
|
Chris@49
|
6056
|
Chris@49
|
6057 template<typename eT>
|
Chris@49
|
6058 inline
|
Chris@49
|
6059 typename Mat<eT>::const_col_iterator
|
Chris@49
|
6060 Mat<eT>::begin_col(const uword col_num) const
|
Chris@49
|
6061 {
|
Chris@49
|
6062 arma_extra_debug_sigprint();
|
Chris@49
|
6063
|
Chris@49
|
6064 arma_debug_check( (col_num >= n_cols), "begin_col(): index out of bounds");
|
Chris@49
|
6065
|
Chris@49
|
6066 return colptr(col_num);
|
Chris@49
|
6067 }
|
Chris@49
|
6068
|
Chris@49
|
6069
|
Chris@49
|
6070
|
Chris@49
|
6071 template<typename eT>
|
Chris@49
|
6072 inline
|
Chris@49
|
6073 typename Mat<eT>::col_iterator
|
Chris@49
|
6074 Mat<eT>::end_col(const uword col_num)
|
Chris@49
|
6075 {
|
Chris@49
|
6076 arma_extra_debug_sigprint();
|
Chris@49
|
6077
|
Chris@49
|
6078 arma_debug_check( (col_num >= n_cols), "end_col(): index out of bounds");
|
Chris@49
|
6079
|
Chris@49
|
6080 return colptr(col_num) + n_rows;
|
Chris@49
|
6081 }
|
Chris@49
|
6082
|
Chris@49
|
6083
|
Chris@49
|
6084
|
Chris@49
|
6085 template<typename eT>
|
Chris@49
|
6086 inline
|
Chris@49
|
6087 typename Mat<eT>::const_col_iterator
|
Chris@49
|
6088 Mat<eT>::end_col(const uword col_num) const
|
Chris@49
|
6089 {
|
Chris@49
|
6090 arma_extra_debug_sigprint();
|
Chris@49
|
6091
|
Chris@49
|
6092 arma_debug_check( (col_num >= n_cols), "end_col(): index out of bounds");
|
Chris@49
|
6093
|
Chris@49
|
6094 return colptr(col_num) + n_rows;
|
Chris@49
|
6095 }
|
Chris@49
|
6096
|
Chris@49
|
6097
|
Chris@49
|
6098
|
Chris@49
|
6099 template<typename eT>
|
Chris@49
|
6100 inline
|
Chris@49
|
6101 typename Mat<eT>::row_iterator
|
Chris@49
|
6102 Mat<eT>::begin_row(const uword row_num)
|
Chris@49
|
6103 {
|
Chris@49
|
6104 arma_extra_debug_sigprint();
|
Chris@49
|
6105
|
Chris@49
|
6106 arma_debug_check( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" );
|
Chris@49
|
6107
|
Chris@49
|
6108 return typename Mat<eT>::row_iterator(*this, row_num);
|
Chris@49
|
6109 }
|
Chris@49
|
6110
|
Chris@49
|
6111
|
Chris@49
|
6112
|
Chris@49
|
6113 template<typename eT>
|
Chris@49
|
6114 inline
|
Chris@49
|
6115 typename Mat<eT>::const_row_iterator
|
Chris@49
|
6116 Mat<eT>::begin_row(const uword row_num) const
|
Chris@49
|
6117 {
|
Chris@49
|
6118 arma_extra_debug_sigprint();
|
Chris@49
|
6119
|
Chris@49
|
6120 arma_debug_check( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" );
|
Chris@49
|
6121
|
Chris@49
|
6122 return typename Mat<eT>::const_row_iterator(*this, row_num);
|
Chris@49
|
6123 }
|
Chris@49
|
6124
|
Chris@49
|
6125
|
Chris@49
|
6126
|
Chris@49
|
6127 template<typename eT>
|
Chris@49
|
6128 inline
|
Chris@49
|
6129 typename Mat<eT>::row_iterator
|
Chris@49
|
6130 Mat<eT>::end_row(const uword row_num)
|
Chris@49
|
6131 {
|
Chris@49
|
6132 arma_extra_debug_sigprint();
|
Chris@49
|
6133
|
Chris@49
|
6134 arma_debug_check( (row_num >= n_rows), "Mat::end_row(): index out of bounds" );
|
Chris@49
|
6135
|
Chris@49
|
6136 return typename Mat<eT>::row_iterator(*this, row_num + 1);
|
Chris@49
|
6137 }
|
Chris@49
|
6138
|
Chris@49
|
6139
|
Chris@49
|
6140
|
Chris@49
|
6141 template<typename eT>
|
Chris@49
|
6142 inline
|
Chris@49
|
6143 typename Mat<eT>::const_row_iterator
|
Chris@49
|
6144 Mat<eT>::end_row(const uword row_num) const
|
Chris@49
|
6145 {
|
Chris@49
|
6146 arma_extra_debug_sigprint();
|
Chris@49
|
6147
|
Chris@49
|
6148 arma_debug_check( (row_num >= n_rows), "Mat::end_row(): index out of bounds" );
|
Chris@49
|
6149
|
Chris@49
|
6150 return typename Mat<eT>::const_row_iterator(*this, row_num + 1);
|
Chris@49
|
6151 }
|
Chris@49
|
6152
|
Chris@49
|
6153
|
Chris@49
|
6154
|
Chris@49
|
6155 //! resets this matrix to an empty matrix
|
Chris@49
|
6156 template<typename eT>
|
Chris@49
|
6157 inline
|
Chris@49
|
6158 void
|
Chris@49
|
6159 Mat<eT>::clear()
|
Chris@49
|
6160 {
|
Chris@49
|
6161 reset();
|
Chris@49
|
6162 }
|
Chris@49
|
6163
|
Chris@49
|
6164
|
Chris@49
|
6165
|
Chris@49
|
6166 //! returns true if the matrix has no elements
|
Chris@49
|
6167 template<typename eT>
|
Chris@49
|
6168 inline
|
Chris@49
|
6169 bool
|
Chris@49
|
6170 Mat<eT>::empty() const
|
Chris@49
|
6171 {
|
Chris@49
|
6172 return (n_elem == 0);
|
Chris@49
|
6173 }
|
Chris@49
|
6174
|
Chris@49
|
6175
|
Chris@49
|
6176
|
Chris@49
|
6177 //! returns the number of elements in this matrix
|
Chris@49
|
6178 template<typename eT>
|
Chris@49
|
6179 inline
|
Chris@49
|
6180 uword
|
Chris@49
|
6181 Mat<eT>::size() const
|
Chris@49
|
6182 {
|
Chris@49
|
6183 return n_elem;
|
Chris@49
|
6184 }
|
Chris@49
|
6185
|
Chris@49
|
6186
|
Chris@49
|
6187
|
Chris@49
|
6188 template<typename eT>
|
Chris@49
|
6189 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6190 arma_inline
|
Chris@49
|
6191 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed()
|
Chris@49
|
6192 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6193 {
|
Chris@49
|
6194 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6195 }
|
Chris@49
|
6196
|
Chris@49
|
6197
|
Chris@49
|
6198
|
Chris@49
|
6199 template<typename eT>
|
Chris@49
|
6200 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6201 arma_inline
|
Chris@49
|
6202 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const fixed<fixed_n_rows, fixed_n_cols>& X)
|
Chris@49
|
6203 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6204 {
|
Chris@49
|
6205 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6206
|
Chris@49
|
6207 eT* dest = (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6208
|
Chris@49
|
6209 arrayops::copy( dest, X.mem, fixed_n_elem );
|
Chris@49
|
6210 }
|
Chris@49
|
6211
|
Chris@49
|
6212
|
Chris@49
|
6213
|
Chris@49
|
6214 template<typename eT>
|
Chris@49
|
6215 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6216 template<typename T1>
|
Chris@49
|
6217 inline
|
Chris@49
|
6218 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<eT,T1>& A)
|
Chris@49
|
6219 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6220 {
|
Chris@49
|
6221 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6222
|
Chris@49
|
6223 Mat<eT>::operator=(A.get_ref());
|
Chris@49
|
6224 }
|
Chris@49
|
6225
|
Chris@49
|
6226
|
Chris@49
|
6227
|
Chris@49
|
6228 template<typename eT>
|
Chris@49
|
6229 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6230 template<typename T1, typename T2>
|
Chris@49
|
6231 inline
|
Chris@49
|
6232 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)
|
Chris@49
|
6233 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6234 {
|
Chris@49
|
6235 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6236
|
Chris@49
|
6237 Mat<eT>::init(A,B);
|
Chris@49
|
6238 }
|
Chris@49
|
6239
|
Chris@49
|
6240
|
Chris@49
|
6241
|
Chris@49
|
6242 template<typename eT>
|
Chris@49
|
6243 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6244 inline
|
Chris@49
|
6245 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const eT* aux_mem)
|
Chris@49
|
6246 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6247 {
|
Chris@49
|
6248 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6249
|
Chris@49
|
6250 eT* dest = (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6251
|
Chris@49
|
6252 arrayops::copy( dest, aux_mem, fixed_n_elem );
|
Chris@49
|
6253 }
|
Chris@49
|
6254
|
Chris@49
|
6255
|
Chris@49
|
6256
|
Chris@49
|
6257 template<typename eT>
|
Chris@49
|
6258 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6259 inline
|
Chris@49
|
6260 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const char* text)
|
Chris@49
|
6261 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6262 {
|
Chris@49
|
6263 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6264
|
Chris@49
|
6265 Mat<eT>::operator=(text);
|
Chris@49
|
6266 }
|
Chris@49
|
6267
|
Chris@49
|
6268
|
Chris@49
|
6269
|
Chris@49
|
6270 template<typename eT>
|
Chris@49
|
6271 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6272 inline
|
Chris@49
|
6273 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::string& text)
|
Chris@49
|
6274 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6275 {
|
Chris@49
|
6276 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6277
|
Chris@49
|
6278 Mat<eT>::operator=(text);
|
Chris@49
|
6279 }
|
Chris@49
|
6280
|
Chris@49
|
6281
|
Chris@49
|
6282
|
Chris@49
|
6283 #if defined(ARMA_USE_CXX11)
|
Chris@49
|
6284
|
Chris@49
|
6285 template<typename eT>
|
Chris@49
|
6286 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6287 inline
|
Chris@49
|
6288 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::initializer_list<eT>& list)
|
Chris@49
|
6289 : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )
|
Chris@49
|
6290 {
|
Chris@49
|
6291 arma_extra_debug_sigprint_this(this);
|
Chris@49
|
6292
|
Chris@49
|
6293 (*this).operator=(list);
|
Chris@49
|
6294 }
|
Chris@49
|
6295
|
Chris@49
|
6296
|
Chris@49
|
6297
|
Chris@49
|
6298 template<typename eT>
|
Chris@49
|
6299 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6300 inline
|
Chris@49
|
6301 const Mat<eT>&
|
Chris@49
|
6302 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const std::initializer_list<eT>& list)
|
Chris@49
|
6303 {
|
Chris@49
|
6304 arma_extra_debug_sigprint();
|
Chris@49
|
6305
|
Chris@49
|
6306 const uword N = list.size();
|
Chris@49
|
6307
|
Chris@49
|
6308 arma_debug_check( (N > fixed_n_elem), "Mat::fixed: initialiser list is too long" );
|
Chris@49
|
6309
|
Chris@49
|
6310 eT* this_mem = (*this).memptr();
|
Chris@49
|
6311
|
Chris@49
|
6312 arrayops::copy( this_mem, list.begin(), N );
|
Chris@49
|
6313
|
Chris@49
|
6314 for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); }
|
Chris@49
|
6315
|
Chris@49
|
6316 return *this;
|
Chris@49
|
6317 }
|
Chris@49
|
6318
|
Chris@49
|
6319 #endif
|
Chris@49
|
6320
|
Chris@49
|
6321
|
Chris@49
|
6322
|
Chris@49
|
6323 template<typename eT>
|
Chris@49
|
6324 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6325 arma_inline
|
Chris@49
|
6326 const Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >
|
Chris@49
|
6327 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::t() const
|
Chris@49
|
6328 {
|
Chris@49
|
6329 return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >(*this);
|
Chris@49
|
6330 }
|
Chris@49
|
6331
|
Chris@49
|
6332
|
Chris@49
|
6333
|
Chris@49
|
6334 template<typename eT>
|
Chris@49
|
6335 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6336 arma_inline
|
Chris@49
|
6337 const Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >
|
Chris@49
|
6338 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ht() const
|
Chris@49
|
6339 {
|
Chris@49
|
6340 return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >(*this);
|
Chris@49
|
6341 }
|
Chris@49
|
6342
|
Chris@49
|
6343
|
Chris@49
|
6344
|
Chris@49
|
6345 template<typename eT>
|
Chris@49
|
6346 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6347 arma_inline
|
Chris@49
|
6348 const Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_strans >
|
Chris@49
|
6349 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::st() const
|
Chris@49
|
6350 {
|
Chris@49
|
6351 return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_strans >(*this);
|
Chris@49
|
6352 }
|
Chris@49
|
6353
|
Chris@49
|
6354
|
Chris@49
|
6355
|
Chris@49
|
6356 template<typename eT>
|
Chris@49
|
6357 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6358 arma_inline
|
Chris@49
|
6359 arma_warn_unused
|
Chris@49
|
6360 const eT&
|
Chris@49
|
6361 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at_alt(const uword ii) const
|
Chris@49
|
6362 {
|
Chris@49
|
6363 #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)
|
Chris@49
|
6364
|
Chris@49
|
6365 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6366
|
Chris@49
|
6367 #else
|
Chris@49
|
6368 const eT* mem_aligned = (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6369
|
Chris@49
|
6370 memory::mark_as_aligned(mem_aligned);
|
Chris@49
|
6371
|
Chris@49
|
6372 return mem_aligned[ii];
|
Chris@49
|
6373 #endif
|
Chris@49
|
6374 }
|
Chris@49
|
6375
|
Chris@49
|
6376
|
Chris@49
|
6377
|
Chris@49
|
6378 template<typename eT>
|
Chris@49
|
6379 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6380 arma_inline
|
Chris@49
|
6381 arma_warn_unused
|
Chris@49
|
6382 eT&
|
Chris@49
|
6383 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword ii)
|
Chris@49
|
6384 {
|
Chris@49
|
6385 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6386 }
|
Chris@49
|
6387
|
Chris@49
|
6388
|
Chris@49
|
6389
|
Chris@49
|
6390 template<typename eT>
|
Chris@49
|
6391 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6392 arma_inline
|
Chris@49
|
6393 arma_warn_unused
|
Chris@49
|
6394 const eT&
|
Chris@49
|
6395 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword ii) const
|
Chris@49
|
6396 {
|
Chris@49
|
6397 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6398 }
|
Chris@49
|
6399
|
Chris@49
|
6400
|
Chris@49
|
6401
|
Chris@49
|
6402 template<typename eT>
|
Chris@49
|
6403 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6404 arma_inline
|
Chris@49
|
6405 arma_warn_unused
|
Chris@49
|
6406 eT&
|
Chris@49
|
6407 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword ii)
|
Chris@49
|
6408 {
|
Chris@49
|
6409 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6410 }
|
Chris@49
|
6411
|
Chris@49
|
6412
|
Chris@49
|
6413
|
Chris@49
|
6414 template<typename eT>
|
Chris@49
|
6415 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6416 arma_inline
|
Chris@49
|
6417 arma_warn_unused
|
Chris@49
|
6418 const eT&
|
Chris@49
|
6419 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword ii) const
|
Chris@49
|
6420 {
|
Chris@49
|
6421 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6422 }
|
Chris@49
|
6423
|
Chris@49
|
6424
|
Chris@49
|
6425
|
Chris@49
|
6426 template<typename eT>
|
Chris@49
|
6427 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6428 arma_inline
|
Chris@49
|
6429 arma_warn_unused
|
Chris@49
|
6430 eT&
|
Chris@49
|
6431 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword ii)
|
Chris@49
|
6432 {
|
Chris@49
|
6433 arma_debug_check( (ii >= fixed_n_elem), "Mat::operator(): index out of bounds");
|
Chris@49
|
6434
|
Chris@49
|
6435 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6436 }
|
Chris@49
|
6437
|
Chris@49
|
6438
|
Chris@49
|
6439
|
Chris@49
|
6440 template<typename eT>
|
Chris@49
|
6441 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6442 arma_inline
|
Chris@49
|
6443 arma_warn_unused
|
Chris@49
|
6444 const eT&
|
Chris@49
|
6445 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword ii) const
|
Chris@49
|
6446 {
|
Chris@49
|
6447 arma_debug_check( (ii >= fixed_n_elem), "Mat::operator(): index out of bounds");
|
Chris@49
|
6448
|
Chris@49
|
6449 return (use_extra) ? mem_local_extra[ii] : mem_local[ii];
|
Chris@49
|
6450 }
|
Chris@49
|
6451
|
Chris@49
|
6452
|
Chris@49
|
6453
|
Chris@49
|
6454 template<typename eT>
|
Chris@49
|
6455 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6456 arma_inline
|
Chris@49
|
6457 arma_warn_unused
|
Chris@49
|
6458 eT&
|
Chris@49
|
6459 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col)
|
Chris@49
|
6460 {
|
Chris@49
|
6461 const uword iq = in_row + in_col*fixed_n_rows;
|
Chris@49
|
6462
|
Chris@49
|
6463 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
|
Chris@49
|
6464 }
|
Chris@49
|
6465
|
Chris@49
|
6466
|
Chris@49
|
6467
|
Chris@49
|
6468 template<typename eT>
|
Chris@49
|
6469 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6470 arma_inline
|
Chris@49
|
6471 arma_warn_unused
|
Chris@49
|
6472 const eT&
|
Chris@49
|
6473 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col) const
|
Chris@49
|
6474 {
|
Chris@49
|
6475 const uword iq = in_row + in_col*fixed_n_rows;
|
Chris@49
|
6476
|
Chris@49
|
6477 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
|
Chris@49
|
6478 }
|
Chris@49
|
6479
|
Chris@49
|
6480
|
Chris@49
|
6481
|
Chris@49
|
6482 template<typename eT>
|
Chris@49
|
6483 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6484 arma_inline
|
Chris@49
|
6485 arma_warn_unused
|
Chris@49
|
6486 eT&
|
Chris@49
|
6487 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col)
|
Chris@49
|
6488 {
|
Chris@49
|
6489 arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::operator(): index out of bounds");
|
Chris@49
|
6490
|
Chris@49
|
6491 const uword iq = in_row + in_col*fixed_n_rows;
|
Chris@49
|
6492
|
Chris@49
|
6493 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
|
Chris@49
|
6494 }
|
Chris@49
|
6495
|
Chris@49
|
6496
|
Chris@49
|
6497
|
Chris@49
|
6498 template<typename eT>
|
Chris@49
|
6499 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6500 arma_inline
|
Chris@49
|
6501 arma_warn_unused
|
Chris@49
|
6502 const eT&
|
Chris@49
|
6503 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col) const
|
Chris@49
|
6504 {
|
Chris@49
|
6505 arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::operator(): index out of bounds");
|
Chris@49
|
6506
|
Chris@49
|
6507 const uword iq = in_row + in_col*fixed_n_rows;
|
Chris@49
|
6508
|
Chris@49
|
6509 return (use_extra) ? mem_local_extra[iq] : mem_local[iq];
|
Chris@49
|
6510 }
|
Chris@49
|
6511
|
Chris@49
|
6512
|
Chris@49
|
6513
|
Chris@49
|
6514 template<typename eT>
|
Chris@49
|
6515 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6516 arma_inline
|
Chris@49
|
6517 arma_warn_unused
|
Chris@49
|
6518 eT*
|
Chris@49
|
6519 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::colptr(const uword in_col)
|
Chris@49
|
6520 {
|
Chris@49
|
6521 eT* mem_actual = (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6522
|
Chris@49
|
6523 return & access::rw(mem_actual[in_col*fixed_n_rows]);
|
Chris@49
|
6524 }
|
Chris@49
|
6525
|
Chris@49
|
6526
|
Chris@49
|
6527
|
Chris@49
|
6528 template<typename eT>
|
Chris@49
|
6529 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6530 arma_inline
|
Chris@49
|
6531 arma_warn_unused
|
Chris@49
|
6532 const eT*
|
Chris@49
|
6533 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::colptr(const uword in_col) const
|
Chris@49
|
6534 {
|
Chris@49
|
6535 const eT* mem_actual = (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6536
|
Chris@49
|
6537 return & mem_actual[in_col*fixed_n_rows];
|
Chris@49
|
6538 }
|
Chris@49
|
6539
|
Chris@49
|
6540
|
Chris@49
|
6541
|
Chris@49
|
6542 template<typename eT>
|
Chris@49
|
6543 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6544 arma_inline
|
Chris@49
|
6545 arma_warn_unused
|
Chris@49
|
6546 eT*
|
Chris@49
|
6547 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::memptr()
|
Chris@49
|
6548 {
|
Chris@49
|
6549 return (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6550 }
|
Chris@49
|
6551
|
Chris@49
|
6552
|
Chris@49
|
6553
|
Chris@49
|
6554 template<typename eT>
|
Chris@49
|
6555 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6556 arma_inline
|
Chris@49
|
6557 arma_warn_unused
|
Chris@49
|
6558 const eT*
|
Chris@49
|
6559 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::memptr() const
|
Chris@49
|
6560 {
|
Chris@49
|
6561 return (use_extra) ? mem_local_extra : mem_local;
|
Chris@49
|
6562 }
|
Chris@49
|
6563
|
Chris@49
|
6564
|
Chris@49
|
6565
|
Chris@49
|
6566 template<typename eT>
|
Chris@49
|
6567 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6568 arma_inline
|
Chris@49
|
6569 arma_warn_unused
|
Chris@49
|
6570 bool
|
Chris@49
|
6571 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::is_vec() const
|
Chris@49
|
6572 {
|
Chris@49
|
6573 return ( (fixed_n_rows == 1) || (fixed_n_cols == 1) );
|
Chris@49
|
6574 }
|
Chris@49
|
6575
|
Chris@49
|
6576
|
Chris@49
|
6577
|
Chris@49
|
6578 template<typename eT>
|
Chris@49
|
6579 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6580 arma_hot
|
Chris@49
|
6581 inline
|
Chris@49
|
6582 const Mat<eT>&
|
Chris@49
|
6583 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fill(const eT val)
|
Chris@49
|
6584 {
|
Chris@49
|
6585 arma_extra_debug_sigprint();
|
Chris@49
|
6586
|
Chris@49
|
6587 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);
|
Chris@49
|
6588
|
Chris@49
|
6589 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, val );
|
Chris@49
|
6590
|
Chris@49
|
6591 return *this;
|
Chris@49
|
6592 }
|
Chris@49
|
6593
|
Chris@49
|
6594
|
Chris@49
|
6595
|
Chris@49
|
6596 template<typename eT>
|
Chris@49
|
6597 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6598 arma_hot
|
Chris@49
|
6599 inline
|
Chris@49
|
6600 const Mat<eT>&
|
Chris@49
|
6601 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::zeros()
|
Chris@49
|
6602 {
|
Chris@49
|
6603 arma_extra_debug_sigprint();
|
Chris@49
|
6604
|
Chris@49
|
6605 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);
|
Chris@49
|
6606
|
Chris@49
|
6607 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(0) );
|
Chris@49
|
6608
|
Chris@49
|
6609 return *this;
|
Chris@49
|
6610 }
|
Chris@49
|
6611
|
Chris@49
|
6612
|
Chris@49
|
6613
|
Chris@49
|
6614 template<typename eT>
|
Chris@49
|
6615 template<uword fixed_n_rows, uword fixed_n_cols>
|
Chris@49
|
6616 arma_hot
|
Chris@49
|
6617 inline
|
Chris@49
|
6618 const Mat<eT>&
|
Chris@49
|
6619 Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ones()
|
Chris@49
|
6620 {
|
Chris@49
|
6621 arma_extra_debug_sigprint();
|
Chris@49
|
6622
|
Chris@49
|
6623 eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);
|
Chris@49
|
6624
|
Chris@49
|
6625 arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(1) );
|
Chris@49
|
6626
|
Chris@49
|
6627 return *this;
|
Chris@49
|
6628 }
|
Chris@49
|
6629
|
Chris@49
|
6630
|
Chris@49
|
6631
|
Chris@49
|
6632 //! prefix ++
|
Chris@49
|
6633 template<typename eT>
|
Chris@49
|
6634 arma_inline
|
Chris@49
|
6635 void
|
Chris@49
|
6636 Mat_aux::prefix_pp(Mat<eT>& x)
|
Chris@49
|
6637 {
|
Chris@49
|
6638 eT* memptr = x.memptr();
|
Chris@49
|
6639 const uword n_elem = x.n_elem;
|
Chris@49
|
6640
|
Chris@49
|
6641 uword i,j;
|
Chris@49
|
6642
|
Chris@49
|
6643 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
6644 {
|
Chris@49
|
6645 ++(memptr[i]);
|
Chris@49
|
6646 ++(memptr[j]);
|
Chris@49
|
6647 }
|
Chris@49
|
6648
|
Chris@49
|
6649 if(i < n_elem)
|
Chris@49
|
6650 {
|
Chris@49
|
6651 ++(memptr[i]);
|
Chris@49
|
6652 }
|
Chris@49
|
6653 }
|
Chris@49
|
6654
|
Chris@49
|
6655
|
Chris@49
|
6656
|
Chris@49
|
6657 //! prefix ++ for complex numbers (work around for limitations of the std::complex class)
|
Chris@49
|
6658 template<typename T>
|
Chris@49
|
6659 arma_inline
|
Chris@49
|
6660 void
|
Chris@49
|
6661 Mat_aux::prefix_pp(Mat< std::complex<T> >& x)
|
Chris@49
|
6662 {
|
Chris@49
|
6663 x += T(1);
|
Chris@49
|
6664 }
|
Chris@49
|
6665
|
Chris@49
|
6666
|
Chris@49
|
6667
|
Chris@49
|
6668 //! postfix ++
|
Chris@49
|
6669 template<typename eT>
|
Chris@49
|
6670 arma_inline
|
Chris@49
|
6671 void
|
Chris@49
|
6672 Mat_aux::postfix_pp(Mat<eT>& x)
|
Chris@49
|
6673 {
|
Chris@49
|
6674 eT* memptr = x.memptr();
|
Chris@49
|
6675 const uword n_elem = x.n_elem;
|
Chris@49
|
6676
|
Chris@49
|
6677 uword i,j;
|
Chris@49
|
6678
|
Chris@49
|
6679 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
6680 {
|
Chris@49
|
6681 (memptr[i])++;
|
Chris@49
|
6682 (memptr[j])++;
|
Chris@49
|
6683 }
|
Chris@49
|
6684
|
Chris@49
|
6685 if(i < n_elem)
|
Chris@49
|
6686 {
|
Chris@49
|
6687 (memptr[i])++;
|
Chris@49
|
6688 }
|
Chris@49
|
6689 }
|
Chris@49
|
6690
|
Chris@49
|
6691
|
Chris@49
|
6692
|
Chris@49
|
6693 //! postfix ++ for complex numbers (work around for limitations of the std::complex class)
|
Chris@49
|
6694 template<typename T>
|
Chris@49
|
6695 arma_inline
|
Chris@49
|
6696 void
|
Chris@49
|
6697 Mat_aux::postfix_pp(Mat< std::complex<T> >& x)
|
Chris@49
|
6698 {
|
Chris@49
|
6699 x += T(1);
|
Chris@49
|
6700 }
|
Chris@49
|
6701
|
Chris@49
|
6702
|
Chris@49
|
6703
|
Chris@49
|
6704 //! prefix --
|
Chris@49
|
6705 template<typename eT>
|
Chris@49
|
6706 arma_inline
|
Chris@49
|
6707 void
|
Chris@49
|
6708 Mat_aux::prefix_mm(Mat<eT>& x)
|
Chris@49
|
6709 {
|
Chris@49
|
6710 eT* memptr = x.memptr();
|
Chris@49
|
6711 const uword n_elem = x.n_elem;
|
Chris@49
|
6712
|
Chris@49
|
6713 uword i,j;
|
Chris@49
|
6714
|
Chris@49
|
6715 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
6716 {
|
Chris@49
|
6717 --(memptr[i]);
|
Chris@49
|
6718 --(memptr[j]);
|
Chris@49
|
6719 }
|
Chris@49
|
6720
|
Chris@49
|
6721 if(i < n_elem)
|
Chris@49
|
6722 {
|
Chris@49
|
6723 --(memptr[i]);
|
Chris@49
|
6724 }
|
Chris@49
|
6725 }
|
Chris@49
|
6726
|
Chris@49
|
6727
|
Chris@49
|
6728
|
Chris@49
|
6729 //! prefix -- for complex numbers (work around for limitations of the std::complex class)
|
Chris@49
|
6730 template<typename T>
|
Chris@49
|
6731 arma_inline
|
Chris@49
|
6732 void
|
Chris@49
|
6733 Mat_aux::prefix_mm(Mat< std::complex<T> >& x)
|
Chris@49
|
6734 {
|
Chris@49
|
6735 x -= T(1);
|
Chris@49
|
6736 }
|
Chris@49
|
6737
|
Chris@49
|
6738
|
Chris@49
|
6739
|
Chris@49
|
6740 //! postfix --
|
Chris@49
|
6741 template<typename eT>
|
Chris@49
|
6742 arma_inline
|
Chris@49
|
6743 void
|
Chris@49
|
6744 Mat_aux::postfix_mm(Mat<eT>& x)
|
Chris@49
|
6745 {
|
Chris@49
|
6746 eT* memptr = x.memptr();
|
Chris@49
|
6747 const uword n_elem = x.n_elem;
|
Chris@49
|
6748
|
Chris@49
|
6749 uword i,j;
|
Chris@49
|
6750
|
Chris@49
|
6751 for(i=0, j=1; j<n_elem; i+=2, j+=2)
|
Chris@49
|
6752 {
|
Chris@49
|
6753 (memptr[i])--;
|
Chris@49
|
6754 (memptr[j])--;
|
Chris@49
|
6755 }
|
Chris@49
|
6756
|
Chris@49
|
6757 if(i < n_elem)
|
Chris@49
|
6758 {
|
Chris@49
|
6759 (memptr[i])--;
|
Chris@49
|
6760 }
|
Chris@49
|
6761 }
|
Chris@49
|
6762
|
Chris@49
|
6763
|
Chris@49
|
6764
|
Chris@49
|
6765 //! postfix ++ for complex numbers (work around for limitations of the std::complex class)
|
Chris@49
|
6766 template<typename T>
|
Chris@49
|
6767 arma_inline
|
Chris@49
|
6768 void
|
Chris@49
|
6769 Mat_aux::postfix_mm(Mat< std::complex<T> >& x)
|
Chris@49
|
6770 {
|
Chris@49
|
6771 x -= T(1);
|
Chris@49
|
6772 }
|
Chris@49
|
6773
|
Chris@49
|
6774
|
Chris@49
|
6775
|
Chris@49
|
6776 template<typename eT, typename T1>
|
Chris@49
|
6777 inline
|
Chris@49
|
6778 void
|
Chris@49
|
6779 Mat_aux::set_real(Mat<eT>& out, const Base<eT,T1>& X)
|
Chris@49
|
6780 {
|
Chris@49
|
6781 arma_extra_debug_sigprint();
|
Chris@49
|
6782
|
Chris@49
|
6783 const unwrap<T1> tmp(X.get_ref());
|
Chris@49
|
6784 const Mat<eT>& A = tmp.M;
|
Chris@49
|
6785
|
Chris@49
|
6786 arma_debug_assert_same_size( out, A, "Mat::set_real()" );
|
Chris@49
|
6787
|
Chris@49
|
6788 out = A;
|
Chris@49
|
6789 }
|
Chris@49
|
6790
|
Chris@49
|
6791
|
Chris@49
|
6792
|
Chris@49
|
6793 template<typename eT, typename T1>
|
Chris@49
|
6794 inline
|
Chris@49
|
6795 void
|
Chris@49
|
6796 Mat_aux::set_imag(Mat<eT>&, const Base<eT,T1>&)
|
Chris@49
|
6797 {
|
Chris@49
|
6798 arma_extra_debug_sigprint();
|
Chris@49
|
6799 }
|
Chris@49
|
6800
|
Chris@49
|
6801
|
Chris@49
|
6802
|
Chris@49
|
6803 template<typename T, typename T1>
|
Chris@49
|
6804 inline
|
Chris@49
|
6805 void
|
Chris@49
|
6806 Mat_aux::set_real(Mat< std::complex<T> >& out, const Base<T,T1>& X)
|
Chris@49
|
6807 {
|
Chris@49
|
6808 arma_extra_debug_sigprint();
|
Chris@49
|
6809
|
Chris@49
|
6810 typedef typename std::complex<T> eT;
|
Chris@49
|
6811
|
Chris@49
|
6812 const Proxy<T1> P(X.get_ref());
|
Chris@49
|
6813
|
Chris@49
|
6814 const uword local_n_rows = P.get_n_rows();
|
Chris@49
|
6815 const uword local_n_cols = P.get_n_cols();
|
Chris@49
|
6816
|
Chris@49
|
6817 arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, "Mat::set_real()" );
|
Chris@49
|
6818
|
Chris@49
|
6819 eT* out_mem = out.memptr();
|
Chris@49
|
6820
|
Chris@49
|
6821 if(Proxy<T1>::prefer_at_accessor == false)
|
Chris@49
|
6822 {
|
Chris@49
|
6823 typedef typename Proxy<T1>::ea_type ea_type;
|
Chris@49
|
6824
|
Chris@49
|
6825 ea_type A = P.get_ea();
|
Chris@49
|
6826
|
Chris@49
|
6827 const uword N = out.n_elem;
|
Chris@49
|
6828
|
Chris@49
|
6829 for(uword i=0; i<N; ++i)
|
Chris@49
|
6830 {
|
Chris@49
|
6831 out_mem[i] = std::complex<T>( A[i], out_mem[i].imag() );
|
Chris@49
|
6832 }
|
Chris@49
|
6833 }
|
Chris@49
|
6834 else
|
Chris@49
|
6835 {
|
Chris@49
|
6836 for(uword col=0; col < local_n_cols; ++col)
|
Chris@49
|
6837 for(uword row=0; row < local_n_rows; ++row)
|
Chris@49
|
6838 {
|
Chris@49
|
6839 (*out_mem) = std::complex<T>( P.at(row,col), (*out_mem).imag() );
|
Chris@49
|
6840 out_mem++;
|
Chris@49
|
6841 }
|
Chris@49
|
6842 }
|
Chris@49
|
6843 }
|
Chris@49
|
6844
|
Chris@49
|
6845
|
Chris@49
|
6846
|
Chris@49
|
6847 template<typename T, typename T1>
|
Chris@49
|
6848 inline
|
Chris@49
|
6849 void
|
Chris@49
|
6850 Mat_aux::set_imag(Mat< std::complex<T> >& out, const Base<T,T1>& X)
|
Chris@49
|
6851 {
|
Chris@49
|
6852 arma_extra_debug_sigprint();
|
Chris@49
|
6853
|
Chris@49
|
6854 typedef typename std::complex<T> eT;
|
Chris@49
|
6855
|
Chris@49
|
6856 const Proxy<T1> P(X.get_ref());
|
Chris@49
|
6857
|
Chris@49
|
6858 const uword local_n_rows = P.get_n_rows();
|
Chris@49
|
6859 const uword local_n_cols = P.get_n_cols();
|
Chris@49
|
6860
|
Chris@49
|
6861 arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, "Mat::set_imag()" );
|
Chris@49
|
6862
|
Chris@49
|
6863 eT* out_mem = out.memptr();
|
Chris@49
|
6864
|
Chris@49
|
6865 if(Proxy<T1>::prefer_at_accessor == false)
|
Chris@49
|
6866 {
|
Chris@49
|
6867 typedef typename Proxy<T1>::ea_type ea_type;
|
Chris@49
|
6868
|
Chris@49
|
6869 ea_type A = P.get_ea();
|
Chris@49
|
6870
|
Chris@49
|
6871 const uword N = out.n_elem;
|
Chris@49
|
6872
|
Chris@49
|
6873 for(uword i=0; i<N; ++i)
|
Chris@49
|
6874 {
|
Chris@49
|
6875 out_mem[i] = std::complex<T>( out_mem[i].real(), A[i] );
|
Chris@49
|
6876 }
|
Chris@49
|
6877 }
|
Chris@49
|
6878 else
|
Chris@49
|
6879 {
|
Chris@49
|
6880 for(uword col=0; col < local_n_cols; ++col)
|
Chris@49
|
6881 for(uword row=0; row < local_n_rows; ++row)
|
Chris@49
|
6882 {
|
Chris@49
|
6883 (*out_mem) = std::complex<T>( (*out_mem).real(), P.at(row,col) );
|
Chris@49
|
6884 out_mem++;
|
Chris@49
|
6885 }
|
Chris@49
|
6886 }
|
Chris@49
|
6887 }
|
Chris@49
|
6888
|
Chris@49
|
6889
|
Chris@49
|
6890
|
Chris@49
|
6891 #ifdef ARMA_EXTRA_MAT_MEAT
|
Chris@49
|
6892 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_MEAT)
|
Chris@49
|
6893 #endif
|
Chris@49
|
6894
|
Chris@49
|
6895
|
Chris@49
|
6896
|
Chris@49
|
6897 //! @}
|