写在前面
关于向量,矩阵的定义参考
若无特别说明,本篇代码均来自头文件 gsl_blas.h
概述
将基本的线代运算分为三个层次:
- 层次1,向量运算,比如 α x + y \alpha x+y αx+y
- 层次2,矩阵和向量的运算,比如 α A x + β y \alpha Ax+\beta y αAx+βy
- 层次3,矩阵和矩阵的运算,比如 α A B + C \alpha AB+C αAB+C
将如下矩阵类型做名字简单的名字标记:
名字标记 | 矩阵类型 | 名字标记 | 矩阵类型 |
---|---|---|---|
GE | 一般矩阵 | GB | 一般带矩阵 |
SY | 对称矩阵 | SB | 对称带矩阵 |
SP | 对称矩阵包 | HE | 共轭矩阵 |
HB | 共轭带矩阵 | HP | 共轭矩阵包 |
TR | 三角矩阵 | TB | 三角带矩阵 |
TP | 三角矩阵包 |
以下名字标记代表线代运算
名字标记 | 矩阵运算 |
---|---|
DOT | 标量乘 x T y x^Ty xTy |
AXPY | 向量加 α x + y \alpha x+y αx+y |
MV | 矩阵向量乘 A x Ax Ax |
SV | 矩阵向量求解 A − 1 b A^{-1}b A−1b |
MM | 矩阵矩阵乘 A A AA AA |
SM | 矩阵矩阵求解 A − 1 B A^{-1}B A−1B |
以下名字标记代表数据类型
名字标记 | 数据类型 |
---|---|
S | 单精度实数 |
D | 双精度实数 |
C | 单精度复数 |
Z | 双精度复数 |
层次 1 运算
α + x T y \alpha +x^Ty α+xTy
int gsl_blas_sdsdot (float alpha,
const gsl_vector_float * X,
const gsl_vector_float * Y,
float * result
);
x T y x^Ty xTy
int gsl_blas_dsdot (const gsl_vector_float * X,
const gsl_vector_float * Y,
double * result
);
int gsl_blas_sdot (const gsl_vector_float * X,
const gsl_vector_float * Y,
float * result
);
int gsl_blas_ddot (const gsl_vector * X,
const gsl_vector * Y,
double * 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 H y x^Hy xHy
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 ∥ 2 \|x\|_2 ∥x∥2
float gsl_blas_snrm2 (const gsl_vector_float * X);
double gsl_blas_dnrm2 (const gsl_vector * X);
float gsl_blas_scnrm2 (const gsl_vector_complex_float * X);
double gsl_blas_dznrm2 (const gsl_vector_complex * X);
∑ ∣ x i ∣ \sum|x_i| ∑∣xi∣
float gsl_blas_sasum (const gsl_vector_float * X);
double gsl_blas_dasum (const gsl_vector * X);
∑ ( ∣ ℜ ( x i ) ∣ + ∣ ℑ ( x i ) ∣ ) \sum\left(\left|\Re\left(x_{i}\right)\right|+\left|\Im\left(x_{i}\right)\right|\right) ∑(∣ℜ(xi)∣+∣ℑ(xi)∣)
float gsl_blas_scasum (const gsl_vector_complex_float * X);
double gsl_blas_dzasum (const gsl_vector_complex * X);
max i ∣ x i ∣ \max_i|x_i| maxi∣xi∣
CBLAS_INDEX_t gsl_blas_isamax (const gsl_vector_float * X);
CBLAS_INDEX_t gsl_blas_idamax (const gsl_vector * X);
// gsl_blas_types.h
typedef CBLAS_INDEX CBLAS_INDEX_t;
// gsl_cblas.h
#define CBLAS_INDEX size_t
max i ( ∣ ℜ ( x i ) ∣ + ∣ ℑ ( x i ) ∣ ) \max_i(\left|\Re\left(x_{i}\right)\right|+\left|\Im\left(x_{i}\right)\right|) maxi(∣ℜ(xi)∣+∣ℑ(xi)∣)
CBLAS_INDEX_t gsl_blas_