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 #ifndef __DESCRIPTIVE_STATS_TCC__
00026 #define __DESCRIPTIVE_STATS_TCC__
00027 #include <numeric>
00028 #include <functional>
00029 #include <iterator>
00030
00035 namespace Sequence
00036 {
00037 template<typename iterator>
00038 double mean(iterator beg, iterator end)
00039 {
00040 double _result(0);
00041 double _nsam(end-beg);
00042 for( ; beg != end ; beg++)
00043 {
00044 _result += *beg;
00045 }
00046 return double(_result)/double(_nsam);
00047 }
00048
00049 template<typename iterator>
00050 double variance(iterator beg, iterator end)
00051 {
00052 double _mean(0);
00053 double _xsq(0);
00054 double _nsam(end-beg);
00055 for( ; beg != end ; beg++)
00056 {
00057 _mean += *beg;
00058 _xsq += (*beg)*(*beg);
00059 }
00060 return double(_xsq)/double(_nsam-1) -
00061 (double(_mean)/double(_nsam))*(double(_mean)/double(_nsam-1));
00062 }
00063
00064 template<typename ForwardIterator>
00065 std::pair<double,double>
00066 meanAndVar(ForwardIterator beg,
00067 ForwardIterator end)
00068 {
00069 Sums<double> __s = std::accumulate(beg,end,Sums<double>());
00070 return std::make_pair(__s.mean(),__s.variance());
00071 }
00072
00073 template<typename T>
00074 Sums<T>::Sums() : __sum( T() ), __sumsq( T() ), __n(0u)
00075 {
00076 }
00077
00078 template<typename T>
00079 Sums<T> & Sums<T>::operator+=(const T & t)
00080 {
00081 __sum += t;
00082 __sumsq += t*t;
00083 __n++;
00084 return *this;
00085 }
00086
00087 template<typename T>
00088 Sums<T> & Sums<T>::operator+=(const Sums<T> & s)
00089 {
00090 __sum += s.__sum;
00091 __sumsq += s.__sumsq;
00092 __n += s.__n;
00093 return *this;
00094 }
00095
00096 template<typename T>
00097 const Sums<T> operator+(const Sums<T> & lhs,const Sums<T> & rhs)
00098 {
00099 return Sums<T>(lhs) += rhs;
00100 }
00101
00102 template<typename T>
00103 const Sums<T> operator+(const Sums<T> & lhs,const T & rhs)
00104 {
00105 return Sums<T>(lhs) += rhs;
00106 }
00107
00108 template<typename T>
00109 const T & Sums<T>::sum() const
00110 {
00111 return __sum;
00112 }
00113
00114 template<typename T>
00115 const T & Sums<T>::sumSquares() const
00116 {
00117 return __sumsq;
00118 }
00119
00120 template<typename T>
00121 typename Sums<T>::floating_type Sums<T>::mean() const
00122 {
00123 return floating_type(__sum)/floating_type(__n);
00124 }
00125
00126 template<typename T>
00127 typename Sums<T>::floating_type Sums<T>::variance() const
00128 {
00129 return ( floating_type(__sumsq)/floating_type(__n-1) -
00130 floating_type(__sum*__sum)/floating_type(__n*(__n-1)) );
00131 }
00132 }
00133 #endif