Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/13/15 21:02:54 (9 years ago)
Author:
gkronber
Message:

#2491: merged r13034 and r13051 from trunk to stable branch

Location:
stable
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs

    r13150 r13151  
    6565
    6666    // Numerical Recipes in C++, §8.5 Selecting the Mth Largest, O(n)
    67     // Giben k in [0..n-1] returns an array value from array arr[0..n-1] such that k array values are
     67    // Given k in [0..n-1] returns an array value from array arr[0..n-1] such that k array values are
    6868    // less than or equal to the one returned. The input array will be rearranged to have this value in
    6969    // location arr[k], with all smaller elements moved to arr[0..k-1] (in arbitrary order) and all
    7070    // larger elements in arr[k+1..n-1] (also in arbitrary order).
     71    //
     72    // Could be changed to Select<T> where T is IComparable but in this case is significantly slower for double values
    7173    private static double Select(int k, double[] arr) {
    7274      Contract.Assert(arr.GetLowerBound(0) == 0);
     
    198200    }
    199201
    200     /// <summary>
    201     /// Calculates the pth percentile of the values.
    202     /// </summary>
    203     public static double Percentile(this IEnumerable<double> values, double p) {
    204       // iterate only once
    205       double[] valuesArr = values.ToArray();
    206       int n = valuesArr.Length;
    207       if (n == 0) throw new InvalidOperationException("Enumeration contains no elements.");
    208       if (n == 1) return values.ElementAt(0);
    209 
    210       if (p.IsAlmost(0.0)) return valuesArr[0];
    211       if (p.IsAlmost(1.0)) return valuesArr[n - 1];
    212 
    213       double t = p * (n - 1);
    214       int index = (int)Math.Floor(t);
    215       double percentage = t - index;
    216       return valuesArr[index] * (1 - percentage) + valuesArr[index + 1] * percentage;
    217     }
    218 
    219202    public static IEnumerable<double> LimitToRange(this IEnumerable<double> values, double min, double max) {
    220203      if (min > max) throw new ArgumentException(string.Format("Minimum {0} is larger than maximum {1}.", min, max));
Note: See TracChangeset for help on using the changeset viewer.