annotate armadillo-3.900.4/include/armadillo_bits/fn_misc.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
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 //! @}