00001 #ifndef _theplu_yat_statistics_averagerweighted_
00002 #define _theplu_yat_statistics_averagerweighted_
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 #include "Averager.h"
00028 #include "yat/utility/iterator_traits.h"
00029
00030 #include <cmath>
00031
00032 namespace theplu{
00033 namespace yat{
00034 namespace statistics{
00035
00063 class AveragerWeighted
00064 {
00065 public:
00066
00070 AveragerWeighted(void);
00071
00075 AveragerWeighted(const AveragerWeighted&);
00076
00080 void add(const double d,const double w=1);
00081
00087 double mean(void) const;
00088
00100 double n(void) const;
00101
00107 void rescale(double a);
00108
00112 void reset(void);
00113
00120 double std(void) const;
00121
00133 double standard_error(void) const;
00134
00140 double sum_w(void) const;
00141
00145 double sum_ww(void) const;
00146
00152 double sum_wx(void) const;
00153
00157 double sum_wxx(void) const;
00158
00162 double sum_xx_centered(void) const;
00163
00170 double variance(const double m) const;
00171
00181 double variance(void) const;
00182
00183
00184 private:
00188 double sum_wwx(void) const;
00189
00193 double sum_wwxx(void) const;
00194
00195 const Averager& wx(void) const;
00196 const Averager& w(void) const;
00197
00201 const AveragerWeighted& operator+=(const AveragerWeighted&);
00202
00203 Averager w_;
00204 Averager wx_;
00205 double wwx_;
00206 double wxx_;
00207 };
00208
00214 template <typename Iter>
00215 void add(AveragerWeighted& a, Iter first, Iter last)
00216 {
00217 for ( ; first != last; ++first)
00218 a.add(utility::iterator_traits<Iter>().data(first),
00219 utility::iterator_traits<Iter>().weight(first));
00220 }
00221
00230 template <typename Iter1, typename Iter2>
00231 void add(AveragerWeighted& a, Iter1 first1, Iter1 last1, Iter2 first2)
00232 {
00233 utility::check_iterator_is_unweighted(first1);
00234 utility::check_iterator_is_unweighted(first2);
00235 for ( ; first1 != last1; ++first1, ++first2)
00236 a.add(*first1, *first2);
00237 }
00238
00239 }}}
00240
00241 #endif