From 31f28dabf5b521780e883b5d0876ceb417d0a34d Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 23 May 2019 15:02:32 +0200
Subject: [PATCH] linear regression: handle casees where only 1 entry or null
 is given, refacotr duplicate code

---
 VectoCommon/VectoCommon/Utils/VectoMath.cs | 41 +++++++---------------
 1 file changed, 13 insertions(+), 28 deletions(-)

diff --git a/VectoCommon/VectoCommon/Utils/VectoMath.cs b/VectoCommon/VectoCommon/Utils/VectoMath.cs
index 658f1e6268..79bb62af7f 100644
--- a/VectoCommon/VectoCommon/Utils/VectoMath.cs
+++ b/VectoCommon/VectoCommon/Utils/VectoMath.cs
@@ -339,6 +339,12 @@ namespace TUGraz.VectoCommon.Utils
 
 		public static void LeastSquaresFitting<T>(IEnumerable<T> entries, Func<T, double> getX, Func<T, double> getY,
 			out double k, out double d, out double r)
+		{
+
+			LeastSquaresFitting(entries?.Select(x => new Point(getX(x), getY(x))), out k, out d, out r);
+		}
+
+		public static void LeastSquaresFitting(IEnumerable<Point> entries, out double k, out double d, out double r)
 		{
 			// algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28)
 			var count = 0;
@@ -347,39 +353,12 @@ namespace TUGraz.VectoCommon.Utils
 			var sumXSquare = 0.0;
 			var sumYSquare = 0.0;
 			var sumXY = 0.0;
-			foreach (var entry in entries) {
-				var x = getX(entry);
-				var y = getY(entry);
-				sumX += x;
-				sumY += y;
-				sumXSquare += x * x;
-				sumYSquare += y * y;
-				sumXY += x * y;
-				count++;
-			}
-			if (count == 0) {
+			if (entries == null) {
 				k = 0;
 				d = 0;
 				r = 0;
 				return;
 			}
-			var ssxx = sumXSquare - sumX * sumX / count;
-			var ssxy = sumXY - sumX * sumY / count;
-			var ssyy = sumYSquare - sumY * sumY / count;
-			k = ssxy / ssxx;
-			d = (sumY - k * sumX) / count;
-			r = ssxy * ssxy / ssxx / ssyy;
-		}
-
-		public static void LeastSquaresFitting(IEnumerable<Point> entries, out double k, out double d, out double r)
-		{
-			// algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28)
-			var count = 0;
-			var sumX = 0.0;
-			var sumY = 0.0;
-			var sumXSquare = 0.0;
-			var sumYSquare = 0.0;
-			var sumXY = 0.0;
 			foreach (var entry in entries) {
 				var x = entry.X;
 				var y = entry.Y;
@@ -396,6 +375,12 @@ namespace TUGraz.VectoCommon.Utils
 				r = 0;
 				return;
 			}
+			if (count == 1) {
+				k = 0;
+				d = sumY;
+				r = 0;
+				return;
+			}
 			var ssxx = sumXSquare - sumX * sumX / count;
 			var ssxy = sumXY - sumX * sumY / count;
 			var ssyy = sumYSquare - sumY * sumY / count;
-- 
GitLab