diff OrthancStone/Sources/Toolbox/LinearAlgebra.cpp @ 1984:187a261d7ae2

computation of mean and stddev in rectangle probes
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 31 Oct 2022 14:42:46 +0100
parents 6ce81914f7e4
children 07964689cb0b
line wrap: on
line diff
--- a/OrthancStone/Sources/Toolbox/LinearAlgebra.cpp	Mon Oct 31 12:32:47 2022 +0100
+++ b/OrthancStone/Sources/Toolbox/LinearAlgebra.cpp	Mon Oct 31 14:42:46 2022 +0100
@@ -41,6 +41,59 @@
 {
   namespace LinearAlgebra
   {
+    void OnlineVarianceEstimator::AddSample(double value)
+    {
+      count_++;
+      sum_ += value;
+      sumOfSquares_ += value * value;
+    }
+
+
+    void OnlineVarianceEstimator::Clear()
+    {
+      count_ = 0;
+      sum_ = 0;
+      sumOfSquares_ = 0;
+    }
+      
+
+    double OnlineVarianceEstimator::GetMean() const
+    {
+      if (count_ == 0)
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        return sum_ / static_cast<double>(count_);
+      }
+    }
+      
+
+    double OnlineVarianceEstimator::GetVariance() const
+    {
+      if (count_ == 0)
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
+      }        
+      else if (count_ == 1)
+      {
+        return 0;
+      }
+      else
+      {
+        const double n = static_cast<double>(count_);
+        return (sumOfSquares_ * n - sum_ * sum_) / (n * (n - 1.0));
+      }
+    }
+
+      
+    double OnlineVarianceEstimator::GetStandardDeviation() const
+    {
+      return sqrt(GetVariance());
+    }
+    
+
     void Print(const Vector& v)
     {
       for (size_t i = 0; i < v.size(); i++)