MKL学习——矩阵矩阵操作

前言

前面介绍了BLAS Level 1中向量-向量操作,以及BLAS Level 2中矩阵-向量的操作,就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后,就进行常用参数分析,以及实现了。

所有函数概览

函数名称缺失部分描述
cblas_?gemms,d,c,z一般矩阵的矩阵-矩阵乘法
cblas_?hemmc,z某个输入矩阵是Hermitian,然后计算矩阵-矩阵乘法
cblas_?herkc,zHermitian的k阶更新
cblas_?herk2c,zHermitian的2k阶更新
cblas_?symms,d,c,z某个输入矩阵是对称的,然后计算矩阵-矩阵乘法
cblas_?syrks,d,c,z对称矩阵的k阶更新
cblas_?syr2ks,d,c,z对称矩阵的2k阶更新
cblas_?trmms,d,c,z某个输入矩阵是三角的,就是你矩阵-矩阵的乘法
cblas_?trsms,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

    其中op(x)可以是op(x)=x或者op(x)=xT或者op(x)=XH

    αβ是标量

    A,B,C是矩阵: op(A)是一个mk的矩阵,op(B)kn的矩阵,C是一个mn的矩阵

  • 输入参数

    Layout: 指定矩阵是行优先(CblasRowMajor)还是列优先(CblasColMajor)

    transa: 指定对矩阵的操作op(A),如果transa=CblasNoTrans那么op(A)=A;如果transa=CblasTrans那么op(A)=AT;如果transa=CblasConjTrans那么op(A)=AH

    transb: 同上

    m: 矩阵op(A)C的行数

    n: 矩阵op(B)和C的列数

    k: 矩阵op(A)op(B)的列数

    alpha: 标量

    a:

transa=CblasNoTranstransa=CblasTrans或者transa=CblasConjTrans
Layout=CblasColMajor矩阵大小ldak
Layout=CblasRowMajor矩阵大小ldam

lda : 引导维度

transa=CblasNoTranstransa=CblasTrans或者transa=CblasConjTrans
Layout=CblasColMajorlda至少为max(1,m)
Layout=CblasRowMajorlda至少为max(1,k)

b:

transa=CblasNoTranstransa=CblasTrans或者transa=CblasConjTrans
Layout=CblasColMajor矩阵大小ldbn
Layout=CblasRowMajor矩阵大小ldbk

ldb:

transa=CblasNoTranstransa=CblasTrans或者transa=CblasConjTrans
Layout=CblasColMajorldb至少为max(1,k)
Layout=CblasRowMajorldb至少为max(1,n)

beta: 标量

c: 当Layout=CblasColMajor时候,数组大小为ldan;当Layout=CblasRowMajor时候,数组大小为ldam

ldc:当Layout=CblasColMajor的时候,ldc必须至少为max(1,m);当Layout=CblasRowMajor的时候,ldc必须至少为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:=αAB+βCC:=αBA+βC

    其中,α,β是标量,A是Hermitian矩阵,B,Cmn的矩阵

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:=αAAH+βCC:=αAHA+βC

    其中,α,β是标量,Cnn的Hermitian矩阵,第一个式子的Ank矩阵,第二个式子的Akn的矩阵

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:=αABH+conjg(α)BAH+βCC:=αAHB+conjg(α)BHA+βC

    其中,α,β是标量,Cnn是Hermitian矩阵,第一个式子中A,Bnk矩阵,第二个式子中是kn的矩阵

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:=αAb+βCC:=αBA+βC

    其中α,β是标量,A是对称阵,B,Cmn的矩阵

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:=αAA+βCC:=αAA+βC

    其中,α,β是标量,Cnn的对称阵,第一个式子中Ann的矩阵,第二个式子中Akn的矩阵

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:=αAB+αBA+βCC:=αAB+αBA+βC

    其中,α,β是标量,Cnn的对称阵,第一个式子中A,Bnk的矩阵,第二个式子中A,Bkn的矩阵

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:=αBop(A)

    其中,α是标量,Bmn的矩阵,op(A)=A或者op(A)=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=αBXop(A)=alphaB

    其中,α是一个标量,XB是一个mn的矩阵,A是单位或者非单位,上三角或者下三角矩阵,op(A)=A或者op(A)=A或者op(A)=conjg(A)。把等式的解矩阵X冲写入到B矩阵中。

后续

研究BLAS Level 1 2 3中各种矩阵相关概念。随后是代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MKL学习——线性代数概念相关

前言 回顾一下BLAS Level 1 2 3中的运算都有什么类型 BLAS Level 1 在BLAS Level 1中,进行的是向量-向量的操作。其中相关概念有 向量类型: 实数域,复数域,共轭运算操作: 元素求和,向量相加,向量拷贝,点乘…

MKL学习——基本操作C++实现

前言 前面介绍了各种向量-向量,矩阵-向量,矩阵-矩阵的函数简介。根据自身目前状况,主要使用实数域的操作,也就是说关注单精度float类型的s和双精度double类型的d。还有就是用的基本都是全矩阵,没有经过压缩&#xff0…

相机矩阵(Camera Matrix)

前言 最近翻阅关于从2D视频或者图片中重构3D姿态的文章及其源码,发现都有关于摄像机参数的求解,查找了相关资料,做一下笔记。 国际惯例,来一波参考网址 透视变换、透镜畸变及校正模型、相机校正(Camera Calibration)、Matlab相…

损失函数梯度对比-均方差和交叉熵

前言 我们都知道在机器学习中,希望算法或者网络收敛更快,有些是对数据预处理,尤其是Batch Normalization,有些是采用不同的激活函数,尤其是Relu激活函数取得了巨大的成功,还有一种加速收敛方法是更换损失函…

如何选择深度学习优化器

前言 转载地址:如何选择深度学习优化器 作者:不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢? 下面是 TensorFlow 中的优化器, https://w…

【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现

前言 主要是想尝试看一下多标签的caffe是如何进行输入输出的,但是目前还未找到基于原始caffe做多标签输入的代码,大部分都是基于源码做了一部分修改实现多标签分类,caffe官网倒是有一个多标签的Python程序,这个我慢慢研究研究&am…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题:多标签分类,进行初步探索,此篇博客针对caffe官网的多分类进行配置,只不过是Python接口的,不过官网在开头说明可以使用HDF5或者LMDB进行操作,只不过Python更加方便罢了 国…

【theano-windows】学习笔记一——theano中的变量

前言 因为目前需要搭建一些关于RBM或者其他之类的模型,感觉不太会折腾caffe,然而我发现了几个有趣网址,使用theano实现了各种各样的模型,所以,尝试学一下theano。主要以官方教程为主,所以博客会以译文的方…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型,也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数,类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言,包含梯度、偏置、参数更新,而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算,这一章节就是看看…

【theano-windows】学习笔记四——theano中的条件语句

前言 按照官网教程,学习条件语句Switch和ifelse的使用 参考地址: conditions 性能对比 ifElse是将布尔变量和两个变量当做输入 Switch是将张量和两个变量当做输入. 因为Switch是元素级操作,所以比ifElse更具一般性 Switch需要对所有输出变量进行评…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了,但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作,最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

多标签分类、多任务分类、多输出回归概念

前言 虽然不是搞分类的,但是还是看看多标签和多分类的区别。为了避免自己的错误理解, 当然是选择原谅他啊…….找正规文档看哇. 以下翻译分别来自scikit-learn.org和 维基 喂鸡百科 国际惯例,贴上来源: Multiclass and multilabel algorithms Multi-…

【theano-windows】学习笔记七——logistic回归

前言 前面只是学了最基本的theano操作,但是theano中还有很多其他的东西,比如图结构,自定义函数等,这些暂时没有用到就先不看了,后续学啥用啥,没必要一口气吃个胖子,免得消化不良还把前面吃的东…

【theano-windows】学习笔记八——预备知识

前言 按照上一个博客所说的,直接按照深度学习0.1文档进行学习,当然在此之前我们需要了解这一系列教程所需要的数据集,以及一些概念性的东西 国际惯例,参考博客网址: 深度学习0.1文档 深度学习0.1文档-中文翻译 基…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求,这么神奇的网络是时候分析一波了,我个人的学习方法调试代码,然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…