UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
medmean.hpp
1 /* medmean.hpp */
2 /* $Id: medmean.hpp,v 1.4 2008/08/11 18:33:56 biburath Exp $ */
3 #ifndef __medmean_hpp
4 #define __medmean_hpp
5 
6 #include <algorithm>
7 
8 #include <iostream>
9 
10 namespace median
11 {
12 
13 
14  template<typename T, typename BadnessT>
15  struct stl_compare
16  {
17  stl_compare(const BadnessT &q):badness(q)
18  {
19  }
20 
21  bool operator()(const T &a, const T &b) const
22  {
23  return badness(a)>badness(b);
24  }
25  BadnessT badness;
26  };
27 
28 
48  template<typename T, typename ContainerT, typename BadnessT>
49  ContainerT
50  filter(const ContainerT &OldSet, double rejection )
51  {
52 
53  ContainerT Set=OldSet;
54 
55 
56  //1. sorting
57  {
58  BadnessT bad(Set);
59  stl_compare<T,BadnessT> comp(bad);
60  std::sort(Set.begin(), Set.end(), comp);
61  }
62 
63 
64  //2. reducing
65  double price=1.0/(double)Set.size();
66  for(double p=1; p>=(1-rejection); p-=price){
67 
68  ContainerT S1=Set;
69  S1.erase(S1.begin()); //S1 is Set without first element
70 
71  ContainerT S2=Set;
72  S2.erase(--S2.end()); //S2 is Set without last element
73 
74  BadnessT
75  B0=BadnessT(Set),
76  B1=BadnessT(S1),
77  B2=BadnessT(S2);
78 
79  if( B1() > B0() && B2() > B0() )
80  break;
81 
82  if( B1() - B0() < B2() - B0() )
83  Set=S1;
84  else
85  Set=S2;
86  }
87 
88  return Set;
89 
90  }
91 
92 
93 
94 
95 
96 };
97 
98 
99 
100 #endif /* medmean.hpp */
Definition: corr_wave_detector.hpp:52
Definition: medmean.hpp:15