MKL学习——矩阵矩阵操作
前言
前面介绍了BLAS Level 1中向量-向量操作,以及BLAS Level 2中矩阵-向量的操作,就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后,就进行常用参数分析,以及实现了。
所有函数概览
函数名称 | 缺失部分 | 描述 |
---|---|---|
cblas_?gemm | s,d,c,z | 一般矩阵的矩阵-矩阵乘法 |
cblas_?hemm | c,z | 某个输入矩阵是Hermitian,然后计算矩阵-矩阵乘法 |
cblas_?herk | c,z | Hermitian的k阶更新 |
cblas_?herk2 | c,z | Hermitian的2k阶更新 |
cblas_?symm | s,d,c,z | 某个输入矩阵是对称的,然后计算矩阵-矩阵乘法 |
cblas_?syrk | s,d,c,z | 对称矩阵的k阶更新 |
cblas_?syr2k | s,d,c,z | 对称矩阵的2k阶更新 |
cblas_?trmm | s,d,c,z | 某个输入矩阵是三角的,就是你矩阵-矩阵的乘法 |
cblas_?trsm | s,d,c,z | 解三角矩阵方程 |
矩阵运算
cblas_?gemm
作用 : 一般矩阵的矩阵-矩阵乘法
定义函数
void cblas_sgemm (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const float alpha, const float *a, const MKL_INT lda, const float *b, const MKL_INT ldb, const float beta, float *c, const MKL_INT ldc);void cblas_dgemm (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const double alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);void cblas_cgemm (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zgemm (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);
运算
C:=α∗op(A)∗op(B)+β∗CC:=\alpha*op(A)*op(B)+\beta*C
其中op(x)op(x)可以是op(x)=xop(x)=x或者op(x)=xTop(x)=x^T或者op(x)=XHop(x)=X^Hα\alpha和β\beta是标量
A,B,CA,B,C是矩阵: op(A)op(A)是一个m∗km*k的矩阵,op(B)op(B)是k∗nk*n的矩阵,C是一个m∗nm*n的矩阵
输入参数
Layout
: 指定矩阵是行优先(CblasRowMajor
)还是列优先(CblasColMajor
)transa
: 指定对矩阵的操作op(A)op(A),如果transa=CblasNoTrans
那么op(A)=Aop(A)=A;如果transa=CblasTrans
那么op(A)=ATop(A)=A^T;如果transa=CblasConjTrans
那么op(A)=AHop(A)=A^Htransb
: 同上m
: 矩阵op(A)op(A)和CC的行数n
: 矩阵op(B)op(B)和C的列数k
: 矩阵op(A)op(A)和op(B)op(B)的列数alpha
: 标量a
:
transa=CblasNoTrans | transa=CblasTrans或者transa=CblasConjTrans |
---|---|
Layout=CblasColMajor | 矩阵大小lda∗klda*k |
Layout=CblasRowMajor | 矩阵大小lda∗mlda*m |
lda
: 引导维度
transa=CblasNoTrans | transa=CblasTrans或者transa=CblasConjTrans |
---|---|
Layout=CblasColMajor | ldalda至少为max(1,m)max(1,m) |
Layout=CblasRowMajor | ldalda至少为max(1,k)max(1,k) |
b
:
transa=CblasNoTrans | transa=CblasTrans或者transa=CblasConjTrans |
---|---|
Layout=CblasColMajor | 矩阵大小ldb∗nldb*n |
Layout=CblasRowMajor | 矩阵大小ldb∗kldb*k |
ldb
:
transa=CblasNoTrans | transa=CblasTrans或者transa=CblasConjTrans |
---|---|
Layout=CblasColMajor | ldbldb至少为max(1,k)max(1,k) |
Layout=CblasRowMajor | ldbldb至少为max(1,n)max(1,n) |
beta
: 标量
c
: 当Layout=CblasColMajor
时候,数组大小为lda∗nlda*n;当Layout=CblasRowMajor
时候,数组大小为lda∗mlda*m
ldc
:当Layout=CblasColMajor
的时候,ldc
必须至少为max(1,m)max(1,m);当Layout=CblasRowMajor
的时候,ldc
必须至少为max(1,n)max(1,n)
- 输出参数: 将计算得到的矩阵写入到
c
cblas_?hemm
作用 : 当一个输入矩阵为Hermitian时,计算矩阵-矩阵的乘法
定义函数
void cblas_chemm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zhemm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);
运算
C:=α∗A∗B+β∗CC:=α∗B∗A+β∗CC:=\alpha*A*B+\beta*C\\C:=\alpha*B*A+\beta *C
其中,α,β\alpha,\beta是标量,AA是Hermitian矩阵,B,CB,C是m∗nm*n的矩阵
cblas_?herk
作用: Hermitian的k阶更新
定义函数:
void cblas_cherk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const void *a, const MKL_INT lda, const float beta, void *c, const MKL_INT ldc);void cblas_zherk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const void *a, const MKL_INT lda, const double beta, void *c, const MKL_INT ldc);
运算
C:=α∗A∗AH+β∗CC:=α∗AH∗A+β∗CC:=\alpha*A*A^H+\beta*C\\C:=\alpha*A^H*A+\beta*C
其中,α,β\alpha,\beta是标量,CC是n∗nn*n的Hermitian矩阵,第一个式子的AA是n∗kn*k矩阵,第二个式子的AA是k∗nk*n的矩阵
cblas_?herk2
作用: Hermitian矩阵的2阶更新
定义函数
void cblas_cher2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const float beta, void *c, const MKL_INT ldc);void cblas_zher2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const double beta, void *c, const MKL_INT ldc);
运算
C:=α∗A∗BH+conjg(α)∗B∗AH+β∗CC:=α∗AH∗B+conjg(α)∗BH∗A+β∗CC:=\alpha*A*B^H+conjg(\alpha)*B*A^H+\beta*C\\C:=\alpha*A^H*B+conjg(\alpha)*B^H*A+\beta*C
其中,α,β\alpha,\beta是标量,CC是n∗nn*n是Hermitian矩阵,第一个式子中A,BA,B是n∗kn*k矩阵,第二个式子中是k∗nk*n的矩阵
cblas_?symm
作用: 某个输入是对称矩阵时候,计算矩阵-矩阵的乘法
定义函数
void cblas_ssymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, const float *b, const MKL_INT ldb, const float beta, float *c, const MKL_INT ldc);void cblas_dsymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);void cblas_csymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zsymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);
运算
C:=α∗A∗b+β∗CC:=α∗B∗A+β∗CC:=\alpha*A*b+\beta*C\\C:=\alpha*B*A+\beta*C
其中α,β\alpha,\beta是标量,AA是对称阵,B,CB,C是m∗nm*n的矩阵
cblas_?syrk
作用: 对称矩阵的k阶更新
定义函数
void cblas_ssyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const float *a, const MKL_INT lda, const float beta, float *c, const MKL_INT ldc);void cblas_dsyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const double *a, const MKL_INT lda, const double beta, double *c, const MKL_INT ldc);void cblas_csyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *beta, void *c, const MKL_INT ldc);void cblas_zsyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *beta, void *c, const MKL_INT ldc)
运算
C:=α∗A∗A′+β∗CC:=α∗A′∗A+β∗CC:=\alpha*A*A’+\beta*C\\C:=\alpha*A'*A+\beta*C
其中,α,β\alpha,\beta是标量,CC是n∗nn*n的对称阵,第一个式子中AA是n∗nn*n的矩阵,第二个式子中AA是k∗nk*n的矩阵
cblas_?syr2k
作用: 对称阵的二阶更新
定义函数
void cblas_ssyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const float *a, const MKL_INT lda, const float *b, const MKL_INT ldb, const float beta, float *c, const MKL_INT ldc);void cblas_dsyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);void cblas_csyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zsyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);
运算
C:=α∗A∗B′+α∗B∗A′+β∗CC:=α∗A′∗B+α∗B′∗A+β∗CC := \alpha*A*B' + \alpha*B*A' + \beta*C\\C := \alpha*A'*B + \alpha*B'*A + \beta*C
其中,α,β\alpha,\beta是标量,CC是n∗nn*n的对称阵,第一个式子中A,BA,B是n∗kn*k的矩阵,第二个式子中A,BA,B是k∗nk*n的矩阵
cblas_?trmm
作用: 某个输入矩阵为三角阵的时候,计算矩阵-矩阵的乘法
定义函数
void cblas_strmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, float *b, const MKL_INT ldb);void cblas_dtrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, double *b, const MKL_INT ldb);void cblas_ctrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);void cblas_ztrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);
运算
B:=α∗op(A)∗BB:=α∗B∗op(A)B := \alpha*op(A)*B\\B := \alpha*B*op(A)
其中,α\alpha是标量,BB是m∗nm*n的矩阵,op(A)=Aop(A)=A或者op(A)=A′op(A)=A'或者op(A)=conjg(A′)op(A)=conjg(A')
cblas_?trsm
作用: 解三角矩阵方程
定义函数
void cblas_strsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, float *b, const MKL_INT ldb);void cblas_dtrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, double *b, const MKL_INT ldb);void cblas_ctrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);void cblas_ztrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);
运算
op(A)∗X=α∗BX∗op(A)=alpha∗Bop(A)*X = \alpha*B\\X*op(A) = alpha*B
其中,α\alpha是一个标量,X和BX和B是一个m∗nm*n的矩阵,AA是单位或者非单位,上三角或者下三角矩阵,op(A)=Aop(A)=A或者op(A)=A′op(A)=A'或者op(A)=conjg(A′)op(A)=conjg(A’)。把等式的解矩阵XX冲写入到BB矩阵中。
后续
研究BLAS Level 1 2 3中各种矩阵相关概念。随后是代码实现
MKL学习——矩阵矩阵操作相关推荐
- MKL学习——矩阵向量操作
前言 前面介绍的BLAS Level 1是向量-向量的操作,而这里的BLAS Level 2主要还是对矩阵-向量之间的操作.命名规则与前面的一样,主要记住定义的是数据类型 s 实数域,单精度 c 复数 ...
- R语言基础学习:矩阵及矩阵的基础操作
R语言的矩阵在数据操作的工作中十分的方便,也十分实用,给批量操作提供了简便的工具: 以下是整理的上课笔记: #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- 线性代数 --- 如何用行置换矩阵(P)和列置换矩阵(Q)对矩阵进行操作?
在前面,我曾经写过一篇个人的学习笔记,叫<如何用行向量和列向量对矩阵进行操作> 线性代数 --- 如何用行向量和列向量对矩阵进行操作?(个人笔记扫描版)_松下J27的博客-CSDN博客_矩 ...
- c++矩阵类_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...
当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...
- MKL学习——向量操作
前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一 ...
- c++ 二维矩阵 转vector_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...
当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...
- python 矩阵除法_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...
当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...
- Python之数据分析(Numpy的矩阵相关操作、ufunc泛化函数对象)
文章目录 一.矩阵相关操作 二.ufunc统一泛化函数 一.矩阵相关操作 1.三种构造矩阵的方法 np.matrix(二维容器, copy=True) 一参为可被解释为矩阵的二维容器,比如二维数组.二 ...
- 【OpenCV】矩阵掩模操作
矩阵掩模操作是指根据一个掩码矩阵(也称为内核kernel)重新计算图像中每个像素的值.掩码可以控制改变相邻像素和当前像素对新像素值的影响,从而产生新的图像像素. 本节通过图像锐化来比较图像指针 ...
最新文章
- 13 个mod_rewrite 应用举例
- 复杂的数据类型5 - C++快速入门11
- 回溯算法-----复原IP地址(Java版本)
- HDU 5988 最小费用流
- ASP.Net调试过程中弹出的浏览器端口和asp.net development server的端口不一样
- 中小企业CRM评测-八百客
- UWP开发细节记录:判断文件类型
- 升级步骤linux_开发人员福音,在win10系统上安装linux子系统
- 微信应该砍掉这些功能
- dock run mysql v3_Docker入门(三) - 搭建mysql
- 天正多条线段长度lisp下载_预习丨人教版六年级数学(上册)全册知识要点梳理,可下载...
- 希捷硬盘固件修复工具_希捷发布旗下首款PCIe 4.0固态盘酷玩520:东芝96层TLC、最高5GB/s...
- 使用XTU降低CPU功耗,自动执行不失效
- 将Imagenet2012比赛数据解析为图像
- DTCMS网站开发遇到的一些问题
- Excel数据导入___你hold住么(二)
- layui的lay-verify参数验证的问题
- iOS 真机调试 Bundle Identifier
- omap3530支持gpu模块
- ARGB与RGB、RGBA的区别
热门文章
- 模拟退火总结+洛谷模板题(P1337 [JSOI2004]平衡点 / 吊打XXX)
- pdfLaTeX和XeLaTeX
- android转web,Android 转 web app 笔记一:Touch事件
- python根据时间序列画折线图_Python:matplotlib 和 Seaborn 之折线图 (三十七)
- 操作系统进程管理实验java_计算机考研操作系统进程管理
- 【图像超分辨率】遥感数据的高斯金字塔尺度上推方法研究
- mysql 基于时间分区_MySQL基于时间字段进行分区的方案总结
- 疯子的算法总结14--ST算法(区间最值)
- 我用AI回怼美女汽车销售系列[yolo车牌识别](五) 完结
- 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)