Changeset 5809 for trunk/sources/HeuristicLab.Common
- Timestamp:
- 03/23/11 01:09:38 (13 years ago)
- Location:
- trunk/sources
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources
- Property svn:mergeinfo changed
-
trunk/sources/HeuristicLab.Common/3.3
- Property svn:ignore
-
old new 3 3 *.user 4 4 HeuristicLabCommonPlugin.cs 5 *.vs10x
-
- Property svn:ignore
-
trunk/sources/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs
r5445 r5809 32 32 /// <returns></returns> 33 33 public static double Median(this IEnumerable<double> values) { 34 int n = values.Count(); 34 // iterate only once 35 double[] valuesArr = values.ToArray(); 36 int n = valuesArr.Length; 35 37 if (n == 0) throw new InvalidOperationException("Enumeration contains no elements."); 36 38 37 double[] sortedValues = new double[n]; 38 int i = 0; 39 foreach (double x in values) 40 sortedValues[i++] = x; 41 42 Array.Sort(sortedValues); 39 Array.Sort(valuesArr); 43 40 44 41 // return the middle element (if n is uneven) or the average of the two middle elements if n is even. 45 42 if (n % 2 == 1) { 46 return sortedValues[n / 2];43 return valuesArr[n / 2]; 47 44 } else { 48 return ( sortedValues[(n / 2) - 1] + sortedValues[n / 2]) / 2.0;45 return (valuesArr[(n / 2) - 1] + valuesArr[n / 2]) / 2.0; 49 46 } 50 47 } … … 92 89 /// </summary 93 90 public static double Percentile(this IEnumerable<double> values, double p) { 94 if (values.Count() == 0) throw new InvalidOperationException("Enumeration contains no elements."); 95 if (values.Count() == 1) return values.ElementAt(0); 91 // iterate only once 92 double[] valuesArr = values.ToArray(); 93 int n = valuesArr.Length; 94 if (n == 0) throw new InvalidOperationException("Enumeration contains no elements."); 95 if (n == 1) return values.ElementAt(0); 96 96 97 double[] sortedValues = values.ToArray(); 98 Array.Sort(sortedValues); 99 100 int n = sortedValues.Length; 101 if (p.IsAlmost(0.0)) return sortedValues[0]; 102 if (p.IsAlmost(1.0)) return sortedValues[n - 1]; 97 if (p.IsAlmost(0.0)) return valuesArr[0]; 98 if (p.IsAlmost(1.0)) return valuesArr[n - 1]; 103 99 104 100 double t = p * (n - 1); 105 101 int index = (int)Math.Floor(t); 106 102 double percentage = t - index; 107 return sortedValues[index] * (1 - percentage) + sortedValues[index + 1] * percentage; 103 return valuesArr[index] * (1 - percentage) + valuesArr[index + 1] * percentage; 104 } 105 106 public static IEnumerable<double> LimitToRange(this IEnumerable<double> values, double min, double max) { 107 foreach (var x in values) { 108 if (double.IsNaN(x)) yield return (max + min) / 2.0; 109 else if (x < min) yield return min; 110 else if (x > max) yield return max; 111 else yield return x; 112 } 108 113 } 109 114 }
Note: See TracChangeset
for help on using the changeset viewer.