From 9efcd08ea355dc5b37e90e6fcb7c43029a5232ef Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Wed, 12 Feb 2020 19:15:02 -0600 Subject: [PATCH] MathUtil: Add RunningMean/RunningVariance classes. --- Source/Core/Common/MathUtil.h | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h index 3ad01bc9fe..0e4b840524 100644 --- a/Source/Core/Common/MathUtil.h +++ b/Source/Core/Common/MathUtil.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include #include "Common/CommonTypes.h" @@ -93,6 +94,45 @@ struct Rectangle } }; +template +class RunningMean +{ +public: + constexpr void Clear() { *this = {}; } + + constexpr void Push(T x) { m_mean = m_mean + (x - m_mean) / ++m_count; } + + constexpr size_t Count() const { return m_count; } + constexpr T Mean() const { return m_mean; } + +private: + size_t m_count = 0; + T m_mean{}; +}; + +template +class RunningVariance +{ +public: + constexpr void Clear() { *this = {}; } + + constexpr void Push(T x) + { + const auto old_mean = m_running_mean.Mean(); + m_running_mean.Push(x); + m_variance += (x - old_mean) * (x - m_running_mean.Mean()); + } + + constexpr size_t Count() const { return m_running_mean.Count(); } + constexpr T Mean() const { return m_running_mean.Mean(); } + constexpr T Variance() const { return m_variance / (Count() - 1); } + constexpr T StandardDeviation() const { return std::sqrt(Variance()); } + +private: + RunningMean m_running_mean; + T m_variance{}; +}; + } // namespace MathUtil float MathFloatVectorSum(const std::vector&);