目录

1 向量与向量

2 矩阵与向量

3 矩阵与矩阵


openblas 是一个开源的矩阵计算库,包含了诸多的精度和形式的矩阵计算算法。就精度而言,包括float和double,两种数据类型的数据,其矩阵调用函数也是不一样。不同矩阵,其计算方式也是有所不同,(姑且认为向量也是一维矩阵),例如,向量与向量之间的计算,向量与矩阵之间的计算,矩阵与矩阵之间的计算。

按照不同的计算需求openblas有如下几种

1 向量与向量

对于不同的精度,使用的函数也是不一样。例如cblasdaxpy表示double类型数据,cblasdaxpy表示float类型数据

头文件

"cblas.h"

描述

cblas_?axpy系列函数执行vector-vector的操作,即:

y := alpha*x + y;

其中alpha是标量,x,y是向量。

参数说明

n Specifies the number of elements in vectors x and y.

a Specifies the scalar a.

x Array, size at least (1 + (n-1)*abs(incx)).

incx Specifies the increment for the elements of x. 一般设置为1

y Array, size at least (1 + (n-1)*abs(incy)).

incy Specifies the increment for the elements of y. 一般设置为1

2 矩阵与向量

矩阵与向量的乘法种类也有很多,常规也就是上述三种,以cblas_sgemv为例:

头文件:

"cblas.h"

描述:

cblas_?ger系列函数执行matrix-vector的操作,即:

y := alpha*A*x + beta*y,

其中alpha,beta是标量,x,y是向量(x(m*1),y(n*1)),A是一个m*n的矩阵。

详细接口:

void cblas_sgemv (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE trans, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, const float *x, const MKL_INT incx, const float beta, float *y, const MKL_INT incy)

详细接口的具体含义:

Layout:布局,也就是指定矩阵的排列方式,按照行优先(CblasRowMajor)还是列优先(CblasColMajor),需要指出的是,在函数使用中,虽然是向量与矩阵的乘法,但是实际上,传递的是两个指针向量。这样对于多维矩阵而言,指明其排列方式,十分有必要。参数(CblasRowMajor,CblasColMajor)

trans: 转置特定操作:

if trans=CblasNoTrans, then y := alphaAx + beta * y;

if trans=CblasTrans, then y := alphaA'x + beta * y;

if trans=CblasConjTrans, then y := alpha conjg(A')x + beta*y.

m:表示矩阵A的行m

n:表示矩阵A的列n

a:表示一个矩阵,size = lda *k

For Layout = CblasColMajor, k is n,

For Layout = CblasRowMajor, k is m.

alpha:一个标量,通常为1

x:矩阵向量

incx,incy,一般为1

beta: 一个标量参数,通常设置为 0,之前试过设置为1,直接导致了结果不正确;在矩阵或是向量元素的值较大的时候,beta这个值,为0还是1影响不大;

示例程序1:

void matrix_vector(){float array[6] = { 1,2,3,4,5,6 };float x[3] = { 1,2,3 };int m = 2; int n = 3;float y[2] = {};cblas_sgemv(CblasRowMajor, CblasNoTrans, m, n, alpha, array, n, x, 1, beta, y, inc_y);//cblas_sgemv(CblasColMajor, CblasTrans, n, m, alpha, array, n, x, 1, beta, y, inc_y);//两个结果一致
}//打印结果
14,32

示例程序2:

void matrix_vector()
{int i = 0;double x[2] = { 1.0,2.0 };double y[3] = { 2.0,1.0,3.0};double A[6] = { 0 };blasint rows = 2, cols = 3;double alpha = 10;blasint inc_x = 1, inc_y = 1;blasint lda = 2;//矩阵按列优先存储//A <== alpha*x*y' + A (y'表示y的转置)cblas_dger(CblasColMajor, rows, cols, alpha, x, inc_x, y, inc_y, A, lda);for (i = 0; i<6; i++)std::cout << A[i] << " ";std::cout << "\n";
}
//打印结果
20 40 10 20 30 60

3 矩阵与矩阵

矩阵与矩阵的乘积,相较于前两种较为复杂,但是用途却比较大,上面能算的,它行;上面不能算的,它也行;

头文件:

"cblas.h"

描述:

C := alphaop(A)op(B) + betaC,

其中:op(A)表示A矩阵或是转置等
矩阵
B是一个KN矩阵
C是一个M
N 矩阵

A是一个M

接口描述:

void cblas_sgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,

OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);

详细参数描述:

cblas_sgemm(order,transA,transB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC);

详细参数与上述的矩阵与向量乘法类似

以此函数为例:

cblas_sgemm(order,transA,transB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC);

alpha =1,beta =0 的情况下,等于两个矩阵相成。

第一参数 oreder 候选值 有ClasRowMajow 和ClasColMajow 这两个参数决定一维数组怎样存储在内存中,

一般用ClasRowMajow

参数 transA和transB :表示矩阵A,B是否进行转置。候选参数 CblasTrans 和CblasNoTrans.

参数M:表示 A或C的行数。如果A转置,则表示转置后的行数

参数N:表示 B或C的列数。如果B转置,则表示转置后的列数。

参数K:表示 A的列数或B的行数(A的列数=B的行数)。如果A转置,则表示转置后的列数。

参数LDA:表示A的列数,与转置与否无关。

参数LDB:表示B的列数,与转置与否无关。

参数LDC:始终=N

NOTE: 首先判定是行优先还是列优先;

再次,依照lda,ldb分别将两个矩阵按行、列分开

再次,判定是否进行转置操作

输出结果;

示例程序1:

#include <vector>
#include <iostream>
#include "caffe/util/math_functions.hpp"
using namespace std;
int main() {const int M=4;const int N=2;const int K=3;const float alpha=1;const float beta=0;const int lda=M;const int ldb=K;const int ldc=N;const float A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6};const float B[N*K]={5,4,3,2,1,0};float C[M*N];cblas_sgemm(CblasRowMajor, CblasTrans, CblasTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);for(int i=0;i<M;i++){for(int j=0;j<N;j++){cout<<C[i*N+j]<<" ";}cout<<endl;}
」
输出:
52 7
58 10
64 13
70 16

示例程序2:

#include <vector>
#include <iostream>
#include "caffe/util/math_functions.hpp"
using namespace std;
int main() {const int M=4;const int N=2;const int K=3;const float alpha=1;const float beta=0;const int lda=K;const int ldb=N;const int ldc=N;const float A[M*K]={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(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);for(int i=0;i<M;i++){for(int j=0;j<N;j++){cout<<C[i*N+j]<<" ";}   cout<<endl;}
} 结果:
14 8
41 26
68 44
67 46

openblas 矩阵算法库 简介相关推荐

  1. DL之ShuffleNetV2:ShuffleNetV2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之ShuffleNetV2:ShuffleNetV2算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 ShuffleNetV2算法的简介(论文介绍) 1.论文特点 2.基于硬件 ...

  2. NLP算法-关键词提取之Gensim算法库

    Gensim工具包 引入 Gensim简介 一些基础概念 Gensim的使用方式 1. 训练语料的预处理 2.主题向量的变换 LDA模型 demo LSA/LSI 算法 LSA/LSI算法原理 LSA ...

  3. ML之SIFT_FLANN:FLANN算法的简介、使用方法(对图片提取SIFT特征并利用FLANN方法实现计算图像相似度并可视化案例)之详细攻略

    ML之SIFT_FLANN:FLANN算法的简介.使用方法(对图片提取SIFT特征并利用FLANN方法实现计算图像相似度并可视化案例)之详细攻略 目录 FLANN算法 1.flann的搜索步骤 (1) ...

  4. 学习BLAS库 -- BLAS库简介

    BLAS(Basic Linear Algebra Subprograms)是一组线性代数计算中通用的基本运算操作函数集合[1] .BLAS Technical (BLAST) Forum负责规范BL ...

  5. 时间序列挖掘-DTW加速算法FastDTW简介

    本文地址为:http://www.cnblogs.com/kemaswill/,作者联系方式为kemaswill@163.com,转载请注明出处. 关于DTW算法的简介请见我的上一篇博客:时间序列挖掘 ...

  6. 轻量级大规模机器学习算法库Fregata开源:快速,无需调参

    作者:张夏天,TalkingData首席数据科学家.12年大规模机器学习和数据挖掘经验,对推荐系统.计算广告.大规模机器学习算法并行化.流式机器学习算法有很深的造诣:在国际顶级会议和期刊上发表论文12 ...

  7. Python主要智能优化算法库汇总

    最近几年简单浏览和对比了一些智能算法的库.现将各种库的主要信息.相关优缺点简单整理如下,各位同学可根据自己的需求和喜好进行选择. 文章目录 1.DEAP 2.mealpy 3.scikit-opt ( ...

  8. DL之DilatedConvolutions:Dilated Convolutions(膨胀卷积/扩张卷积)算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之DilatedConvolutions:Dilated Convolutions(膨胀卷积/扩张卷积)算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 Dilated Con ...

  9. EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略

    EL之AdaBoost:集成学习之AdaBoost算法的简介.应用.经典案例之详细攻略 目录 AdaBoost算法的简介 1.理解AdaBoost算法 1.1.从前向逐步递增角度来看理解AdaBoos ...

最新文章

  1. 入门级Mat (java版)
  2. 为什么我的子线程更新了 UI 没报错?借此,纠正一些Android 程序员的一个知识误区...
  3. 项目问题记录20170702
  4. java快速教程_Java快速入门
  5. GRPC与.net core
  6. ArcGIS 10.7如何获取矢量多边形所有折点的坐标(平面坐标和经纬度坐标)?
  7. eclipse插件:打开选中文件所在的目录
  8. Java程序员不可错过的11个IDEA插件
  9. 算法(Algorithms)第4版 练习 2.1.24
  10. Babel 6.25 版本发布,JavaScript 编译器
  11. selenium指定驱动路径
  12. c语言+自定义关机,[分享]c语言调用shutdown编写简单定时关机软件
  13. 仙剑四、五、五前模型及资源提取
  14. 【Unity 学习笔记】01 素材的导入和常见功能
  15. 离线维基百科全书阅读器(wikireader)
  16. C# WPF 3DTools下的TrackballDecorator清除view,出现Null异常
  17. 一招解决Maven项目中resource目录下的application.yml不能被识别(即没有小叶子)
  18. 达内微软mta证书有用吗_微软MTA认证含金量极高 同程同美引入MTA考试认证倍受关注...
  19. html实现微信公众号,H5在微信公众号的下拉刷新实现
  20. mac电脑使用普通键盘截图,全选,拷贝(复制),移动文件的快捷键是什么?

热门文章

  1. 磁盘阵列RAID的分类有哪些?
  2. Linux 安装 TigerVNC
  3. Go 语言编程 — 并发 — Channel 通道
  4. 架构师之路 — 部署架构 — 高可用集群 — 主备 HA 系统中的脑裂问题
  5. Ironic 裸金属实例的部署流程
  6. 网上不知名的示波器方案记录
  7. dyld: Library not loaded: @rpath/MySDK.framework/MySDK 错误解决
  8. 突然关机导致git文件受损,如何处理
  9. visual studio 的git插件推荐
  10. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析