diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-05-06 09:12:33 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-05-06 09:18:15 +0200 |
commit | a2f5079b3dc4ca97961879c81df39660700120cb (patch) | |
tree | 7ebbcfe01fee2d4cb7729d83c93a410236e1df75 | |
parent | 5897c22eca510293ab0c56dc9118cb1c5ca40b45 (diff) |
api: add class for computing running variance
-rwxr-xr-x | opentrack/variance.hpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/opentrack/variance.hpp b/opentrack/variance.hpp new file mode 100755 index 00000000..55060b02 --- /dev/null +++ b/opentrack/variance.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include <cmath> + +// no copyright information other than the attribution below. + +// code shared as an example/tutorial of running variance +// written by John D. Cook on the website <http://www.johndcook.com/blog/standard_deviation> + +// following references in the site's article: + +// Chan, Tony F.; Golub, Gene H.; LeVeque, Randall J. (1983). +// Algorithms for Computing the Sample Variance: Analysis and Recommendations. +// The American Statistician 37, 242-247. + +// Ling, Robert F. (1974). +// Comparison of Several Algorithms for Computing Sample Means and Variances. +// Journal of the American Statistical Association, Vol. 69, No. 348, 859-866. + +class variance +{ + double m_old, m_new, s_old, s_new; + unsigned long cnt; + +public: + variance() : cnt(0) {} + + void clear() { *this = variance(); } + + void input(double x) + { + cnt++; + + if (cnt == 1) + { + m_old = m_new = x; + s_old = 0; + } + else + { + m_new = m_old + (x - m_old)/cnt; + s_new = s_old + (x - m_old)*(x - m_new); + + m_old = m_new; + s_old = s_new; + } + } + + double avg() const { return cnt > 0 ? m_new : 0; } + double Var() const { return cnt > 1 ? s_new/(cnt - 1) : 0; } + double stddev() const { return std::sqrt(Var()); } +}; |