Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00016
00017
00018
00022
00023 template<typename vec_type>
00024 inline
00025 vec_type
00026 linspace
00027 (
00028 const typename vec_type::pod_type start,
00029 const typename vec_type::pod_type end,
00030 const uword num = 100u,
00031 const typename arma_Mat_Col_Row_only<vec_type>::result* junk = 0
00032 )
00033 {
00034 arma_extra_debug_sigprint();
00035 arma_ignore(junk);
00036
00037 typedef typename vec_type::elem_type eT;
00038 typedef typename vec_type::pod_type T;
00039
00040 vec_type x;
00041
00042 if(num >= 2)
00043 {
00044 x.set_size(num);
00045
00046 eT* x_mem = x.memptr();
00047
00048 const uword num_m1 = num - 1;
00049
00050 if(is_non_integral<T>::value == true)
00051 {
00052 const T delta = (end-start)/T(num_m1);
00053
00054 for(uword i=0; i<num_m1; ++i)
00055 {
00056 x_mem[i] = eT(start + i*delta);
00057 }
00058
00059 x_mem[num_m1] = eT(end);
00060 }
00061 else
00062 {
00063 const double delta = (end >= start) ? double(end-start)/double(num_m1) : -double(start-end)/double(num_m1);
00064
00065 for(uword i=0; i<num_m1; ++i)
00066 {
00067 x_mem[i] = eT(double(start) + i*delta);
00068 }
00069
00070 x_mem[num_m1] = eT(end);
00071 }
00072
00073 return x;
00074 }
00075 else
00076 {
00077 x.set_size(1);
00078
00079 x[0] = eT(end);
00080 }
00081
00082 return x;
00083 }
00084
00085
00086
00087 inline
00088 mat
00089 linspace(const double start, const double end, const uword num = 100u)
00090 {
00091 arma_extra_debug_sigprint();
00092 return linspace<mat>(start, end, num);
00093 }
00094
00095
00096
00097
00098
00099
00100 template<typename eT>
00101 inline
00102 typename arma_float_only<eT>::result
00103 log_add(eT log_a, eT log_b)
00104 {
00105 if(log_a < log_b)
00106 {
00107 std::swap(log_a, log_b);
00108 }
00109
00110 const eT negdelta = log_b - log_a;
00111
00112 if( (negdelta < Math<eT>::log_min()) || (arma_isfinite(negdelta) == false) )
00113 {
00114 return log_a;
00115 }
00116 else
00117 {
00118 #if defined(ARMA_HAVE_LOG1P)
00119 return (log_a + log1p(std::exp(negdelta)));
00120 #else
00121 return (log_a + std::log(1.0 + std::exp(negdelta)));
00122 #endif
00123 }
00124 }
00125
00126
00127
00128 template<typename eT>
00129 arma_inline
00130 arma_warn_unused
00131 bool
00132 is_finite(const eT x, const typename arma_scalar_only<eT>::result* junk = 0)
00133 {
00134 arma_ignore(junk);
00135
00136 return arma_isfinite(x);
00137 }
00138
00139
00140
00141 template<typename T1>
00142 inline
00143 arma_warn_unused
00144 bool
00145 is_finite(const Base<typename T1::elem_type,T1>& X)
00146 {
00147 arma_extra_debug_sigprint();
00148
00149 typedef typename T1::elem_type eT;
00150
00151 const unwrap<T1> tmp(X.get_ref());
00152 const Mat<eT>& A = tmp.M;
00153
00154 return A.is_finite();
00155 }
00156
00157
00158
00159 template<typename T1>
00160 inline
00161 arma_warn_unused
00162 bool
00163 is_finite(const BaseCube<typename T1::elem_type,T1>& X)
00164 {
00165 arma_extra_debug_sigprint();
00166
00167 typedef typename T1::elem_type eT;
00168
00169 const unwrap_cube<T1> tmp(X.get_ref());
00170 const Cube<eT>& A = tmp.M;
00171
00172 return A.is_finite();
00173 }
00174
00175
00176
00177 template<typename T1>
00178 arma_inline
00179 Op<T1, op_sympd>
00180 sympd(const Base<typename T1::elem_type,T1>& X)
00181 {
00182 arma_extra_debug_sigprint();
00183
00184 return Op<T1, op_sympd>(X.get_ref());
00185 }
00186
00187
00188