UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
median_avg.hpp
1 /* median_avg.hpp */
2 /* $Id$ */
3 #ifndef __median_avg_hpp
4 #define __median_avg_hpp
5 
6 #include <set>
7 //#include <stdio.h>
8 
9 
15 template <typename T>
16 T medmean_avg(const std::multiset<T> &values, double reject)
17 {
18  // nothing to do with empty data
19  if (values.size() == 0)
20  return 0;
21 
22  // fix reject value to be [0,1]
23  if (reject < 0.)
24  reject = 0.;
25  else if (reject > 1.)
26  reject = 1.;
27 
28  // calc median average value
29  size_t id = 0;
30  size_t N = 0;
31  size_t first = (size_t)(0.5*reject*values.size());
32  size_t last = values.size() - first;
33  T avg_val = 0;
34  //printf("medmean_avg: first=%zu, last=%zu (%zu/%zu)\n",
35  // first, last, last - first, values.size());
36  for (typename std::multiset<T>::iterator it = values.begin();
37  it != values.end();
38  ++it,++id)
39  {
40  if (id < first ||
41  id >= last)
42  continue;
43 
44  //printf ("medmean_avg: val[%zu]=%g\n", id, *it);
45  avg_val += (*it);
46  N++;
47  }
48 
49  return (N>0)?(avg_val/N):0;
50 }
51 
52 #endif /* median_avg.hpp */