37 #ifndef AIMS_MATH_MATHELEM_H
38 #define AIMS_MATH_MATHELEM_H
59 template <
typename T>
inline T
sqr(
const T & x)
65 template <
typename T>
inline T
cub(
const T & x )
71 template <
typename T>
inline float sgn(
const T & x )
73 return x < 0 ? -1.0f : +1.0f;
80 inline T
absdiff(
const T& x,
const T& y )
82 return std::abs(
static_cast<double>(y) -
static_cast<double>(x));
116 template <
typename T>
120 template<
typename Iterator>
121 static T
max( Iterator b, Iterator e, T default_value = carto::min_limit<T>() )
124 m = std::max_element( b, e, internal::is_min<T> );
126 return default_value;
131 template <
typename Iterator>
135 m = std::min_element( b, e, internal::is_min<T> );
137 return default_value;
142 template <
typename Iterator>
143 static T
median( Iterator b, Iterator e, T default_value = (T)0 )
146 std::vector<T> values;
147 for( i=b; i!=e; ++i )
148 values.push_back( (T) *i );
150 if( values.size() == 0 )
151 return default_value;
152 std::sort( values.begin(), values.end() );
153 return values[ values.size() / 2 ];
156 template<
typename Iterator>
160 std::vector<T> values;
161 for( i=b; i!=e; ++i )
163 values.push_back( *i );
165 if( values.size() == 0 )
166 return default_value;
167 std::sort( values.begin(), values.end() );
168 return values[ values.size() / 2 ];
171 template <
typename Iterator>
172 static T
mean( Iterator b, Iterator e )
179 for( ; i != e; ++i) {
183 return (count != 0 ? (T)(
sum / count ) : (T)0);
186 template <
typename Iterator>
194 for( i=b; i!=e; ++i )
199 return (count != 0 ? (T)(
sum / count ) : (T)0);
202 template <
typename Iterator>
203 static T
majority( Iterator b, Iterator e, T default_value = (T)0 )
206 T currentclass, majorityclass = default_value;
207 uint32_t currentclasscases = 0, majoritycases = 0;
208 std::map<T, uint32_t> classcases;
211 for( i=b; i!=e; ++i )
215 if ( !classcases[ currentclass ] )
217 classcases[ currentclass ] = 1;
218 currentclasscases = 1;
222 currentclasscases = classcases[ currentclass ] + 1;
223 classcases[ currentclass ] = currentclasscases;
226 if (currentclasscases > majoritycases)
229 majorityclass = currentclass;
230 majoritycases = currentclasscases;
234 return majorityclass;
237 template <
typename Iterator>
241 T currentclass, majorityclass = default_value;
242 uint32_t currentclasscases = 0, majoritycases = 0;
243 std::map<T, uint32_t> classcases;
246 for( i=b; i!=e; ++i )
252 if ( !classcases[ currentclass ] )
254 classcases[ currentclass ] = 1;
255 currentclasscases = 1;
259 currentclasscases = classcases[ currentclass ] + 1;
260 classcases[ currentclass ] = currentclasscases;
263 if (currentclasscases > majoritycases)
266 majorityclass = currentclass;
267 majoritycases = currentclasscases;
272 return majorityclass;
275 template <
typename Iterator>
281 return absdiff<T>( mx, mi );
284 template <
typename Iterator>
285 static T
sum( Iterator b, Iterator e )
291 for( i=b; i!=e; ++i )
296 template <
typename Iterator>
301 double accumulateSq = 0.0;
304 for( i=b; i!=e; ++i ) {
306 accumulateSq += ( (double)(*i) * (double)(*i) );
310 double dcount = (double) count;
311 return (T) ( accumulateSq / dcount -
316 template <
typename Iterator>
317 static T
stdev( Iterator b, Iterator e )
321 double accumulateSq = 0.0;
324 for( i=b; i!=e; ++i ) {
326 accumulateSq += ( (double)(*i) * (double)(*i) );
330 double dcount = (double) count;
331 return (T) std::sqrt( accumulateSq / dcount -
350 template <
class T>
inline
353 double re2=(double)re;
354 double im2=(double)im;
356 if ((!re2) && (!im2))
return(0);
359 if (im2>=0)
return M_PI/2;
362 if (re2>0)
return std::atan(im2/re2);
363 else if (im2>=0)
return std::atan(im2/re2)+M_PI;
364 else return std::atan(im2/re2)-M_PI;
371 template <
class T>
inline
378 template <
class T>
inline
385 template<
class T >
inline
390 c = (T)std::fabs( a );
391 d = (T)std::fabs( b );
394 return c * (T)std::sqrt( (T)1 +
square( d / c ) );
396 return ( d == (T)0 ) ? (T)0 : d * (T)std::sqrt( (T)1 +
square( c / d ) );
Defines basic math functions that run on iterators.
static T notnull_mean(Iterator b, Iterator e)
static T median(Iterator b, Iterator e, T default_value=(T) 0)
static T mean(Iterator b, Iterator e)
static T variance(Iterator b, Iterator e)
static T extrema_difference(Iterator b, Iterator e)
static T min(Iterator b, Iterator e, T default_value=std::numeric_limits< T >::max())
static T majority(Iterator b, Iterator e, T default_value=(T) 0)
static T notnull_median(Iterator b, Iterator e, T default_value=(T) 0)
static T stdev(Iterator b, Iterator e)
static T max(Iterator b, Iterator e, T default_value=carto::min_limit< T >())
static T sum(Iterator b, Iterator e)
static T notnull_majority(Iterator b, Iterator e, T default_value=(T) 0)
T pythagore(const T &a, const T &b)
AIMSDATA_API double AimsSigmoid(double x)
Sigmoidal function (useful for neural networks)
double AimsArgument(T re, T im)
Get the argument of a complex re + i.im.
AIMSDATA_API int AimsNextPowerOfTwo(int number)
Return the next power of two closest to an integer.
The class for EcatSino data write operation.
T absdiff(const T &x, const T &y)
Get the absolute difference between 2 values without having to take care of used type this is particu...
float sgn(const T &x)
Get the sign of x.
T sqr(const T &x)
Get the square of x.
T cub(const T &x)
Get the cube of x.
OUTP accumulate(const Volume< T > &vol, BinaryFunction func, OUTP initial)