OpenBlas库----cblas_dgemm()函数
来源:互联网 发布:java写爬虫 编辑:程序博客网 时间:2024/05/17 06:26
在Caffe的源码中有很多地方使用OpenBlas库进行矩阵运算,今天就简单讲一下我在使用cblas_dgemm()函数的使用时遇到的问题。
在网上查到的资料很多都是简单的说了下cblas_dgemm()函数的参数和功能,具体怎么用没有给出相应的代码,而且我对里面的转置也是很迷惑。先给大家几个博客地址:
官方例子:https://github.com/xianyi/OpenBLAS/wiki/User-Manual
很棒的以一个例子,我根据这个搞定的:http://blog.sina.com.cn/s/blog_4a03c0100101ethf.html
这个也不错:http://blog.csdn.net/g_spider/article/details/6054990
在看下面的内容之前,请先仔细阅读函数参数。
好了言归正传,讲讲几个大家不太熟悉的参数。
第一个参数是选择行主序还是列主序。那什么是行主序?什么又是列主序呢?如下所示
数组A[1,2,3,4,5,6,7,8,9]
如果我们想将A按照行主序(CblasRowMajor)展开成一个3*3的矩阵结果如下:
[1,2,3
4,5,6
7,8,9]
如果我们想将A按照列主序(CblasRowMajor)展开成一个3*3的矩阵结果如下:
[1,4,7
2,5,8
3,6,9]
其实我们发现按照行主序就是按照行遍历矩阵得到数组A,按照列主序就是按照列遍历矩阵得到数组A。
第二个参数:是不转置(CblasTrans or CblasNoTrans)
开始对这个参数很迷惑,后来发现其实很简单,这个参数是和前面的参数(行或列主序)配合使用的。举例:如果你已经选择CblasRowMajor 如果CblasTrans被选择,那么对数组就按照列展开;如果选择CblasNoTrans被选择,那么对数组就按照行展开。简单的说就CblasRowMajor和CblasColMajor是个总开关,CblasTrans和CblasNoTrans是分开关。
好了,下面贴出代码再仔细讲讲。
<pre class="cpp" name="code">#include <openBLAS/cblas.h>#include <stdio.h>#include<iostream>extern "C"using namespace std;void main(){int i = 0;double A[6] = { 1.0, 2.0, 1.0, -3.0, 4.0, -1.0 };double B[6] = { 1.0, 2.0, 1.0, -3.0, 4.0, -1.0 };double C[9] = { .5, .5, .5, .5, .5, .5, .5, .5, .5 };double D[9] = { .5, .5, .5, .5, .5, .5, .5, .5, .5 };double E[9] = { .5, .5, .5, .5, .5, .5, .5, .5, .5 };double F[9] = { .5, .5, .5, .5, .5, .5, .5, .5, .5 };/*按列主序展开*///1、都无转置cout << "按列主序展开,都无转置:" << endl;cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, 3, 3, 2, 1, A, 3, B, 2, 1, C, 3);for (i = 0; i<9; i++)printf("%lf ", C[i]);printf("\n");//2\矩阵B转置cout << "按列主序展开,矩阵B转置:" << endl;cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, 3, 3, 2, 1, A, 3, B, 3, 1, D, 3);for (i = 0; i<9; i++)printf("%lf ", D[i]);printf("\n");/*按行主序展开*///1、都无转置cout << "按行主序展开,都无转置:" << endl;cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 3, 3, 2, 1, A, 2, B, 3, 1, E, 3);for (i = 0; i<9; i++)printf("%lf ",E[i]);printf("\n");//2、矩阵B转置cout << "按行主序展开,矩阵B转置:" << endl;cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans, 3, 3, 2, 1, A, 2, B, 2, 1, F, 3);for (i = 0; i<9; i++)printf("%lf ",F[i]);printf("\n");}
结果:
下面我们来分析一下各种模式下数组A和B是怎样展开成矩阵的。
1、按列主序展开,都无转置
矩阵A=[1.0,-3.0 矩阵B=[1.0,1.0,4.0 A*B=[-5.0,10.0,7.0
2.0,4.0 2.0,-3.0,-1.0] 10.0,-10.0,4.0
1.0,-1.0] -1.0,4.0,5.0]
结果矩阵C也是按列主序展开,(这个地方有点问题,一直没找到原因,大家注意)
2、按列主序展开,矩阵B转置
矩阵A=[1.0,-3.0 矩阵B=[1.0,2.0,1.0 A*B=[10.0,-10.0,4.0
2.0,4.0 -3.0,4.0,-1.0] -10.0,20.0,-2.0
1.0,-1.0] 4.0,-2.0,2.0]
结果矩阵D按行主序展开
3、按行主序展开,都无转置
矩阵A=[1.0,2.0 矩阵B=[1.0,2.0,1.0 A*B=[-5.0,10.0,-1.0
1.0,-3.0 -3.0,4.0,-1.0] 10.0,-10.0,4.0
4.0,-1.0] 7.0,4.0,5.0]
结果矩阵E按行主序展开
4、按行主序展开,矩阵B转置
矩阵A=[1.0,2.0 矩阵B=[1.0,1.0,4.0 A*B=[5.0,-5.0,2.0
1.0,-3.0 2.0,-3.0,-1.0] -5.0,10.0,7.0
4.0,-1.0] 2.0,7.0,17.0]
结果矩阵F按行主序展开
注意:如果CblasColMajor 则lda,ldb,ldc是A,B,C的行
如果CblasRowMajor则lda,ldb,ldc是A,B,C的列
- OpenBlas库----cblas_dgemm()函数
- cblas_dgemm 说明
- openblas
- Openblas编译Android NDK库的步骤
- Android NDK中编译Openblas库
- ubuntu找不到动态链接库 can not find openBLAS.so
- openblas windows
- openblas windows
- 学习OpenBlas
- 编译OpenBLAS
- caffe + openblas
- ubuntu openblas
- 加快R运行的简易方法-使用内置函数和安装openBLAS
- Windows下在GSL(GNU Scientific Library)中使用OpenBLAS库
- 在Windows和debian上配置Armadillo(线性代数库)并使用OpenBlas
- openblas+lapack numpy scipy
- OpenBlas编译方法
- OpenBlas编译方法
- SecureCRT的rz 和gz不能使用
- LeetCode Ugly Number
- nginx built-in variables (nginx 内置的变量)
- json数据处理相关
- Markdown编辑器使用说明
- OpenBlas库----cblas_dgemm()函数
- android studio,gradle版本,gradle插件版本的使用问题
- ASP.NET MVC diyUpload上传文件!
- 运算符
- 自定义饼状图
- INSTALL_FAILED_UNKNOWN_SOURCES问题,怎样解决?
- error:Gradle DSL method not found: 'compile()' The project 'MiarrayAdapter' may be using a version
- oracle: 执行计划 1 ---预备知识和概念
- 输入法语言支持状态