From 0602352705ae45e897c42bf7380143d1fa7f2472 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sun, 11 Feb 2018 09:11:49 +0100 Subject: [PATCH] BREAKING: Statistics: Ranks and RankInplace of single precision to return single precision arrays #364 --- .../Statistics/ArrayStatistics.Single.cs | 38 ++++++++++++++++++- src/Numerics/Statistics/Statistics.cs | 2 +- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/Numerics/Statistics/ArrayStatistics.Single.cs b/src/Numerics/Statistics/ArrayStatistics.Single.cs index 7614cf12..9cba31de 100644 --- a/src/Numerics/Statistics/ArrayStatistics.Single.cs +++ b/src/Numerics/Statistics/ArrayStatistics.Single.cs @@ -759,9 +759,9 @@ namespace MathNet.Numerics.Statistics /// with an existing system. /// WARNING: Works inplace and can thus causes the data array to be reordered. /// - public static double[] RanksInplace(float[] data, RankDefinition definition = RankDefinition.Default) + public static float[] RanksInplace(float[] data, RankDefinition definition = RankDefinition.Default) { - var ranks = new double[data.Length]; + var ranks = new float[data.Length]; var index = new int[data.Length]; for (int i = 0; i < index.Length; i++) { @@ -803,5 +803,39 @@ namespace MathNet.Numerics.Statistics RanksTies(ranks, index, previousIndex, data.Length, definition); return ranks; } + + static void RanksTies(float[] ranks, int[] index, int a, int b, RankDefinition definition) + { + // TODO: potential for PERF optimization + float rank; + switch (definition) + { + case RankDefinition.Average: + { + rank = (b + a - 1) / 2f + 1; + break; + } + + case RankDefinition.Min: + { + rank = a + 1; + break; + } + + case RankDefinition.Max: + { + rank = b; + break; + } + + default: + throw new NotSupportedException(); + } + + for (int k = a; k < b; k++) + { + ranks[index[k]] = rank; + } + } } } diff --git a/src/Numerics/Statistics/Statistics.cs b/src/Numerics/Statistics/Statistics.cs index b1c887f9..04a04ca1 100644 --- a/src/Numerics/Statistics/Statistics.cs +++ b/src/Numerics/Statistics/Statistics.cs @@ -1267,7 +1267,7 @@ namespace MathNet.Numerics.Statistics /// /// The data sample sequence. /// Rank definition, to choose how ties should be handled and what product/definition it should be consistent with - public static double[] Ranks(this IEnumerable data, RankDefinition definition = RankDefinition.Default) + public static float[] Ranks(this IEnumerable data, RankDefinition definition = RankDefinition.Default) { float[] array = data.ToArray(); return ArrayStatistics.RanksInplace(array, definition);