eop_core_meat.hpp
Go to the documentation of this file.
1 // Copyright (C) 2010-2011 NICTA (www.nicta.com.au)
2 // Copyright (C) 2010-2011 Conrad Sanderson
3 //
4 // This file is part of the Armadillo C++ library.
5 // It is provided without any warranty of fitness
6 // for any purpose. You can redistribute this file
7 // and/or modify it under the terms of the GNU
8 // Lesser General Public License (LGPL) as published
9 // by the Free Software Foundation, either version 3
10 // of the License or (at your option) any later version.
11 // (see http://www.opensource.org/licenses for more info)
12 
13 
16 
17 
18 #undef arma_applier_1
19 #undef arma_applier_2
20 #undef arma_applier_3
21 #undef operatorA
22 
23 #define arma_applier_1(operatorA) \
24  {\
25  uword i,j;\
26  \
27  for(i=0, j=1; j<n_elem; i+=2, j+=2)\
28  {\
29  eT tmp_i = P[i];\
30  eT tmp_j = P[j];\
31  \
32  tmp_i = eop_core<eop_type>::process(tmp_i, k);\
33  tmp_j = eop_core<eop_type>::process(tmp_j, k);\
34  \
35  out_mem[i] operatorA tmp_i;\
36  out_mem[j] operatorA tmp_j;\
37  }\
38  \
39  if(i < n_elem)\
40  {\
41  out_mem[i] operatorA eop_core<eop_type>::process(P[i], k);\
42  }\
43  }
44 
45 
46 #define arma_applier_2(operatorA) \
47  {\
48  uword count = 0;\
49  \
50  for(uword col=0; col<n_cols; ++col)\
51  {\
52  uword i,j;\
53  \
54  for(i=0, j=1; j<n_rows; i+=2, j+=2, count+=2)\
55  {\
56  eT tmp_i = P.at(i,col);\
57  eT tmp_j = P.at(j,col);\
58  \
59  tmp_i = eop_core<eop_type>::process(tmp_i, k);\
60  tmp_j = eop_core<eop_type>::process(tmp_j, k);\
61  \
62  out_mem[count ] operatorA tmp_i;\
63  out_mem[count+1] operatorA tmp_j;\
64  }\
65  \
66  if(i < n_rows)\
67  {\
68  out_mem[count] operatorA eop_core<eop_type>::process(P.at(i,col), k);\
69  ++count;\
70  }\
71  }\
72  }
73 
74 
75 
76 #define arma_applier_3(operatorA) \
77  {\
78  uword count = 0;\
79  \
80  for(uword slice=0; slice<n_slices; ++slice)\
81  {\
82  for(uword col=0; col<n_cols; ++col)\
83  {\
84  uword i,j;\
85  \
86  for(i=0, j=1; j<n_rows; i+=2, j+=2, count+=2)\
87  {\
88  eT tmp_i = P.at(i,col,slice);\
89  eT tmp_j = P.at(j,col,slice);\
90  \
91  tmp_i = eop_core<eop_type>::process(tmp_i, k);\
92  tmp_j = eop_core<eop_type>::process(tmp_j, k);\
93  \
94  out_mem[count ] operatorA tmp_i;\
95  out_mem[count+1] operatorA tmp_j;\
96  }\
97  \
98  if(i < n_rows)\
99  {\
100  out_mem[count] operatorA eop_core<eop_type>::process(P.at(i,col,slice), k);\
101  ++count;\
102  }\
103  }\
104  }\
105  }
106 
107 
108 
109 //
110 // matrices
111 
112 
113 
114 template<typename eop_type>
115 template<typename T1>
116 arma_hot
117 inline
118 void
120  {
122 
123  typedef typename T1::elem_type eT;
124 
125  const uword n_rows = out.n_rows;
126  const uword n_cols = out.n_cols;
127  const uword n_elem = out.n_elem;
128 
129  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;
130  // size setting and alias checking is done by either the Mat contructor or operator=()
131 
132  const eT k = x.aux;
133  eT* out_mem = out.memptr();
134 
135  if(Proxy<T1>::prefer_at_accessor == false)
136  {
137  typename Proxy<T1>::ea_type P = x.P.get_ea();
138 
139  arma_applier_1(=);
140  }
141  else
142  {
143  const Proxy<T1>& P = x.P;
144 
145  arma_applier_2(=);
146  }
147  }
148 
149 
150 
151 template<typename eop_type>
152 template<typename T1>
153 arma_hot
154 inline
155 void
157  {
159 
160  typedef typename T1::elem_type eT;
161 
162  const uword n_rows = x.get_n_rows();
163  const uword n_cols = x.get_n_cols();
164 
165  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "addition");
166 
167  eT* out_mem = out.memptr();
168  const uword n_elem = out.n_elem;
169 
170  const eT k = x.aux;
171 
172  if(Proxy<T1>::prefer_at_accessor == false)
173  {
174  typename Proxy<T1>::ea_type P = x.P.get_ea();
175 
176  arma_applier_1(+=);
177  }
178  else
179  {
180  const Proxy<T1>& P = x.P;
181 
182  arma_applier_2(+=);
183  }
184  }
185 
186 
187 
188 template<typename eop_type>
189 template<typename T1>
190 arma_hot
191 inline
192 void
194  {
196 
197  typedef typename T1::elem_type eT;
198 
199  const uword n_rows = x.get_n_rows();
200  const uword n_cols = x.get_n_cols();
201 
202  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "subtraction");
203 
204  eT* out_mem = out.memptr();
205  const uword n_elem = out.n_elem;
206 
207  const eT k = x.aux;
208 
209  if(Proxy<T1>::prefer_at_accessor == false)
210  {
211  typename Proxy<T1>::ea_type P = x.P.get_ea();
212 
213  arma_applier_1(-=);
214  }
215  else
216  {
217  const Proxy<T1>& P = x.P;
218 
219  arma_applier_2(-=);
220  }
221  }
222 
223 
224 
225 template<typename eop_type>
226 template<typename T1>
227 arma_hot
228 inline
229 void
231  {
233 
234  typedef typename T1::elem_type eT;
235 
236  const uword n_rows = x.get_n_rows();
237  const uword n_cols = x.get_n_cols();
238 
239  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise multiplication");
240 
241  eT* out_mem = out.memptr();
242  const uword n_elem = out.n_elem;
243 
244  const eT k = x.aux;
245 
246  if(Proxy<T1>::prefer_at_accessor == false)
247  {
248  typename Proxy<T1>::ea_type P = x.P.get_ea();
249 
250  arma_applier_1(*=);
251  }
252  else
253  {
254  const Proxy<T1>& P = x.P;
255 
256  arma_applier_2(*=);
257  }
258  }
259 
260 
261 
262 template<typename eop_type>
263 template<typename T1>
264 arma_hot
265 inline
266 void
268  {
270 
271  typedef typename T1::elem_type eT;
272 
273  const uword n_rows = x.get_n_rows();
274  const uword n_cols = x.get_n_cols();
275 
276  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise division");
277 
278  eT* out_mem = out.memptr();
279  const uword n_elem = out.n_elem;
280 
281  const eT k = x.aux;
282 
283  if(Proxy<T1>::prefer_at_accessor == false)
284  {
285  typename Proxy<T1>::ea_type P = x.P.get_ea();
286 
287  arma_applier_1(/=);
288  }
289  else
290  {
291  const Proxy<T1>& P = x.P;
292 
293  arma_applier_2(/=);
294  }
295  }
296 
297 
298 
299 //
300 // cubes
301 
302 
303 
304 template<typename eop_type>
305 template<typename T1>
306 arma_hot
307 inline
308 void
310  {
312 
313  typedef typename T1::elem_type eT;
314 
315  const uword n_rows = out.n_rows;
316  const uword n_cols = out.n_cols;
317  const uword n_slices = out.n_slices;
318  const uword n_elem = out.n_elem;
319 
320  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;
321  // size setting and alias checking is done by either the Mat contructor or operator=()
322 
323  const eT k = x.aux;
324  eT* out_mem = out.memptr();
325 
327  {
328  typename ProxyCube<T1>::ea_type P = x.P.get_ea();
329 
330  arma_applier_1(=);
331  }
332  else
333  {
334  const ProxyCube<T1>& P = x.P;
335 
336  arma_applier_3(=);
337  }
338  }
339 
340 
341 
342 template<typename eop_type>
343 template<typename T1>
344 arma_hot
345 inline
346 void
348  {
350 
351  typedef typename T1::elem_type eT;
352 
353  const uword n_rows = x.get_n_rows();
354  const uword n_cols = x.get_n_cols();
355  const uword n_slices = x.get_n_slices();
356 
357  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition");
358 
359  eT* out_mem = out.memptr();
360  const uword n_elem = out.n_elem;
361 
362  const eT k = x.aux;
363 
365  {
366  typename ProxyCube<T1>::ea_type P = x.P.get_ea();
367 
368  arma_applier_1(+=);
369  }
370  else
371  {
372  const ProxyCube<T1>& P = x.P;
373 
374  arma_applier_3(+=);
375  }
376  }
377 
378 
379 
380 template<typename eop_type>
381 template<typename T1>
382 arma_hot
383 inline
384 void
386  {
388 
389  typedef typename T1::elem_type eT;
390 
391  const uword n_rows = x.get_n_rows();
392  const uword n_cols = x.get_n_cols();
393  const uword n_slices = x.get_n_slices();
394 
395  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction");
396 
397  eT* out_mem = out.memptr();
398  const uword n_elem = out.n_elem;
399 
400  const eT k = x.aux;
401 
403  {
404  typename ProxyCube<T1>::ea_type P = x.P.get_ea();
405 
406  arma_applier_1(-=);
407  }
408  else
409  {
410  const ProxyCube<T1>& P = x.P;
411 
412  arma_applier_3(-=);
413  }
414  }
415 
416 
417 
418 template<typename eop_type>
419 template<typename T1>
420 arma_hot
421 inline
422 void
424  {
426 
427  typedef typename T1::elem_type eT;
428 
429  const uword n_rows = x.get_n_rows();
430  const uword n_cols = x.get_n_cols();
431  const uword n_slices = x.get_n_slices();
432 
433  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication");
434 
435  eT* out_mem = out.memptr();
436  const uword n_elem = out.n_elem;
437 
438  const eT k = x.aux;
439 
441  {
442  typename ProxyCube<T1>::ea_type P = x.P.get_ea();
443 
444  arma_applier_1(*=);
445  }
446  else
447  {
448  const ProxyCube<T1>& P = x.P;
449 
450  arma_applier_3(*=);
451  }
452  }
453 
454 
455 
456 template<typename eop_type>
457 template<typename T1>
458 arma_hot
459 inline
460 void
462  {
464 
465  typedef typename T1::elem_type eT;
466 
467  const uword n_rows = x.get_n_rows();
468  const uword n_cols = x.get_n_cols();
469  const uword n_slices = x.get_n_slices();
470 
471  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division");
472 
473  eT* out_mem = out.memptr();
474  const uword n_elem = out.n_elem;
475 
476  const eT k = x.aux;
477 
479  {
480  typename ProxyCube<T1>::ea_type P = x.P.get_ea();
481 
482  arma_applier_1(/=);
483  }
484  else
485  {
486  const ProxyCube<T1>& P = x.P;
487 
488  arma_applier_3(/=);
489  }
490  }
491 
492 
493 
494 //
495 // common
496 
497 
498 
499 template<typename eop_type>
500 template<typename eT>
501 arma_hot
502 arma_pure
504 eT
505 eop_core<eop_type>::process(const eT val, const eT k)
506  {
507  arma_ignore(val);
508  arma_ignore(k);
509 
510  arma_stop("eop_core::process(): unhandled eop_type");
511  return eT(0);
512  }
513 
514 
515 
516 template<> template<typename eT> arma_hot arma_const arma_inline eT
517 eop_core<eop_scalar_plus >::process(const eT val, const eT k) { return val + k; }
518 
519 template<> template<typename eT> arma_hot arma_const arma_inline eT
520 eop_core<eop_scalar_minus_pre >::process(const eT val, const eT k) { return k - val; }
521 
522 template<> template<typename eT> arma_hot arma_const arma_inline eT
523 eop_core<eop_scalar_minus_post>::process(const eT val, const eT k) { return val - k; }
524 
525 template<> template<typename eT> arma_hot arma_const arma_inline eT
526 eop_core<eop_scalar_times >::process(const eT val, const eT k) { return val * k; }
527 
528 template<> template<typename eT> arma_hot arma_const arma_inline eT
529 eop_core<eop_scalar_div_pre >::process(const eT val, const eT k) { return k / val; }
530 
531 template<> template<typename eT> arma_hot arma_const arma_inline eT
532 eop_core<eop_scalar_div_post >::process(const eT val, const eT k) { return val / k; }
533 
534 template<> template<typename eT> arma_hot arma_const arma_inline eT
535 eop_core<eop_square >::process(const eT val, const eT ) { return val*val; }
536 
537 template<> template<typename eT> arma_hot arma_const arma_inline eT
538 eop_core<eop_neg >::process(const eT val, const eT ) { return eop_aux::neg(val); }
539 
540 template<> template<typename eT> arma_hot arma_pure arma_inline eT
541 eop_core<eop_sqrt >::process(const eT val, const eT ) { return eop_aux::sqrt(val); }
542 
543 template<> template<typename eT> arma_hot arma_pure arma_inline eT
544 eop_core<eop_log >::process(const eT val, const eT ) { return eop_aux::log(val); }
545 
546 template<> template<typename eT> arma_hot arma_pure arma_inline eT
547 eop_core<eop_log2 >::process(const eT val, const eT ) { return eop_aux::log2(val); }
548 
549 template<> template<typename eT> arma_hot arma_pure arma_inline eT
550 eop_core<eop_log10 >::process(const eT val, const eT ) { return eop_aux::log10(val); }
551 
552 template<> template<typename eT> arma_hot arma_pure arma_inline eT
553 eop_core<eop_trunc_log >::process(const eT val, const eT ) { return arma::trunc_log(val); }
554 
555 template<> template<typename eT> arma_hot arma_pure arma_inline eT
556 eop_core<eop_exp >::process(const eT val, const eT ) { return eop_aux::exp(val); }
557 
558 template<> template<typename eT> arma_hot arma_pure arma_inline eT
559 eop_core<eop_exp2 >::process(const eT val, const eT ) { return eop_aux::exp2(val); }
560 
561 template<> template<typename eT> arma_hot arma_pure arma_inline eT
562 eop_core<eop_exp10 >::process(const eT val, const eT ) { return eop_aux::exp10(val); }
563 
564 template<> template<typename eT> arma_hot arma_pure arma_inline eT
565 eop_core<eop_trunc_exp >::process(const eT val, const eT ) { return arma::trunc_exp(val); }
566 
567 template<> template<typename eT> arma_hot arma_pure arma_inline eT
568 eop_core<eop_cos >::process(const eT val, const eT ) { return eop_aux::cos(val); }
569 
570 template<> template<typename eT> arma_hot arma_pure arma_inline eT
571 eop_core<eop_sin >::process(const eT val, const eT ) { return eop_aux::sin(val); }
572 
573 template<> template<typename eT> arma_hot arma_pure arma_inline eT
574 eop_core<eop_tan >::process(const eT val, const eT ) { return eop_aux::tan(val); }
575 
576 template<> template<typename eT> arma_hot arma_pure arma_inline eT
577 eop_core<eop_acos >::process(const eT val, const eT ) { return eop_aux::acos(val); }
578 
579 template<> template<typename eT> arma_hot arma_pure arma_inline eT
580 eop_core<eop_asin >::process(const eT val, const eT ) { return eop_aux::asin(val); }
581 
582 template<> template<typename eT> arma_hot arma_pure arma_inline eT
583 eop_core<eop_atan >::process(const eT val, const eT ) { return eop_aux::atan(val); }
584 
585 template<> template<typename eT> arma_hot arma_pure arma_inline eT
586 eop_core<eop_cosh >::process(const eT val, const eT ) { return eop_aux::cosh(val); }
587 
588 template<> template<typename eT> arma_hot arma_pure arma_inline eT
589 eop_core<eop_sinh >::process(const eT val, const eT ) { return eop_aux::sinh(val); }
590 
591 template<> template<typename eT> arma_hot arma_pure arma_inline eT
592 eop_core<eop_tanh >::process(const eT val, const eT ) { return eop_aux::tanh(val); }
593 
594 template<> template<typename eT> arma_hot arma_pure arma_inline eT
595 eop_core<eop_acosh >::process(const eT val, const eT ) { return eop_aux::acosh(val); }
596 
597 template<> template<typename eT> arma_hot arma_pure arma_inline eT
598 eop_core<eop_asinh >::process(const eT val, const eT ) { return eop_aux::asinh(val); }
599 
600 template<> template<typename eT> arma_hot arma_pure arma_inline eT
601 eop_core<eop_atanh >::process(const eT val, const eT ) { return eop_aux::atanh(val); }
602 
603 template<> template<typename eT> arma_hot arma_pure arma_inline eT
604 eop_core<eop_eps >::process(const eT val, const eT ) { return eop_aux::direct_eps(val); }
605 
606 template<> template<typename eT> arma_hot arma_pure arma_inline eT
607 eop_core<eop_abs >::process(const eT val, const eT ) { return eop_aux::arma_abs(val); }
608 
609 template<> template<typename eT> arma_hot arma_pure arma_inline eT
610 eop_core<eop_conj >::process(const eT val, const eT ) { return eop_aux::conj(val); }
611 
612 template<> template<typename eT> arma_hot arma_pure arma_inline eT
613 eop_core<eop_pow >::process(const eT val, const eT k) { return eop_aux::pow(val, k); }
614 
615 template<> template<typename eT> arma_hot arma_pure arma_inline eT
616 eop_core<eop_floor >::process(const eT val, const eT ) { return eop_aux::floor(val); }
617 
618 template<> template<typename eT> arma_hot arma_pure arma_inline eT
619 eop_core<eop_ceil >::process(const eT val, const eT ) { return eop_aux::ceil(val); }
620 
621 
622 
623 #undef arma_applier_1
624 #undef arma_applier_2
625 #undef arma_applier_3
626 
627 
628 
arma_inline arma_warn_unused eT * memptr()
returns a pointer to array of eTs used by the matrix
Definition: Mat_meat.hpp:4024
arma_inline uword get_n_cols() const
arma_inline uword get_n_cols() const
Definition: eOp_meat.hpp:82
static arma_inline arma_integral_only< eT >::result atanh(const eT x)
Definition: eop_aux.hpp:137
static arma_float_only< eT >::result trunc_exp(const eT x)
#define arma_applier_3(operatorA)
static arma_inline arma_integral_only< eT >::result acos(const eT x)
Definition: eop_aux.hpp:123
static arma_hot void apply_inplace_minus(Mat< typename T1::elem_type > &out, const eOp< T1, eop_type > &x)
static arma_hot void apply_inplace_schur(Mat< typename T1::elem_type > &out, const eOp< T1, eop_type > &x)
arma_inline uword get_n_rows() const
Definition: eOp_meat.hpp:72
arma_aligned const Proxy< T1 > P
Definition: eOp_bones.hpp:31
static arma_inline arma_integral_only< eT >::result tan(const eT x)
Definition: eop_aux.hpp:152
static arma_inline arma_integral_only< eT >::result log(const eT x)
Definition: eop_aux.hpp:148
static arma_hot void apply_inplace_div(Mat< typename T1::elem_type > &out, const eOp< T1, eop_type > &x)
const uword n_cols
number of columns in the matrix (read-only)
Definition: Mat_bones.hpp:30
#define arma_debug_assert_same_size
Definition: debug.hpp:1086
static arma_inline arma_integral_only< eT >::result cosh(const eT x)
Definition: eop_aux.hpp:153
const uword n_elem
number of elements in the matrix (read-only)
Definition: Mat_bones.hpp:31
const uword n_rows
number of rows in the matrix (read-only)
Definition: Mat_bones.hpp:29
static arma_inline arma_integral_only< eT >::result asin(const eT x)
Definition: eop_aux.hpp:124
arma_inline uword get_n_slices() const
static arma_inline arma_integral_only< eT >::result floor(const eT x)
Definition: eop_aux.hpp:171
arma_hot arma_pure static arma_inline eT process(const eT val, const eT k)
#define arma_applier_1(operatorA)
#define arma_applier_2(operatorA)
u32 uword
Definition: typedef.hpp:85
static arma_inline arma_not_cx< eT >::result conj(const eT x)
Definition: eop_aux.hpp:143
static arma_inline arma_integral_only< eT >::result exp10(const eT x)
Definition: eop_aux.hpp:204
arma_aligned elem_type aux
storage of auxiliary data, user defined format
Definition: eOp_bones.hpp:32
arma_inline arma_warn_unused eT * memptr()
returns a pointer to array of eTs used by the cube
Definition: Cube_meat.hpp:2260
const uword n_cols
number of columns in each slice (read-only)
Definition: Cube_bones.hpp:38
static arma_inline arma_unsigned_integral_only< eT >::result neg(const eT x)
Definition: eop_aux.hpp:168
static arma_inline arma_integral_only< eT >::result exp2(const eT x)
Definition: eop_aux.hpp:226
static arma_inline arma_integral_only< eT >::result sin(const eT x)
Definition: eop_aux.hpp:151
static arma_inline arma_integral_only< eT >::result log2(const eT x)
Definition: eop_aux.hpp:183
#define arma_ignore(variable)
static arma_inline arma_integral_only< eT >::result exp(const eT x)
Definition: eop_aux.hpp:149
#define arma_const
Dense cube class.
Definition: Cube_bones.hpp:30
static arma_inline arma_integral_only< eT >::result atan(const eT x)
Definition: eop_aux.hpp:125
static arma_inline arma_integral_only< eT >::result acosh(const eT x)
Definition: eop_aux.hpp:135
void arma_cold arma_stop(const T1 &x)
print a message to get_stream_err1() and/or throw a logic_error exception
Definition: debug.hpp:98
static arma_inline arma_integral_only< eT >::result ceil(const eT x)
Definition: eop_aux.hpp:175
static arma_inline arma_integral_only< eT >::result tanh(const eT x)
Definition: eop_aux.hpp:155
static arma_inline arma_unsigned_integral_only< eT >::result arma_abs(const eT x)
work around a bug in GCC 4.4
Definition: eop_aux.hpp:319
static arma_inline arma_integral_only< eT >::result log10(const eT x)
Definition: eop_aux.hpp:147
arma_aligned const ProxyCube< T1 > P
#define arma_extra_debug_sigprint
Definition: debug.hpp:1116
arma_inline uword get_n_rows() const
arma_aligned elem_type aux
storage of auxiliary data, user defined format
const uword n_elem
number of elements in the cube (read-only)
Definition: Cube_bones.hpp:41
#define arma_pure
static arma_inline arma_integral_only< eT >::result sqrt(const eT x)
Definition: eop_aux.hpp:146
Dense matrix class.
#define arma_inline
static arma_inline arma_integral_only< eT >::result sinh(const eT x)
Definition: eop_aux.hpp:154
static arma_hot void apply(Mat< typename T1::elem_type > &out, const eOp< T1, eop_type > &x)
static arma_inline arma_integral_only< eT >::result direct_eps(const eT)
Definition: eop_aux.hpp:269
static arma_inline arma_integral_only< eT >::result asinh(const eT x)
Definition: eop_aux.hpp:136
static arma_inline arma_integral_only< eT >::result cos(const eT x)
Definition: eop_aux.hpp:150
static arma_float_only< eT >::result trunc_log(const eT x)
#define arma_hot
static arma_hot void apply_inplace_plus(Mat< typename T1::elem_type > &out, const eOp< T1, eop_type > &x)
static arma_inline arma_float_or_cx_only< T1 >::result pow(const T1 base, const T2 exponent)
Definition: eop_aux.hpp:247
const uword n_slices
number of slices in the cube (read-only)
Definition: Cube_bones.hpp:40
const uword n_rows
number of rows in each slice (read-only)
Definition: Cube_bones.hpp:37


armadillo_matrix
Author(s):
autogenerated on Fri Apr 16 2021 02:31:57