文章目录
0 写在前面
因为向量是构建于块之上,请先理解块,参见:GSL 系列 5 — 向量和矩阵 1 — 块 (block)
如果没有特殊说明,本篇代码均来自头文件 gsl_vector_double.h
,即以下的类型,函数等都是基于double
的。对于其他数据类型的类型、函数等,都是与之类似。
1 向量 (vector)
向量
建构于块
之上,添加了对块
的切片
描述,向量切片
必须是内存空间中一组等间隔
的元素,不同的向量可以创建于一个块之上,定义如下:
typedef struct
{
size_t size; // 向量元素个数
size_t stride; // 相邻元素的物理空间步长
double *data; // 向量的指针,地址为向量的第一个元素
gsl_block *block; // 向量的数据基础快的指针
int owner; // 向量对块的所有权
}
gsl_vector;
上述注释中,向量对块的所有权是指,当向量对块有所有权 (owner=1
) 时,向量内存在释放时,块内存也会得到释放
2 向量内存分配和释放
gsl_vector *gsl_vector_alloc(const size_t n); // 分配一个长度为 n 的向量,无初始化
gsl_vector *gsl_vector_calloc(const size_t n); // 分配一个长度为 n 的向量,初始化为 0
// 根据块分配向量内存
gsl_vector *gsl_vector_alloc_from_block(gsl_block * b,
const size_t offset,
const size_t n,
const size_t stride);
// 根据向量分配向量内存
gsl_vector *gsl_vector_alloc_from_vector(gsl_vector * v,
const size_t offset,
const size_t n,
const size_t stride);
void gsl_vector_free(gsl_vector * v); // 向量内存释放
3 获取向量元素
包含一个向量元素设定函数
// HAVE_INLINE 定义时下列函数使用 内联
// 获取向量第 i 个元素
INLINE_DECL double gsl_vector_get(const gsl_vector * v, const size_t i);
// 设定向量第 i 个元素
INLINE_DECL void gsl_vector_set(gsl_vector