gsl数据类型之向量

    gsl中的向量与矩阵是基于一种底层的数据类型,即数据块(block)实现的。因此我们的分析,就从数据块开始。

    与复数一样,gsl中也有各种不同数据类型的数据块,详细列表如下:

gsl_blockdouble
gsl_block_floatfloat
gsl_block_long_doublelong double
gsl_block_intint
gsl_block_uintunsigned int
gsl_block_longlong
gsl_block_ulongunsigned long
gsl_block_shortshort
gsl_block_ushortunsigned short
gsl_block_charchar
gsl_block_ucharunsigned char
gsl_block_complexcomplex double
gsl_block_complex_floatcomplex float
gsl_block_complex_long_doublecomplex long double

    与上一节的分析一样,我们将着眼于double类型对应的gsl_block类型展开分析。

    让我们来看看gsl_block的庐山真面目:


      可见数据块本质上仍然是一个结构体。其中size_t在32位机上实际上就是unsigned int,在这里gsl_block->size表示该数据块中存储的双精度数的个数。而gsl_block->data则指向一块size*sizeof(double)大小的连续内存,这块内存就是数据块的主体。

      类似于c语言中动态内存管理,为了创建与销毁这样的数据块,gsl提供了三个函数:

      正如你所预料的,这里的内存分配函数只是对c语言中malloc函数的简单封装,只不过其中包含了一些异常处理的判断语句。

 

      而gsl中向量与矩阵构建在数据块的基础上。因此与数据块一样,也有与前文列表中各种数据类型相对应的各种向量与矩阵。

      向量相关的结构体与函数的标识符以gsl_vector打头,后缀规则与数据块完全一样。这里仍以double型的gsl_vector为例进行分析,它的定义如下:

      值得注意的是,不同的向量可以指向相同的一块数据块。因此结构体里需要一个所有者标识符。如果owner=1,则表示block归该向量所有,当向量内存被释放时,该block也将被释放;而owner=0时,则表示所有者为其他向量block,因此在本向量被释放时,该block不会被释放。
      由于考虑到block复用的问题,gsl一共提供了5个关于向量内存管理的函数:

      其中gsl_vector_alloc、gsl_vector_calloc的功能与gsl_block_alloc、gsl_block_calloc的功能完全类似,调用这两个函数在创建新的向量同时也将创建新的block。而gsl_vector_alloc_from_block与gsl_vector_alloc_from_vector则将从已经存在的block创建新的向量。

      比较一下alloc与alloc_from_block的源代码,便容易明白两者的区别:

 

 

代码中涉及到了一些宏,对于gsl_vector,这些宏的代码如下:

 

注意,其中FUNCTION(dir,name)宏将产生字符串dir_name。

      从源码中我们容易看出调用gsl_vector_alloc_from_block与gsl_vector_alloc_from_vector并重用block中的数据时,允许设置新向量第一个元素的起始地址、元素大小与元素个数。使用非常灵活。

      gsl中包含一些操作向量元素的函数,经常用到的有以下几个:

 

      gsl中还提供了一种vector views的数据结构以便更灵活的描述向量。实际上这种神秘的view就是gsl_vector的一个简单封装:

 

 

      基于vector views,gsl实现了从向量中提取子向量的一系列函数,其中最简单的版本是 

gsl_vector_view gsl_vector_subvector (gsl_vector * v, size_t offset, size_t n)。

我们可以利用该函数从v向量中的第offset+1个元素开始提取n个元素构建一个新的子向量。这一功能可以从它的源码中看出来:

其中宏的定义如下:

 

可见由该函数创建的新向量只是对原始向量的一种引用,两者共享一块block。对新向量中数据的改变会同步的体现在原始向量中——这正是gsl中vector views数据结构的含义:它只是对原有数据的一种动态的重新描述。

      除此之外,gsl还用一系列丰富的操作向量的函数,更详细的信息可以参见

http://www.gnu.org/software/gsl/manual/html_node/Vectors.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值