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)