前言

前面介绍了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)+β∗C

    C:=\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^H

    transb: 同上

    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+β∗C

    C:=\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+β∗C

    C:=\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+β∗C

    C:=\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+β∗C

    C:=\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+β∗C

    C:=\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+β∗C

    C := \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∗B

    op(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学习——矩阵矩阵操作相关推荐

  1. MKL学习——矩阵向量操作

    前言 前面介绍的BLAS Level 1是向量-向量的操作,而这里的BLAS Level 2主要还是对矩阵-向量之间的操作.命名规则与前面的一样,主要记住定义的是数据类型 s 实数域,单精度 c 复数 ...

  2. R语言基础学习:矩阵及矩阵的基础操作

    R语言的矩阵在数据操作的工作中十分的方便,也十分实用,给批量操作提供了简便的工具: 以下是整理的上课笔记: #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  3. 线性代数 --- 如何用行置换矩阵(P)和列置换矩阵(Q)对矩阵进行操作?

    在前面,我曾经写过一篇个人的学习笔记,叫<如何用行向量和列向量对矩阵进行操作> 线性代数 --- 如何用行向量和列向量对矩阵进行操作?(个人笔记扫描版)_松下J27的博客-CSDN博客_矩 ...

  4. c++矩阵类_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  5. MKL学习——向量操作

    前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一 ...

  6. c++ 二维矩阵 转vector_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  7. python 矩阵除法_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  8. Python之数据分析(Numpy的矩阵相关操作、ufunc泛化函数对象)

    文章目录 一.矩阵相关操作 二.ufunc统一泛化函数 一.矩阵相关操作 1.三种构造矩阵的方法 np.matrix(二维容器, copy=True) 一参为可被解释为矩阵的二维容器,比如二维数组.二 ...

  9. 【OpenCV】矩阵掩模操作

      矩阵掩模操作是指根据一个掩码矩阵(也称为内核kernel)重新计算图像中每个像素的值.掩码可以控制改变相邻像素和当前像素对新像素值的影响,从而产生新的图像像素.   本节通过图像锐化来比较图像指针 ...

最新文章

  1. 13 个mod_rewrite 应用举例
  2. 复杂的数据类型5 - C++快速入门11
  3. 回溯算法-----复原IP地址(Java版本)
  4. HDU 5988 最小费用流
  5. ASP.Net调试过程中弹出的浏览器端口和asp.net development server的端口不一样
  6. 中小企业CRM评测-八百客
  7. UWP开发细节记录:判断文件类型
  8. 升级步骤linux_开发人员福音,在win10系统上安装linux子系统
  9. 微信应该砍掉这些功能
  10. dock run mysql v3_Docker入门(三) - 搭建mysql
  11. 天正多条线段长度lisp下载_预习丨人教版六年级数学(上册)全册知识要点梳理,可下载...
  12. 希捷硬盘固件修复工具_希捷发布旗下首款PCIe 4.0固态盘酷玩520:东芝96层TLC、最高5GB/s...
  13. 使用XTU降低CPU功耗,自动执行不失效
  14. 将Imagenet2012比赛数据解析为图像
  15. DTCMS网站开发遇到的一些问题
  16. Excel数据导入___你hold住么(二)
  17. layui的lay-verify参数验证的问题
  18. iOS 真机调试 Bundle Identifier
  19. omap3530支持gpu模块
  20. ARGB与RGB、RGBA的区别

热门文章

  1. 模拟退火总结+洛谷模板题(P1337 [JSOI2004]平衡点 / 吊打XXX)
  2. pdfLaTeX和XeLaTeX
  3. android转web,Android 转 web app 笔记一:Touch事件
  4. python根据时间序列画折线图_Python:matplotlib 和 Seaborn 之折线图 (三十七)
  5. 操作系统进程管理实验java_计算机考研操作系统进程管理
  6. 【图像超分辨率】遥感数据的高斯金字塔尺度上推方法研究
  7. mysql 基于时间分区_MySQL基于时间字段进行分区的方案总结
  8. 疯子的算法总结14--ST算法(区间最值)
  9. 我用AI回怼美女汽车销售系列[yolo车牌识别](五) 完结
  10. 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)