直方图
本章介绍创建直方图的功能。直方图提供了一种汇总一组数据分布的方便方法。直方图由一系列组构成,组对落入连续变量x的给定范围内的事件数进行计数。在GSL中,直方图的组包含浮点数,所以它们可以用来记录整数和非整数分布。组可以使用任意的范围集合(默认是均匀间隔的组)。支持一维直方图和二维直方图。
一旦直方图被创建,它也可以被转换成概率分布函数。本库提供了从概率分布中选择随机样本的有效例程。这对于基于真实数据生成模拟非常有用。
这些函数声明在头文件gsl_histogram.h和gsl_histogram2d.h中。
25.1 直方图结构体
直方图由下面的结构定义:
gsl_histogram
size_t n |
直方图组数量 |
double * range |
组的范围存储在一个由n+1个元素组成的数组中,这些元素由range指向。 |
double * bin |
每个组的计数存储在一个由bin指向的n个元素组成的数组中。组是浮点数,因此如果需要,可以通过非整数值增加它们。 |
bin[i]的范围是range[i]到range[i+1]。对于n个组,数组range中有n+1个条目。每个组包含下端,不包含上端。从数学上讲,这意味着这些组是由以下不等式定义的,
bin[i] 对应范围是range[i] ≤ x < range[i+1]
下面是x的数字行上的范围和组之间的对应关系图:
[ bin[0] )[ bin[1] )[ bin[2] )[ bin[3] )[ bin[4] ) ---|----------|----------|-----------|----------|----------|--- x r[0] r[1] r[2] r[3] r[4] r[5] |
在这张图片中,range数组的值用r。左边的每一本方括号[表示包容下界(r≤x),右边的圆括号)表示排除上界(x < r)。因此任何样本落在直方图的上端被排除在外。如果你想为最后一个组包含这个值,你需要在你的直方图中添加一个额外的组。
gsl_histogram结构体和它的相关函数都定义在头文件gsl_histogram.h中。
25.2 直方图内存分配
为直方图分配内存的函数遵循malloc()和free()的风格。此外,它们还执行自己的错误检查。如果没有足够的内存来分配直方图,那么函数除了返回一个空指针外,还会调用错误处理程序(错误号为GSL_ENOMEM)。因此,如果您使用库错误处理程序来中止程序,那么就没有必要检查每个直方图的alloc。
gsl_histogram * gsl_histogram_alloc(size_t n)
本函数为一个包含n个组的直方图分配内存,并返回一个指向新创建的gsl_histogram结构体的指针。如果可用内存不足,则返回一个空指针,并使用错误代码GSL_ENOMEM调用错误处理程序。箱子和范围没有初始化,应该使用下面的范围设置函数来准备,以便使直方图准备好使用。
int gsl_histogram_set_ranges(gsl_histogram * h, const double range[], size_t size)
本函数使用数组range的尺寸size设置已有直方图h的范围。直方图组的值被重置为零。range数组应该包含所需的组的限制。范围可以是任意的,但要受到单调递增的限制。
下面的示例展示了如何创建一个直方图,对数容器的范围为[1,10),[10,100)和[100,1000):
gsl_histogram * h = gsl_histogram_alloc (3); /* bin[0] covers the range 1 <= x < 10 */ /* bin[1] covers the range 10 <= x < 100 */ /* bin[2] covers the range 100 <= x < 1000 */ double range[4] = { 1.0, 10.0, 100.0, 1000.0 }; gsl_histogram_set_ranges (h, range, 4); |
注意,range数组的大小应该定义为比组的数量大一个元素。最后一个组的上限需要附加的元素。
int gsl_histogram_set_ranges_uniform(gsl_histogram * h, double xmin,
double xmax)
本函数将已有直方图h的范围设置为均匀覆盖xmin到xmax的范围。直方图组的值重置为零。组范围如下表所示,
bin[0] 对应 xmin ≤ x < xmin + d
bin[1] 对应 xmin + d ≤ x < xmin + 2d
... ... ...
bin[n-1] 对应 xmin +(n-1) d ≤ x < xmax
其中,d是组的间距,d=(xmax - xmin)/n
void gsl_histogram_free(gsl_histogram * h)
本函数释放与直方图h相关的所有内存。