BLAS支持
基本线性代数子程序(BLAS)定义了一套向量和矩阵的基本操作,可以用来创建优化的高级线性代数函数。
本库提供了低层级直接对应于C语言的BLAS标准,这里称作“CBLAS”,也有高级接口可对GSL向量和矩阵进行操作。对使用GSL向量和矩阵对象进行简单操作感兴趣的用户可以使用本章介绍的高层级接口。函数声明在gsl_blas.h中,能满足大部分用户的需要。
注意,GSL矩阵是用密集存储实现的,因此接口包括相应的密集存储BLAS函数。通过低层级CLBAS接口可以使用全部BLAS功能,包括带格式和压缩格式矩阵。类似的,GSL向量仅限于正步长,而低级的CBLAS接口支持BLAS标准1中指定的负步长。
对于gsl_cblas层接口声明在文件gsl_cblas.h中。此接口对应于BLAS技术论坛的C接口到遗留BLAS实现的标准。有权访问其他符合CLBAS实现的用户可以使用这些来代替本库提供的版本。注意,对于使用Fortran BLAS库的用户可以使用CBLAS一致包,把它转化到CBLAS库。传统的Fortran实现的参考CBLAS包,存在于CBLAS标准的一部分,并且可以从Netlib获得。完整的CBLAS函数在附录中列出。
这里列出三级的BLAS操作。
Level1 | 向量操作,例如,y=αx+y |
Level2 | 矩阵-向量操作,例如y=αAx+βy |
Level3 | 矩阵-矩阵操作,例如C=αAB+C |
每个函数都有一个名称,用于指定操作、所涉及的矩阵类型及其精度。一些最常见的操作和它们的名字如下所示,
DOT | 标量积,xTy |
AXPY | 向量和,αx+y |
MV | 矩阵-向量积,Ax |
SV | 矩阵-向量解,inv(A)x |
MM | 矩阵-矩阵乘积,AB |
SM | 矩阵-矩阵解,inv(A)B |
矩阵的类型有,
GE | 一般 |
GB | 一般带状矩阵 |
SY | 对称 |
SB | 对称带状矩阵 |
SP | 对称压缩矩阵 |
HE | 厄密特共轭 |
HB | 厄密特共轭带状矩阵 |
HP | 厄密特共轭压缩矩阵 |
TR | 三角 |
TB | 三角带状 |
TP | 三角压缩 |
每个操作定义了四个精度
S | 单精度实数 |
D | 双精度实数 |
C | 单精度复数 |
Z | 双精度复数 |
例如,SGEMM表示“单精度一般矩阵-矩阵乘法”,ZGEMM表示“双精度复杂矩阵-矩阵乘法”。
请注意,BLAS函数的向量和矩阵参数不能别名化,因为当底层数组重叠(数组的别名化)时,结果是未定义的。
13.1 GSL BLAS接口
基于相关的内置类型,GSL提供密集的向量和矩阵对象。本库提供了应用于这些对象的BLAS操作的接口。这些功能的接口在文件gsl_blas.h中给出。
13.1.1 Level 1
int gsl_blas_sdsdot(float alpha, const gsl_vector_float * x, const gsl_vector_float * y,
float * result)
本函数计算α+xTy的和,其中x和y为向量,返回的结果在result中。
int gsl_blas_sdot(const gsl_vector_float * x, const gsl_vector_float * y, float * result)
int gsl_blas_dsdot(const gsl_vector_float * x, const gsl_vector_float * y,
double * result)
int gsl_blas_ddot(const gsl_vector * x, const gsl_vector * y, double * result)
这些函数计算向量x和y的标量积xTy,并在result中返回结果
int gsl_blas_cdotu(const gsl_vector_complex_float * x,
const gsl_vector_complex_float * y, gsl_complex_float * dotu)
int gsl_blas_zdotu(const gsl_vector_complex * x, const gsl_vector_complex * y,
gsl_complex * dotu)
这两个函数计算向量x和y的复标量积xTy,返回结果在dotu中。
int gsl_blas_cdotc(const gsl_vector_complex_float * x,
const gsl_vector_complex_float * y, gsl_complex_float * dotc)
int gsl_blas_zdotc(const gsl_vector_complex * x, const gsl_vector_complex * y,
gsl_complex * dotc)
这两个函数计算向量x和y的共轭标量积xHy,返回结果在dotc中。