37 #ifndef AIMS_MATH_MATHELEM_H 38 #define AIMS_MATH_MATHELEM_H 58 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>
243 return absdiff<T>( mx, mi );
246 template <
typename Iterator>
247 static T
sum( Iterator b, Iterator e )
253 for( i=b; i!=e; ++i )
254 accumulate += (
double)(*i);
255 return (T)accumulate;
258 template <
typename Iterator>
263 double accumulateSq = 0.0;
266 for( i=b; i!=e; ++i ) {
267 accumulate += (double)(*i);
268 accumulateSq += ( (double)(*i) * (double)(*i) );
272 double dcount = (double) count;
273 return (T) ( accumulateSq / dcount -
274 ( accumulate / dcount ) *
275 ( accumulate / dcount ) );
278 template <
typename Iterator>
279 static T
stdev( Iterator b, Iterator e )
283 double accumulateSq = 0.0;
286 for( i=b; i!=e; ++i ) {
287 accumulate += (double)(*i);
288 accumulateSq += ( (double)(*i) * (double)(*i) );
292 double dcount = (double) count;
293 return (T) std::sqrt( accumulateSq / dcount -
294 ( accumulate / dcount ) *
295 ( accumulate / dcount ) );
312 template <
class T>
inline 315 double re2=(double)re;
316 double im2=(double)im;
318 if ((!re2) && (!im2))
return(0);
321 if (im2>=0)
return M_PI/2;
324 if (re2>0)
return std::atan(im2/re2);
325 else if (im2>=0)
return std::atan(im2/re2)+M_PI;
326 else return std::atan(im2/re2)-M_PI;
333 template <
class T>
inline 340 template <
class T>
inline 347 template<
class T >
inline 352 c = (T)std::fabs( a );
353 d = (T)std::fabs( b );
356 return c * (T)std::sqrt( (T)1 +
square( d / c ) );
358 return ( d == (T)0 ) ? (T)0 : d * (T)std::sqrt( (T)1 +
square( c / d ) );
double AimsArgument(T re, T im)
Get the argument of a complex re + i.im.
AIMSDATA_API double AimsSigmoid(double x)
Sigmoidal function (useful for neural networks)
T cub(const T &x)
Get the cube of x.
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)
T pythagore(const T &a, const T &b)
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...
static T min(Iterator b, Iterator e, T default_value=std::numeric_limits< T >::max())
T max(const Volume< T > &vol)
static T extrema_difference(Iterator b, Iterator e)
DataTypeTraits< T >::LongType sum(const Volume< T > &vol)
The class for EcatSino data write operation.
static T mean(Iterator b, Iterator e)
Defines basic math functions that run on iterators.
T min(const Volume< T > &vol)
AIMSDATA_API int AimsNextPowerOfTwo(int number)
Return the next power of two closest to an integer.
static T sum(Iterator b, Iterator e)
static T stdev(Iterator b, Iterator e)
static T notnull_mean(Iterator b, Iterator e)
T sqr(const T &x)
Get the square of x.
static T max(Iterator b, Iterator e, T default_value=carto::min_limit< T >())
float sgn(const T &x)
Get the sign of x.
static T variance(Iterator b, Iterator e)
static T median(Iterator b, Iterator e, T default_value=(T) 0)
OUTP accumulate(const Volume< T > &vol, BinaryFunction func, OUTP initial)