前言
回顾一下BLAS Level 1 2 3中的运算都有什么类型
BLAS Level 1
在BLAS Level 1中,进行的是向量-向量的操作。其中相关概念有
- 向量类型: 实数域,复数域,共轭
- 运算操作: 元素求和,向量相加,向量拷贝,点乘,二范数(欧几里得范数),向量绕点旋转,Givens旋转,改进Givens旋转,计算Givens旋转参数,标量与向量的乘积,向量交换,查找最大最小值,复数域向量的绝对值
BLAS Level 2
在BLAS Level 2中,进行的是矩阵-向量的操作。其中相关概念有
- 矩阵类型: 一般带状矩阵,一般矩阵,Hermitian带状矩阵,Hermitian矩阵,Hermitian压缩矩阵,对称带状矩阵,对称压缩矩阵,对称矩阵,三角带状矩阵,三角压缩矩阵,三角矩阵
- 运算操作: 矩阵-向量乘积,一阶更新,二阶更新,解线性方程组
BLAS Level 3
在BLAS Level 3中,进行的是矩阵-矩阵的操作。其中相关概念有
- 矩阵类型:一般矩阵,Hermitian矩阵,对称矩阵,三角矩阵
- 运算操作: 矩阵乘法,k阶更新,2k阶更新, 解方程
向量矩阵类型学习
向量
实数域
x=[1 , 2 , 3.1 , 4]
元素为实数的就叫实数域上的向量复数域
x=[−i,−2i,−3i,−4i]x=[4−i , 3−2i , 2−3i , 1−4i]
元素为复数的就叫复数域上的向量,第一个向量的实部为0,第二个向量的实部非0共轭向量
当两个复数的实部相等,虚部互为相反数时,这两个复数叫做互为共轭复数,实数的共轭复数就是本身
矩阵
一般矩阵
A=⎡⎣⎢a11a21a31a12a22a32a13a23a33⎤⎦⎥带状矩阵
如果矩阵A=aij是一个n∗n的矩阵,假设在对角边界带状区域之外的所有元素都是0,其中边界范围由常数k1和k2决定,那么就有
当j<(i−k1)或者j>(i+k2)的时候有aij=0
这里面的k1称为下带宽(lower bandwidth
),k2称为上带宽(upper bandwidth
)
A=⎡⎣⎢a1100a12a2200a23a33⎤⎦⎥三角带状矩阵
当带状矩阵的k1=k2=1的时候,就是三角带状矩阵了
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢B11B210⋮⋮0B12B22B32⋱⋱⋯0B23B33B43⋱⋯⋯⋱B34B44B540⋯⋱⋱B45B55B650⋮⋮0B56B66⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
Hermitian矩阵
Hermitian矩阵(也称为
self-adjoint
矩阵),是一个复数方阵,与它自己的共轭转置是相等的;也就是说第i
行第j
列的元素等于它的共轭转置矩阵的第j
行第i
列,对于所有的索引i,j
都有
aij=aji¯¯¯¯A=AH¯¯¯¯¯
一个实例就是
A=⎡⎣⎢22−i42+i3−i4i1⎤⎦⎥三角矩阵
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢a11a21a31⋮an1a22a32⋮an2⋱⋱⋯⋱an,n−10an,n⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
称为下三角矩阵(lower triangular matrix
)或者左三角矩阵(left triangular matrix
)。同理还有上三角矩阵就不说了。对称矩阵
对称矩阵就是一个转置等于它自身的一个方阵
A=AT
例如
A=⎡⎣⎢17374−53−56⎤⎦⎥压缩存储
在
Cblas
中提供了很多压缩存储,但是目前还没分析透彻,有兴趣可以看看英文文档,其中提供了各种转换压缩存储的主程序。主要包含的压缩存储有:- 带状压缩存储
- 按列存储时候Hermitian矩阵的上三角带状存储;按行存储时候Hermitian矩阵的下三角带状存储
- 对称矩阵的上三角压缩存储;对称矩阵的下三角压缩存储
- 按列存储时候上三角带状矩阵或者下三角带状矩阵的压缩存储;按行存储的时候上三角带状矩阵或者下三角带状矩阵的压缩存储
向量矩阵操作学习
向量-向量
Givens旋转
直接从维基百科上搬过来:
== 矩阵表示 ==
吉文斯旋转表示为如下形式的[[矩阵]]
G(i,j,θ)=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1⋮0⋮0⋮0⋯⋱⋯⋯⋯0⋮c⋮s⋮0⋯⋯⋱⋯⋯0⋮−s⋮c⋮0⋯⋯⋯⋱⋯0⋮0⋮0⋮1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
这里的 c= cos(θ) 和 s = sin(θ) 出现在第 ”i” 行和第 ”j” 行与第 ”i” 列和第 ”j” 列的交叉点上。就是说,吉文斯旋转矩阵的所有非零元定义如下:
gkkgiigjjgijgji=1fork≠i,j=c=c=−s=s乘积 G(i, j, θ)∗x 表示向量 x在
(i,j) 平面中的逆时针旋转 θ 弧度。Givens 旋转在数值线性代数中主要的用途是在向量或矩阵中介入零。例如,这种效果可用于计算矩阵的 QR分解。超过Householder变换的一个好处是它们可以轻易的并行化,另一个好处是对于非常稀疏的矩阵计算量更小。
== 稳定计算 ==
当一个吉文斯旋转矩阵 G(i,j,θ)从左侧乘另一个矩阵 A的时候,GA 只作用于A的第i 和 j 行。所以我们集中于下列问题。给出a 和 b,找到c=cos(θ) 和 s=sin(θ) 使得
[cs−sc][ab]=[r0]
明确计算出 θ 是没有必要的。我们转而直接获取 ”c”, ”s” 和 ”r”。一个明显的解是
rcs=a2+b2−−−−−−√=a/r=−b/r
矩阵-向量
Hermitian矩阵或者其压缩存储形式
- 一阶更新
A:=α∗x∗conjg(x′)+A其中x是一个
n 维向量- 二阶更新
A:=α∗x∗conjg(y′)+conjg(α)∗y∗conjg(x′)+A其中x,y都是n向量
对称矩阵或者其压缩存储形式
- 一阶更新
a:=α∗x∗x′+A 其中x为
n 维矩阵- 二阶更新
A:=α∗x∗y′+α∗y∗x′+A
其中x,y都是n维矩阵
矩阵-矩阵
Hermitian矩阵
k阶更新
C:=α∗A∗AH+β∗C
其中A是n∗k 维矩阵,C是n∗n 的Hermitian矩阵2k阶更新
C:=α∗A∗BH+conjg(α)∗B∗AH+β∗C,
其中A,B都是n∗k的矩阵,C是n∗n 的Hermitian矩阵
对称矩阵
- k阶更新
C:=α∗A∗A′+β∗C 其中A是
n∗k 的矩阵,C是n∗n 的矩阵- 2k阶更新
C:=α∗A∗B′+α∗B∗A′+β∗C
其中A,B都是n∗k的矩阵,C是n∗n 的矩阵
后续
目前感觉也就这么多内容了。关于后面的稀疏矩阵计算相关内容,等用到了再学习。后面着重实现以下最基本的全矩阵(full matrix
)运算,也就是说不考虑矩阵是对称的、Hermitian的或者带状什么的。主要包含向量-向量、矩阵-向量、矩阵-矩阵的乘法关系。