23 VarType total = 0, total_count = 0;
27 for (
auto i = m_clip_left; i <= m_clip_right; ++i) {
28 auto center = m_binning.getBin(i);
29 total += (*m_counts)[i] * center;
30 total_count += (*m_counts)[i];
31 sigma += (*m_counts)[i] * center * center;
34 VarType mean = total / total_count;
35 sigma = sigma / total_count - mean * mean;
42 WeightType low_sum = 0., high_sum = 0.;
43 auto low_i = m_clip_left, high_i = m_clip_right;
44 while (low_i <= high_i) {
45 if (low_sum < high_sum) {
46 low_sum += (*m_counts)[low_i++];
48 high_sum += (*m_counts)[high_i--];
52 assert(low_sum + high_sum == total_count);
56 auto edges = m_binning.getBinEdges(high_i + 1);
57 auto bin_width = (edges.second - edges.first);
58 auto max_counts =
std::max((*m_counts)[low_i], (*m_counts)[high_i]);
59 median = edges.first + bin_width * (high_sum - low_sum) / (2.0 * max_counts);
61 median = m_binning.getBin(0);
107 m_clip_right = m_binning.getBinCount() - 1;
108 m_counts->resize(m_binning.getBinCount());
110 ssize_t nbins = m_counts->size();
113 for (; i != end; ++i, ++wi) {
114 auto bin = m_binning.getBinIndex(*i);
115 if (bin >= 0 && bin < nbins) {
116 (*m_counts)[bin] += *wi;