diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2020-02-12 19:15:02 -0600 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2020-02-17 15:57:43 -0600 |
| commit | 9efcd08ea355dc5b37e90e6fcb7c43029a5232ef (patch) | |
| tree | bf96aacf53e48cd5e9f99caf85f611fe4241d367 /Source/Core | |
| parent | 82a3aa5ff67b0239b85d18a6da77d3fd2900640c (diff) | |
MathUtil: Add RunningMean/RunningVariance classes.
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Common/MathUtil.h | 40 |
1 files changed, 40 insertions, 0 deletions
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 <algorithm> +#include <cmath> #include <vector> #include "Common/CommonTypes.h" @@ -93,6 +94,45 @@ struct Rectangle } }; +template <typename T> +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 <typename T> +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<T> m_running_mean; + T m_variance{}; +}; + } // namespace MathUtil float MathFloatVectorSum(const std::vector<float>&); |
