Go to the documentation of this file.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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include "cxutils/math/runningstats.h"
00054 #include <cmath>
00055 #include <algorithm>
00056
00057 using namespace CxUtils;
00058
00059
00065 RunningStats::RunningStats()
00066 {
00067 Clear();
00068 mDirtyFlag = true;
00069 }
00070
00071
00077 RunningStats::RunningStats(const RunningStats& stats)
00078 {
00079 Clear();
00080 *this = stats;
00081 }
00082
00083
00089 RunningStats::~RunningStats()
00090 {
00091 }
00092
00093
00099 void RunningStats::Clear()
00100 {
00101 mCount = 0;
00102 mOldMean = 0;
00103 mNewMean = 0;
00104 mOldStd = 0;
00105 mNewStd = 0;
00106 mValues.clear();
00107 mDirtyFlag = true;
00108 }
00109
00110
00118 void RunningStats::Push(const double value)
00119 {
00120 mCount++;
00121
00122 if(mCount == 1)
00123 {
00124 mOldMean = mNewMean = value;
00125 mOldStd = mNewStd = 0.0;
00126 }
00127 else
00128 {
00129 mNewMean = mOldMean + (value - mOldMean)/mCount;
00130 mNewStd = mOldStd + (value - mOldMean)*(value - mNewMean);
00131
00132
00133 mOldMean = mNewMean;
00134 mOldStd = mNewStd;
00135 }
00136 mValues.push_back(value);
00137 mDirtyFlag = true;
00138 }
00139
00140
00146 void RunningStats::SetStandardDeviation(const double std)
00147 {
00148 if(mCount <= 1)
00149 {
00150 mOldStd = mNewStd = 0;
00151 }
00152 else
00153 {
00154 mOldStd = mNewStd = (std*std)*mCount - 1;
00155 }
00156 }
00157
00158
00164 double RunningStats::Mean() const
00165 {
00166 return (mCount > 0) ? mNewMean : 0.0;
00167 }
00168
00169
00175 double RunningStats::Median() const
00176 {
00177 double m = 0.0;
00178
00179 if(mDirtyFlag)
00180 {
00181 std::vector<double> *ptr = (std::vector<double> *)&mValues;
00182 std::sort(ptr->begin(), ptr->end());
00183 *((bool *)&mDirtyFlag) = false;
00184 }
00185 if(mValues.size() > 0)
00186 {
00187 if(mValues.size() % 2 == 0)
00188 {
00189 if(mValues.size() == 2)
00190 {
00191 m = (mValues.front() + mValues.back())/2.0;
00192 }
00193 else
00194 {
00195 unsigned int middle = (unsigned int)(mValues.size()/2);
00196 m = (mValues[middle - 1] + mValues[middle])/2.0;
00197 }
00198 }
00199 else
00200 {
00201 if(mValues.size() == 1)
00202 {
00203 m = mValues.front();
00204 }
00205 else
00206 {
00207 m = mValues[mValues.size()/2];
00208 }
00209 }
00210 }
00211 return m;
00212 }
00213
00214
00220 double RunningStats::Variance() const
00221 {
00222 return (mCount > 1) ? mNewStd/(mCount - 1) : 0.0;
00223 }
00224
00225
00231 double RunningStats::StandardDeviation() const
00232 {
00233 return sqrt(Variance());
00234 }
00235
00236
00242 RunningStats& RunningStats::operator =(const RunningStats& stats)
00243 {
00244 if(this != &stats)
00245 {
00246 mCount = stats.mCount;
00247 mOldMean = stats.mOldMean;
00248 mNewMean = stats.mNewMean;
00249 mOldStd = stats.mOldStd;
00250 mNewStd = stats.mNewStd;
00251 }
00252 return *this;
00253 }
00254
00255