summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2020-02-12 19:15:02 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2020-02-17 15:57:43 -0600
commit9efcd08ea355dc5b37e90e6fcb7c43029a5232ef (patch)
treebf96aacf53e48cd5e9f99caf85f611fe4241d367 /Source/Core
parent82a3aa5ff67b0239b85d18a6da77d3fd2900640c (diff)
MathUtil: Add RunningMean/RunningVariance classes.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/MathUtil.h40
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>&);