Histogram constructor
Creates a histogram from a list of measurements
.
If forceRange
is specified, the histogram will only span from -x
to +x
, exactly. The measurements that fall outside this range will be
added to the outermost buckets.
Implementation
Histogram(List<int> measurements, {int? forceRange}) {
// Maximum distance from 0.
var distance = forceRange ??
measurements.fold<int>(
0, (previousValue, element) => max(previousValue, element.abs()));
lowestBound = (-distance - 1);
highestBound = (distance + 1);
bucketWidth = (highestBound - lowestBound) / bucketCount;
for (final m in measurements) {
var bucketIndex = ((m - lowestBound) / bucketWidth).floor();
if (bucketIndex < 0) {
assert(forceRange != null);
bucketIndex = 0;
}
if (bucketIndex >= bucketCount) {
assert(forceRange != null);
bucketIndex = bucketCount - 1;
}
bucketMemberCounts[bucketIndex] += 1;
}
final highestCount = bucketMemberCounts.fold<int>(0, max);
bucketsNormalized = List<double>.generate(
bucketCount, (index) => bucketMemberCounts[index] / highestCount);
}