Chris@49
|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2012 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup fn_sum
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 //! \brief
|
Chris@49
|
14 //! Delayed sum of elements of a matrix along a specified dimension (either rows or columns).
|
Chris@49
|
15 //! The result is stored in a dense matrix that has either one column or one row.
|
Chris@49
|
16 //! For dim = 0, find the sum of each column (traverse across rows)
|
Chris@49
|
17 //! For dim = 1, find the sum of each row (traverse across columns)
|
Chris@49
|
18 //! The default is dim = 0.
|
Chris@49
|
19 //! NOTE: the dim argument is different than in Matlab/Octave.
|
Chris@49
|
20
|
Chris@49
|
21 template<typename T1>
|
Chris@49
|
22 arma_inline
|
Chris@49
|
23 const Op<T1, op_sum>
|
Chris@49
|
24 sum
|
Chris@49
|
25 (
|
Chris@49
|
26 const T1& X,
|
Chris@49
|
27 const uword dim = 0,
|
Chris@49
|
28 const typename enable_if< is_arma_type<T1>::value == true >::result* junk1 = 0,
|
Chris@49
|
29 const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0
|
Chris@49
|
30 )
|
Chris@49
|
31 {
|
Chris@49
|
32 arma_extra_debug_sigprint();
|
Chris@49
|
33 arma_ignore(junk1);
|
Chris@49
|
34 arma_ignore(junk2);
|
Chris@49
|
35
|
Chris@49
|
36 return Op<T1, op_sum>(X, dim, 0);
|
Chris@49
|
37 }
|
Chris@49
|
38
|
Chris@49
|
39
|
Chris@49
|
40
|
Chris@49
|
41 template<typename T1>
|
Chris@49
|
42 arma_inline
|
Chris@49
|
43 const Op<T1, op_sum>
|
Chris@49
|
44 sum
|
Chris@49
|
45 (
|
Chris@49
|
46 const T1& X,
|
Chris@49
|
47 const uword dim,
|
Chris@49
|
48 const typename enable_if< resolves_to_vector<T1>::value == true >::result* junk = 0
|
Chris@49
|
49 )
|
Chris@49
|
50 {
|
Chris@49
|
51 arma_extra_debug_sigprint();
|
Chris@49
|
52 arma_ignore(junk);
|
Chris@49
|
53
|
Chris@49
|
54 return Op<T1, op_sum>(X, dim, 0);
|
Chris@49
|
55 }
|
Chris@49
|
56
|
Chris@49
|
57
|
Chris@49
|
58
|
Chris@49
|
59 //! \brief
|
Chris@49
|
60 //! Immediate 'sum all values' operation for expressions which resolve to a vector
|
Chris@49
|
61 template<typename T1>
|
Chris@49
|
62 inline
|
Chris@49
|
63 arma_warn_unused
|
Chris@49
|
64 typename T1::elem_type
|
Chris@49
|
65 sum
|
Chris@49
|
66 (
|
Chris@49
|
67 const T1& X,
|
Chris@49
|
68 const arma_empty_class junk1 = arma_empty_class(),
|
Chris@49
|
69 const typename enable_if< resolves_to_vector<T1>::value == true >::result* junk2 = 0
|
Chris@49
|
70 )
|
Chris@49
|
71 {
|
Chris@49
|
72 arma_extra_debug_sigprint();
|
Chris@49
|
73 arma_ignore(junk1);
|
Chris@49
|
74 arma_ignore(junk2);
|
Chris@49
|
75
|
Chris@49
|
76 return accu(X);
|
Chris@49
|
77 }
|
Chris@49
|
78
|
Chris@49
|
79
|
Chris@49
|
80
|
Chris@49
|
81 //! \brief
|
Chris@49
|
82 //! Immediate 'sum all values' operation,
|
Chris@49
|
83 //! invoked, for example, by: sum(sum(A))
|
Chris@49
|
84
|
Chris@49
|
85 template<typename T1>
|
Chris@49
|
86 inline
|
Chris@49
|
87 arma_warn_unused
|
Chris@49
|
88 typename T1::elem_type
|
Chris@49
|
89 sum(const Op<T1, op_sum>& in)
|
Chris@49
|
90 {
|
Chris@49
|
91 arma_extra_debug_sigprint();
|
Chris@49
|
92 arma_extra_debug_print("sum(): two consecutive sum() calls detected");
|
Chris@49
|
93
|
Chris@49
|
94 return accu(in.m);
|
Chris@49
|
95 }
|
Chris@49
|
96
|
Chris@49
|
97
|
Chris@49
|
98
|
Chris@49
|
99 template<typename T1>
|
Chris@49
|
100 arma_inline
|
Chris@49
|
101 const Op<Op<T1, op_sum>, op_sum>
|
Chris@49
|
102 sum(const Op<T1, op_sum>& in, const uword dim)
|
Chris@49
|
103 {
|
Chris@49
|
104 arma_extra_debug_sigprint();
|
Chris@49
|
105
|
Chris@49
|
106 return Op<Op<T1, op_sum>, op_sum>(in, dim, 0);
|
Chris@49
|
107 }
|
Chris@49
|
108
|
Chris@49
|
109
|
Chris@49
|
110
|
Chris@49
|
111 template<typename T>
|
Chris@49
|
112 arma_inline
|
Chris@49
|
113 arma_warn_unused
|
Chris@49
|
114 const typename arma_scalar_only<T>::result &
|
Chris@49
|
115 sum(const T& x)
|
Chris@49
|
116 {
|
Chris@49
|
117 return x;
|
Chris@49
|
118 }
|
Chris@49
|
119
|
Chris@49
|
120
|
Chris@49
|
121
|
Chris@49
|
122 //! sum of sparse object
|
Chris@49
|
123 template<typename T1>
|
Chris@49
|
124 inline
|
Chris@49
|
125 typename
|
Chris@49
|
126 enable_if2
|
Chris@49
|
127 <
|
Chris@49
|
128 (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == true),
|
Chris@49
|
129 typename T1::elem_type
|
Chris@49
|
130 >::result
|
Chris@49
|
131 sum(const T1& x)
|
Chris@49
|
132 {
|
Chris@49
|
133 arma_extra_debug_sigprint();
|
Chris@49
|
134
|
Chris@49
|
135 // sum elements
|
Chris@49
|
136 return accu(x);
|
Chris@49
|
137 }
|
Chris@49
|
138
|
Chris@49
|
139
|
Chris@49
|
140
|
Chris@49
|
141 template<typename T1>
|
Chris@49
|
142 inline
|
Chris@49
|
143 typename
|
Chris@49
|
144 enable_if2
|
Chris@49
|
145 <
|
Chris@49
|
146 (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == false),
|
Chris@49
|
147 const SpOp<T1,spop_sum>
|
Chris@49
|
148 >::result
|
Chris@49
|
149 sum(const T1& x, const uword dim = 0)
|
Chris@49
|
150 {
|
Chris@49
|
151 arma_extra_debug_sigprint();
|
Chris@49
|
152
|
Chris@49
|
153 return SpOp<T1,spop_sum>(x, dim, 0);
|
Chris@49
|
154 }
|
Chris@49
|
155
|
Chris@49
|
156
|
Chris@49
|
157
|
Chris@49
|
158 template<typename T1>
|
Chris@49
|
159 inline
|
Chris@49
|
160 arma_warn_unused
|
Chris@49
|
161 typename T1::elem_type
|
Chris@49
|
162 sum(const SpOp<T1, spop_sum>& in)
|
Chris@49
|
163 {
|
Chris@49
|
164 arma_extra_debug_sigprint();
|
Chris@49
|
165 arma_extra_debug_print("sum(): two consecutive sum() calls detected");
|
Chris@49
|
166
|
Chris@49
|
167 return accu(in.m);
|
Chris@49
|
168 }
|
Chris@49
|
169
|
Chris@49
|
170
|
Chris@49
|
171
|
Chris@49
|
172 template<typename T1>
|
Chris@49
|
173 arma_inline
|
Chris@49
|
174 const SpOp<SpOp<T1, spop_sum>, spop_sum>
|
Chris@49
|
175 sum(const SpOp<T1, spop_sum>& in, const uword dim)
|
Chris@49
|
176 {
|
Chris@49
|
177 arma_extra_debug_sigprint();
|
Chris@49
|
178
|
Chris@49
|
179 return SpOp<SpOp<T1, spop_sum>, spop_sum>(in, dim, 0);
|
Chris@49
|
180 }
|
Chris@49
|
181
|
Chris@49
|
182
|
Chris@49
|
183
|
Chris@49
|
184 //! @}
|