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