如何在直方图上进行对数合并?

时间:2015-09-23 17:54:48

标签: c++ histogram logarithm binning

我正在寻找一种以对数方式存储某些数据集的技术。我们的数据值范围从 _min _max (浮点数> = 0),用户需要能够指定不同数量的二进制数< em> _num_bins (某些int n)。

我已经实施了从this question获取的解决方案以及有关扩展here的一些帮助,但是当我的数据值低于1.0时,我的解决方案停止工作。

class Histogram {
double _min, _max;
int _num_bins;
......
};

double Histogram::logarithmicValueOfBin(double in) const {
    if (in == 0.0)
        return _min;

    double b = std::log(_max / _min) / (_max - _min);
    double a = _max / std::exp(b * _max);

    double in_unscaled = in * (_max - _min) / _num_bins + _min;
    return a * std::exp(b * in_unscaled) ;
}

当数据值都大于1时,我得到尺寸合适的箱子并且可以正确绘图。当值小于1时,容器的大小或多或少相同,我们得到的方法太多了。

2 个答案:

答案 0 :(得分:0)

我通过重新实现opensource version of Matlab's logspace function找到了解决方案。

给定范围和数量的箱,您需要创建均匀间隔的数字序列

module.exports = function linspace(a,b,n) {
  var every = (b-a)/(n-1),
      ranged = integers(a,b,every);

  return ranged.length == n ? ranged : ranged.concat(b);
}

之后你需要循环遍历每个值,并且你的基数(e,2或10最有可能)存储电源,你就可以得到你的bin范围。

module.exports.logspace = function logspace(a,b,n) {
  return linspace(a,b,n).map(function(x) { return Math.pow(10,x); });
}

我用C ++重写了它,它能够支持范围&gt; 0

答案 1 :(得分:0)

您可以执行以下操作

// Create isolethargic binning
    int     T_MIN   = 0;                    //The lower limit i.e. 1.e0
    int     T_MAX   = 8;                    //The uper limit   i.e. 1.e8
    int     ndec    = T_MAX - T_MIN;        //Number of decades
    int     N_BPDEC = 1000;                 //Number of bins per decade
    int     nbins   = (int) ndec*N_BPDEC;   //Total number of bins
    double  step    = (double) ndec / nbins;//The increment 
    double  tbins[nbins+1];                 //The array to store the bins

    for(int i=0; i <= nbins; ++i)
        tbins[i] = (float) pow(10., step * (double) i + T_MIN);