 Timestamp:
 10/16/15 14:37:31 (8 years ago)
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

trunk/sources/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs
r12012 r13025 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Diagnostics.Contracts; 24 25 using System.Linq; 25 26 … … 44 45 } else { 45 46 return (valuesArr[(n / 2)  1] + valuesArr[n / 2]) / 2.0; 47 } 48 } 49 50 /// <summary> 51 /// Calculates the alphaquantile element of the enumeration. 52 /// </summary> 53 /// <param name="values"></param> 54 /// <returns></returns> 55 public static double Quantile(this IEnumerable<double> values, double alpha) { 56 Contract.Assert(alpha > 0 && alpha < 1); 57 // iterate only once 58 double[] valuesArr = values.ToArray(); 59 int n = valuesArr.Length; 60 if (n == 0) throw new InvalidOperationException("Enumeration contains no elements."); 61 62 Array.Sort(valuesArr); 63 // starts at 0 64 65 // return the element at Math.Ceiling (if n*alpha is fractional) or the average of two elements if n*alpha is integer. 66 var pos = n * alpha; 67 Contract.Assert(pos >= 0); 68 Contract.Assert(pos < n); 69 bool isInteger = Math.Round(pos).IsAlmost(pos); 70 if (isInteger) { 71 return 0.5 * (valuesArr[(int)pos  1] + valuesArr[(int)pos]); 72 } else { 73 return valuesArr[(int)Math.Ceiling(pos)  1]; 46 74 } 47 75 }
Note: See TracChangeset
for help on using the changeset viewer.