我再次来学术一把。

我今天因为不想看3000多页的大文档,就在GOOGLE狂翻用Intel的Math Kernel Library的库如何作矩阵运算。最后还是看那个3000多页的大文档找到的解决方法。

前人栽树后人乘凉……

关键词:Intel MKL MKL库 矩阵乘积 矩阵乘法 样例 例子 代码 标程 sample code

这样以后人家都能搜到这里了:D

MKL的大文档里,有各种matrix*matrix的说明,不过都是fortran的。

而MKL自己也在sample文件夹下提供了sample,我是照着SAMPLE看,不太清楚CBLAS_ORDER的定义才查到下文的。

感觉下文写的很清楚:)

CBLAS的安装与使用

烤鱼片(@

eii.dlmu)

cleverysm@163.com

CBLAS是BLAS的C语言接口。BLAS的全称是Basic Linear Algebra Subprograms,中文大概可以叫做基础线性代数子程序。主要是用于向量和矩阵计算的高性能数学库。本身BLAS是用Fortran写的,为了方便C/C++程序的使用,就有了BLAS的C接口库CBLAS。BLAS的主页是

http://www.netlib.org/blas/,CBLAS的下载地址也可以在这个页面上找到。

CBLAS安装需要先装BLAS,从主页上下载

blas.tgz,解压,根据系统修改make.inc和Makefile,make,就会生成一个blas_LINUX.a文件。然后,下载cblas.tgz,解压,在目录下将Makefile.*文件改名或者做一个链接文件为Makefile.in文件,比如在linux下就是ln -s

Makefile.LINUX

Makefile.in,根据具体情况修改Makefile.in文件,主要是BLAS的库文件路径BLLIB和CBLAS的安装目录CBDIR,make help就可以打印出可以使用的make命令,要生成全部文件就是用make all。在$(CBDIR)目录下的$(CBLIBDIR)将生成CBLAS的库文件$(CBLIB),cblas_LINUX.a。

在CBLAS的安装目录$(CBDIR)下的src目录中有个cblas.h是包括的CBLAS的函数和常量的头文件,使用CBLAS的时候就需要这个头文件,同时还需要BLAS的库文件$(BLLIB )和CBLAS的库文件$(CBLIB)。

CBLAS/BLAS分为3个level,level1是用于向量的计算,level2是用于向量和矩阵之间的计算,level3是矩阵之间的计算。比如计算矩阵的乘法就是属于level3,这里就用矩阵乘法来学习使用CBLAS。

计算矩阵乘法的函数之一是 cblas_sgemm,使用单精度实数,另外还有对应双精度实数,单精度复数和双精度复数的函数。在此以 cblas_sgemm为例。

函数定义为:

void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,

const enum CBLAS_TRANSPOSE TransB, const int M, const int N,

const int K, const float alpha, const float *A,

const int lda, const float *B, const int ldb,

const float beta, float *C, const int ldc)

关于此函数的详细定义可以在

http://www.netlib.org/blas/sgemm.f找到,只不过是fortran语言的,这个C语言版的略有差别。

此函数计算的是 C = alpha*op( A )*op( B ) + beta*C,

const enum CBLAS_ORDER Order,这是指的数据的存储形式,在CBLAS的函数中无论一维还是二维数据都是用一维数组存储,这就要涉及是行主序还是列主序,在C语言中数组是用行主序,fortran中是列主序。我还是习惯于是用行主序,所以这个参数是用CblasRowMajor,如果是列主序的话就是CblasColMajor。

const enum CBLAS_TRANSPOSE TransA和 const enum CBLAS_TRANSPOSE TransB,这两个参数影响的是op( A )和op( B),其中TransA = CblasNoTrans, op( A ) = A,TransA = CblasTrans, op( A ) = A’,TransA = CblasConjTrans, op( A ) = A’。 TransB类似。

const int M,矩阵A的行,矩阵C的行

const int N,矩阵B的列,矩阵C的列

const int K,矩阵A的列,矩阵B的行

const float alpha, const float beta,计算公式中的两个参数值,如果只是计算C=A*B,则alpha=1,beta=0

const float *A, const float *B, const float *C,矩阵ABC的数据

const int lda, const int ldb, const int ldc,在BLAS的文档里,这三个参数分别为ABC的行数,但是实际使用发现,在CBLAS里应该是列数。

我在这里计算两个简单矩阵的乘法。

A:

1,2,3

4,5,6

7,8,9

8,7,6

B:

5,4

3,2

1,0

程序代码:

//因为程序是C++,而CBLAS是C语言写的,所以在此处用extern关键字

extern"C"

{

#include

}

#include

using namespace std;

int main(void) {

const enum CBLAS_ORDER Order=CblasRowMajor;

const enum CBLAS_TRANSPOSE TransA=CblasNoTrans;

const enum CBLAS_TRANSPOSE TransB=CblasNoTrans;

const int M=4;//A的行数,C的行数

const int N=2;//B的列数,C的列数

const int K=3;//A的列数,B的行数

const float alpha=1;

const float beta=0;

const int lda=K;//A的列

const int ldb=N;//B的列

const int ldc=N;//C的列

const float A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6};

const float B[K*N]={5,4,3,2,1,0};

float C[M*N];

cblas_sgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);

for(int i=0;i

{

for(int j=0;j

{

cout<

}

cout<

}

return EXIT_SUCCESS;

}

from:

https://cici1020.wordpress.com/2008/09/03/mkl%E5%BA%93%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95/

C语言 Mkl 矩阵乘法,MKL库矩阵乘法相关推荐

  1. C语言矩阵运算器,实现矩阵加法、减法、乘法、转置和退出。

    C语言矩阵运算器,实现矩阵加法.减法.乘法.转置和退出. C语言矩阵运算器,实现矩阵加法.减法.乘法.转置和退出.-C文档类资源-CSDN下载C语言矩阵运算器,实现矩阵加法.减法.乘法.转置和退出.更 ...

  2. strassen矩阵乘法c语言代码,计算机算法:Strassen矩阵乘法

    简介 Strassen矩阵乘法是典型的分而治之算法.我们已经见过诸如归并排序,Karatsuba大数乘法的分而治之的算法.让我们再次领略一下分而治之的含义. 与动态编程的"分散"得 ...

  3. C++Eigen库矩阵常见操作

    描述 使用C++语言的Eigen库进行一些常见操作 使用库时,请一定注意两点 定义清楚矩阵类型 矩阵乘法注意尺寸对应 代码 头文件声明 #include <Eigen/Dense> 1. ...

  4. R语言使用na.omit函数删除矩阵matrix数据中的缺失值(NA值)

    R语言使用na.omit函数删除矩阵matrix数据中的缺失值(NA值) 目录 R语言使用na.omit函数删除矩阵matrix数据中的缺失值(NA值) R 语言特点 R语言使用na.omit函数删除 ...

  5. C语言实验——求一个3*3矩阵对角线元素之和

    C语言实验--求一个3*3矩阵对角线元素之和 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个3*3的矩阵,请你 ...

  6. C语言学习之输出4X5的矩阵

    C语言学习之输出4X5的矩阵 方法一 #include <stdio.h> int main(){int a,b=0; //定义变量,赋初值for(a=1;a<=20;a++){ / ...

  7. 快速幂、矩阵快速幂、快速乘法

    快速幂 快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算.我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用for或者是pow就会超时,这时候就用到了快速幂. 快速幂的原理 ...

  8. 矩阵问题入门(矩阵乘法and矩阵快速幂)acm寒假集训日记22/1/15

    今天凌晨3点才睡,没想到通过看小说抑制玩游戏,反而看小说的时间更长. u1s1:那小说太刺激了,晚上看很有感觉,风吹草动我就会猛地看过去(类似茄子说柜子动了,哈哈),真TM(语气词)练胆量!!!..Q ...

  9. 4.9-4.10 矩阵乘法的性质 矩阵的幂运算 矩阵的转置及其性质

    矩阵乘法的性质 矩阵的乘法不遵守交换律 ! 矩阵乘法遵守结合律.分配律 对于任意r行c列的矩阵A,存在c行x列的矩阵O,满足:A . Ocx = Orx 对于任意r行c列的矩阵A,存在x行r列的矩阵O ...

  10. R语言使用matrix函数创建空矩阵、使用nrow参数和ncol参数指定矩阵的行列数

    R语言使用matrix函数创建空矩阵.使用nrow参数和ncol参数指定矩阵的行列数 目录 R语言使用matrix函数创建空矩阵.使用nrow参数和ncol参数指定矩阵的行列数 R语言是解决什么问题的 ...

最新文章

  1. python基础练习题
  2. SQL取出第 m 条到第 n 条记录的方法
  3. Android开发系列之创建自定义控件
  4. 乐高机器人亮剑_2500名选手大比拼 全球机器人广州从化“亮剑”
  5. 100篇原创博文有感
  6. Remote Desktop 访问设置
  7. scrcpy能显示不能控制
  8. HTTP的基础知识——TCP/IP协议族
  9. 图像识别技术的应用及发展趋势
  10. 云计算与虚拟化的关系是什么?
  11. 淘宝美工图片处理规范
  12. python中类名(..)(..)的情况及_call_函数解析
  13. 短信验证码、身份证实名、手机三要素实名三步走,手把手教你API接口调用,示例可使用
  14. mysql 统计七日留存率_移动APP中,7日留存率到底如何定义?
  15. 梦想世界3手游服务器维护,梦想世界手游进不去 闪退及登录不上解决方法
  16. input输入框的原生事件
  17. GO语言入门教程(二)
  18. unity3d学习之镜头耀斑
  19. leetcode1170-比较字符串最小字母出现频次(Map集合存储数组中每个字符串最小元素对应出现频次)
  20. 狂神说Java-Redis笔记

热门文章

  1. MacOS 10.15 Catalina:13个问题和修复
  2. 最优化理论与方法(袁亚湘 孙文瑜)笔记(二)
  3. 电压表c语言程序,数字电压表 数字电压表控制C语言程序.doc
  4. 基础篇:6.6)形位公差-基准 Datum
  5. JavaWeb Cookie客户端技术和Session服务端技术详解
  6. linux开启关闭网络指令
  7. ember.js mysql_Ember.js 入门指南——控制器(controller)
  8. EVEREST工具---检测硬件
  9. (外接屏幕亮度控制软件)AOC显示器、Dell显示器
  10. springboot获取视频时长以及截取视频第一帧