GSL中的直方图

直方图

    本章介绍创建直方图的功能。直方图提供了一种汇总一组数据分布的方便方法。直方图由一系列组构成,组对落入连续变量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]   对应       xminx < 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相关的所有内存。

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/120583289