diff --git a/src/Numerics/Statistics/Histogram.cs b/src/Numerics/Statistics/Histogram.cs index f33d95a6..f988cce9 100644 --- a/src/Numerics/Statistics/Histogram.cs +++ b/src/Numerics/Statistics/Histogram.cs @@ -499,5 +499,49 @@ namespace MathNet.Numerics.Statistics return sb.ToString(); } + + /// + /// Calculate the Distance between two histograms + /// + /// The histogram that will be compared with this histogram + /// The power used for calculating the distance (e.g. 2 for Ecludian distance) + /// A delegate for the distance function + /// The distance between the two histograms + public double HistogramDistance(Histogram h, double power, Func distanceFunction){ + if (this.BucketCount != h.BucketCount) + { + throw new ArgumentException("The two histograms must have the same number of buckets"); + } + double[] a1 = new double[this.BucketCount]; + double[] a2 = new double[this.BucketCount]; + for (int i = 0; i < this.BucketCount; i++) + { + a1[i] = this[i].Count; + a2[i] = h[i].Count; + } + return distanceFunction(power, a1, a2); + } + + /// + /// Calculate the Distance between two histograms + /// + /// The histogram that will be compared with this histogram + /// A delegate for the distance function + /// The distance between the two histograms + public double HistogramDistance(Histogram h, Func distanceFunction) + { + if (this.BucketCount != h.BucketCount) + { + throw new ArgumentException("The two histograms must have the same number of buckets"); + } + double[] a1 = new double[this.BucketCount]; + double[] a2 = new double[this.BucketCount]; + for (int i = 0; i < this.BucketCount; i++) + { + a1[i] = this[i].Count; + a2[i] = h[i].Count; + } + return distanceFunction(a1, a2); + } } }