SimpleStats.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _SIMPLESTATS_H_
00019 #define _SIMPLESTATS_H_
00020
00021 #include <math.h>
00022 #include <iostream>
00023
00024
00025
00026
00027
00028 class RunningStat
00029 {
00030 public:
00031 RunningStat() : m_n(0), m_oldM(0), m_newM(0), m_oldS(0), m_newS(0) {}
00032
00033 void Clear()
00034 {
00035 m_n = 0;
00036 }
00037
00038 void Push(double x)
00039 {
00040 m_n++;
00041
00042
00043 if (m_n == 1)
00044 {
00045 m_oldM = x;
00046 m_oldS = 0.0;
00047 }
00048 else
00049 {
00050 m_newM = m_oldM + (x - m_oldM)/m_n;
00051 m_newS = m_oldS + (x - m_oldM)*(x - m_newM);
00052
00053
00054 m_oldM = m_newM;
00055 m_oldS = m_newS;
00056 }
00057 }
00058
00059 int NumDataValues() const
00060 {
00061 return m_n;
00062 }
00063
00064 double Mean() const
00065 {
00066 return (m_n > 0) ? m_newM : 0.0;
00067 }
00068
00069 double Variance() const
00070 {
00071 return ((m_n > 1) ? m_newS/(m_n - 1) : 0.0);
00072 }
00073
00074 double StandardDeviation() const
00075 {
00076 return sqrt(Variance());
00077 }
00078
00079 private:
00080 uint64_t m_n;
00081 double m_oldM, m_newM, m_oldS, m_newS;
00082 };
00083
00084
00085
00086
00087 inline bool operator == (RunningStat &r, int i)
00088 {
00089 return r.NumDataValues() == i;
00090 }
00091
00092 inline std::ostream &operator << (std::ostream &stream, RunningStat &s)
00093 {
00094 stream << "N: " << s.NumDataValues()
00095 << " Mean: " << s.Mean()
00096 << " Standard Deviation: " << s.StandardDeviation();
00097
00098 return stream;
00099 }
00100
00101
00102 #endif