00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _edoEstimatorNormalMono_h
00029 #define _edoEstimatorNormalMono_h
00030
00031 #include "edoEstimator.h"
00032 #include "edoNormalMono.h"
00033
00039 template < typename EOT >
00040 class edoEstimatorNormalMono : public edoEstimator< edoNormalMono< EOT > >
00041 {
00042 public:
00043 typedef typename EOT::AtomType AtomType;
00044
00045 class Variance
00046 {
00047 public:
00048 Variance() : _sumvar(0){}
00049
00050 void update(AtomType v)
00051 {
00052 _n++;
00053
00054 AtomType d = v - _mean;
00055
00056 _mean += 1 / _n * d;
00057 _sumvar += (_n - 1) / _n * d * d;
00058 }
00059
00060 AtomType get_mean() const {return _mean;}
00061 AtomType get_var() const {return _sumvar / (_n - 1);}
00062 AtomType get_std() const {return sqrt( get_var() );}
00063
00064 private:
00065 AtomType _n;
00066 AtomType _mean;
00067 AtomType _sumvar;
00068 };
00069
00070 public:
00071 edoNormalMono< EOT > operator()(eoPop<EOT>& pop)
00072 {
00073 unsigned int popsize = pop.size();
00074 assert(popsize > 0);
00075
00076 unsigned int dimsize = pop[0].size();
00077 assert(dimsize > 0);
00078
00079 std::vector< Variance > var( dimsize );
00080
00081 for (unsigned int i = 0; i < popsize; ++i)
00082 {
00083 for (unsigned int d = 0; d < dimsize; ++d)
00084 {
00085 var[d].update( pop[i][d] );
00086 }
00087 }
00088
00089 EOT mean( dimsize );
00090 EOT variance( dimsize );
00091
00092 for (unsigned int d = 0; d < dimsize; ++d)
00093 {
00094 mean[d] = var[d].get_mean();
00095 variance[d] = var[d].get_var();
00096 }
00097
00098 return edoNormalMono< EOT >( mean, variance );
00099 }
00100 };
00101
00102 #endif // !_edoEstimatorNormalMono_h