Chris@49
|
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2011 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_misc
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 //! \brief
|
Chris@49
|
15 //! Generate a vector with 'num' elements.
|
Chris@49
|
16 //! The values of the elements linearly increase from 'start' upto (and including) 'end'.
|
Chris@49
|
17
|
Chris@49
|
18 template<typename vec_type>
|
Chris@49
|
19 inline
|
Chris@49
|
20 vec_type
|
Chris@49
|
21 linspace
|
Chris@49
|
22 (
|
Chris@49
|
23 const typename vec_type::pod_type start,
|
Chris@49
|
24 const typename vec_type::pod_type end,
|
Chris@49
|
25 const uword num = 100u,
|
Chris@49
|
26 const typename arma_Mat_Col_Row_only<vec_type>::result* junk = 0
|
Chris@49
|
27 )
|
Chris@49
|
28 {
|
Chris@49
|
29 arma_extra_debug_sigprint();
|
Chris@49
|
30 arma_ignore(junk);
|
Chris@49
|
31
|
Chris@49
|
32 typedef typename vec_type::elem_type eT;
|
Chris@49
|
33 typedef typename vec_type::pod_type T;
|
Chris@49
|
34
|
Chris@49
|
35 vec_type x;
|
Chris@49
|
36
|
Chris@49
|
37 if(num >= 2)
|
Chris@49
|
38 {
|
Chris@49
|
39 x.set_size(num);
|
Chris@49
|
40
|
Chris@49
|
41 eT* x_mem = x.memptr();
|
Chris@49
|
42
|
Chris@49
|
43 const uword num_m1 = num - 1;
|
Chris@49
|
44
|
Chris@49
|
45 if(is_non_integral<T>::value == true)
|
Chris@49
|
46 {
|
Chris@49
|
47 const T delta = (end-start)/T(num_m1);
|
Chris@49
|
48
|
Chris@49
|
49 for(uword i=0; i<num_m1; ++i)
|
Chris@49
|
50 {
|
Chris@49
|
51 x_mem[i] = eT(start + i*delta);
|
Chris@49
|
52 }
|
Chris@49
|
53
|
Chris@49
|
54 x_mem[num_m1] = eT(end);
|
Chris@49
|
55 }
|
Chris@49
|
56 else
|
Chris@49
|
57 {
|
Chris@49
|
58 const double delta = (end >= start) ? double(end-start)/double(num_m1) : -double(start-end)/double(num_m1);
|
Chris@49
|
59
|
Chris@49
|
60 for(uword i=0; i<num_m1; ++i)
|
Chris@49
|
61 {
|
Chris@49
|
62 x_mem[i] = eT(double(start) + i*delta);
|
Chris@49
|
63 }
|
Chris@49
|
64
|
Chris@49
|
65 x_mem[num_m1] = eT(end);
|
Chris@49
|
66 }
|
Chris@49
|
67
|
Chris@49
|
68 return x;
|
Chris@49
|
69 }
|
Chris@49
|
70 else
|
Chris@49
|
71 {
|
Chris@49
|
72 x.set_size(1);
|
Chris@49
|
73
|
Chris@49
|
74 x[0] = eT(end);
|
Chris@49
|
75 }
|
Chris@49
|
76
|
Chris@49
|
77 return x;
|
Chris@49
|
78 }
|
Chris@49
|
79
|
Chris@49
|
80
|
Chris@49
|
81
|
Chris@49
|
82 inline
|
Chris@49
|
83 mat
|
Chris@49
|
84 linspace(const double start, const double end, const uword num = 100u)
|
Chris@49
|
85 {
|
Chris@49
|
86 arma_extra_debug_sigprint();
|
Chris@49
|
87 return linspace<mat>(start, end, num);
|
Chris@49
|
88 }
|
Chris@49
|
89
|
Chris@49
|
90
|
Chris@49
|
91
|
Chris@49
|
92 //
|
Chris@49
|
93 // log_exp_add
|
Chris@49
|
94
|
Chris@49
|
95 template<typename eT>
|
Chris@49
|
96 inline
|
Chris@49
|
97 typename arma_real_only<eT>::result
|
Chris@49
|
98 log_add_exp(eT log_a, eT log_b)
|
Chris@49
|
99 {
|
Chris@49
|
100 if(log_a < log_b)
|
Chris@49
|
101 {
|
Chris@49
|
102 std::swap(log_a, log_b);
|
Chris@49
|
103 }
|
Chris@49
|
104
|
Chris@49
|
105 const eT negdelta = log_b - log_a;
|
Chris@49
|
106
|
Chris@49
|
107 if( (negdelta < Datum<eT>::log_min) || (arma_isfinite(negdelta) == false) )
|
Chris@49
|
108 {
|
Chris@49
|
109 return log_a;
|
Chris@49
|
110 }
|
Chris@49
|
111 else
|
Chris@49
|
112 {
|
Chris@49
|
113 #if defined(ARMA_HAVE_LOG1P)
|
Chris@49
|
114 return (log_a + log1p(std::exp(negdelta)));
|
Chris@49
|
115 #else
|
Chris@49
|
116 return (log_a + std::log(1.0 + std::exp(negdelta)));
|
Chris@49
|
117 #endif
|
Chris@49
|
118 }
|
Chris@49
|
119 }
|
Chris@49
|
120
|
Chris@49
|
121
|
Chris@49
|
122
|
Chris@49
|
123 // for compatibility with earlier versions
|
Chris@49
|
124 template<typename eT>
|
Chris@49
|
125 inline
|
Chris@49
|
126 typename arma_real_only<eT>::result
|
Chris@49
|
127 log_add(eT log_a, eT log_b)
|
Chris@49
|
128 {
|
Chris@49
|
129 return log_add_exp(log_a, log_b);
|
Chris@49
|
130 }
|
Chris@49
|
131
|
Chris@49
|
132
|
Chris@49
|
133
|
Chris@49
|
134 template<typename eT>
|
Chris@49
|
135 arma_inline
|
Chris@49
|
136 arma_warn_unused
|
Chris@49
|
137 bool
|
Chris@49
|
138 is_finite(const eT x, const typename arma_scalar_only<eT>::result* junk = 0)
|
Chris@49
|
139 {
|
Chris@49
|
140 arma_ignore(junk);
|
Chris@49
|
141
|
Chris@49
|
142 return arma_isfinite(x);
|
Chris@49
|
143 }
|
Chris@49
|
144
|
Chris@49
|
145
|
Chris@49
|
146
|
Chris@49
|
147 template<typename T1>
|
Chris@49
|
148 inline
|
Chris@49
|
149 arma_warn_unused
|
Chris@49
|
150 bool
|
Chris@49
|
151 is_finite(const Base<typename T1::elem_type,T1>& X)
|
Chris@49
|
152 {
|
Chris@49
|
153 arma_extra_debug_sigprint();
|
Chris@49
|
154
|
Chris@49
|
155 typedef typename T1::elem_type eT;
|
Chris@49
|
156
|
Chris@49
|
157 const unwrap<T1> tmp(X.get_ref());
|
Chris@49
|
158 const Mat<eT>& A = tmp.M;
|
Chris@49
|
159
|
Chris@49
|
160 return A.is_finite();
|
Chris@49
|
161 }
|
Chris@49
|
162
|
Chris@49
|
163
|
Chris@49
|
164
|
Chris@49
|
165 template<typename T1>
|
Chris@49
|
166 inline
|
Chris@49
|
167 arma_warn_unused
|
Chris@49
|
168 bool
|
Chris@49
|
169 is_finite(const BaseCube<typename T1::elem_type,T1>& X)
|
Chris@49
|
170 {
|
Chris@49
|
171 arma_extra_debug_sigprint();
|
Chris@49
|
172
|
Chris@49
|
173 typedef typename T1::elem_type eT;
|
Chris@49
|
174
|
Chris@49
|
175 const unwrap_cube<T1> tmp(X.get_ref());
|
Chris@49
|
176 const Cube<eT>& A = tmp.M;
|
Chris@49
|
177
|
Chris@49
|
178 return A.is_finite();
|
Chris@49
|
179 }
|
Chris@49
|
180
|
Chris@49
|
181
|
Chris@49
|
182
|
Chris@49
|
183 template<typename T1>
|
Chris@49
|
184 arma_inline
|
Chris@49
|
185 Op<T1, op_sympd>
|
Chris@49
|
186 sympd(const Base<typename T1::elem_type,T1>& X)
|
Chris@49
|
187 {
|
Chris@49
|
188 arma_extra_debug_sigprint();
|
Chris@49
|
189
|
Chris@49
|
190 return Op<T1, op_sympd>(X.get_ref());
|
Chris@49
|
191 }
|
Chris@49
|
192
|
Chris@49
|
193
|
Chris@49
|
194
|
Chris@49
|
195 template<typename eT>
|
Chris@49
|
196 inline
|
Chris@49
|
197 void
|
Chris@49
|
198 swap(Mat<eT>& A, Mat<eT>& B)
|
Chris@49
|
199 {
|
Chris@49
|
200 arma_extra_debug_sigprint();
|
Chris@49
|
201
|
Chris@49
|
202 const uword A_mem_state = A.mem_state;
|
Chris@49
|
203
|
Chris@49
|
204 if( (A.vec_state == B.vec_state) && (A_mem_state == B.mem_state) && ((A_mem_state == 0) || (A_mem_state == 3)) )
|
Chris@49
|
205 {
|
Chris@49
|
206 A.swap(B);
|
Chris@49
|
207 }
|
Chris@49
|
208 else
|
Chris@49
|
209 {
|
Chris@49
|
210 if(A.n_elem <= B.n_elem)
|
Chris@49
|
211 {
|
Chris@49
|
212 Mat<eT> C = A;
|
Chris@49
|
213
|
Chris@49
|
214 A.steal_mem(B);
|
Chris@49
|
215 B.steal_mem(C);
|
Chris@49
|
216 }
|
Chris@49
|
217 else
|
Chris@49
|
218 {
|
Chris@49
|
219 Mat<eT> C = B;
|
Chris@49
|
220
|
Chris@49
|
221 B.steal_mem(A);
|
Chris@49
|
222 A.steal_mem(C);
|
Chris@49
|
223 }
|
Chris@49
|
224 }
|
Chris@49
|
225 }
|
Chris@49
|
226
|
Chris@49
|
227
|
Chris@49
|
228
|
Chris@49
|
229 //! @}
|