我正在寻找一种以对数方式存储某些数据集的技术。我们的数据值范围从 _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时,容器的大小或多或少相同,我们得到的方法太多了。
答案 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);