matlab不可以处理matlab中矩阵相乘乘了怎么办

在matlab中, 当数据比较大时,运算起来就困难了,有时候还会out of memory(例如的矩阵,要算矩阵乘法都比较吃力)。此文会记录我学到的一些解决办法:
1. 将数据的存储类型从double转换成single
&&& 在matlab中double数据类型占8个字节,single类型占4个字节。把数据类型从double类型转换成single类型可以节省一半的空间。
&&& 单精度浮点数single的取值范围可以通过[-realmax('single'), -realmin('single')] U [ realmin('single'), realmax('single')]查看,可以发现其范围一般是足够我们使用了。
2. 避免使用高维矩阵
&&&& 当数据量很大时,使用高维矩阵无疑是雪上加霜,可以考虑使用多个低维矩阵。
&&&& 例如有3个N*N的矩阵(K1,K2,K3),为了程序书写的方便,可以把这三个矩阵保存在一个N*N*3的矩阵K中,那么使用这三个矩阵时就只通过K来访问。但是,当N比较大时,三维矩阵K就更大了,很容易造成out of memory。 所以为了避免out of memory,还是使用多个二维矩阵比较好(与其分配一个更大的空间给K,不如分配多个小矩阵,虽然总量一样),可是这样取用这三个矩阵却不方便了。下面给出我的解决方案:
&&&&& N = 5000;
&&&&& K1 = rand(N,N);
&&&&& K2 = rand(N,N);
&&&&& K3 = rand(N,N);
&&&&& a = ['K1'; 'K2'; 'K3'];&&&& % 将这三个矩阵的名字存成字符串矩阵
&&&&& B1=eval(a(1,:));&&&&&&&&& % 通过eval()函数来取用K1
&&&&& B2=eval(a(2,:));&&&&&&&&& % 取用K2
&&&&& B3=eval(a(3,:));&&&&&&&&& % 取用K3
&&&&& 这里用到的eval函数的功能强大,可以将字符串的内容当做matlab命令来执行(Execute string containing MATLAB expression)
3. 及时清理不用变量,特别是大数据矩阵。及时清理可以腾出空间。同时,在生成矩阵的时候最好一次性申请足够的空间,不要在程序运行的时候变化矩阵大小。
4. 如有可能,尽量采用矩阵元素之间的运算,而不是直接的矩阵乘法
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:21701次
排名:千里之外
原创:10篇
转载:55篇
(1)(4)(3)(2)(5)(1)(1)(3)(41)(4)关于matlab以及矩阵高性能计算
最近涉及到大量的矩阵运算,matlab真的是功能很强大,不过追根溯源,下面的这个介绍有助于深刻理解.未来需要的话,得考虑直接调用了.
从MATLAB矩阵乘法到BLAS dgemm
事实上,无论是在matlab,还是在别的语言下的计算库,高性能计算过程都大概包含了三个层次。为了说明问题,还是以matlab中的矩阵乘法为
例子说起。
在matlab中,我们要计算两个矩阵 A 和 B 的乘积,我们会在命令行或者m-file里面写 A *
B。这么一个简单的语句是如何转化为实际的计算过程的呢? 首先,matlab的解释器会分析这个语句的语法,从而知道你要做的是计算 A 和
B 的乘积。但是,matlab
其实只是个外包装,并不是自己进行这个计算的,而是把计算过程委托给一个核心的C语言计算函数叫做dgemm,然后dgemm进行实际的计算,最后
matlab对dgemm输出的结果重新打包返回。
这个名字很奇怪的函数究竟是怎么回事呢?它其实是BLAS Level 3中最重要的函数 (常用BLAS/LAPACK 或者
MKL的朋友对这个函数肯定不陌生)。BLAS 全称 Basic Linear Algebra
Subprograms,它是在1979年被提出的来用于支持建立一个叫做LAPACK的矩阵代数的运算库。到了今天,BLAS函数已经成为矩阵和向量运
算的事实上的“国际标准”接口。BLAS的函数分为三个Level,&
Level & 1是向量和向量之间的运算,比如点积 (ddot), 加法和数乘
(daxpy),& 绝对值的和 (dasum), 等等;
Level & 2 是向量和矩阵的乘法运算,最重要的函数是一般的矩阵向量乘法(dgemv)
Level & 3 是矩阵和矩阵的乘法运算,最重要的函数是一般的矩阵乘法 (dgemm)
dgemm这个名字是什么意思呢?其实全称可以翻译为 double-precision generic matrix-matrix
muliplication. 其实,Level-3虽然只做一件事情,就是矩阵相乘,但是,它还有很多其它的函数:比如sgemm
(单精度一般矩阵乘法),dsymm (双精度对称矩阵乘法),zhemm(双精度复数埃米特矩阵乘法),诸如此类还有很多
。。。。。之所以要分成这么多种,主要是针对每种不同类型的矩阵,都要分别针对性地设计专门的算法使得对它的性能尽可能的高。
另外还有一套同样著名的标准运算接口,叫做LAPACK(Linear Algebra
PACKage),它是基于BLAS的基础上建立的线性代数运算库,提供一些更复杂的功能,比如LU, QR,
SVD分解,或者求解特征值和特征向量,又或者求解线性方程组以及最小二乘法等问题。
可以理解为只是一套函数接口,在遵循接口的情况下,不同的库可以有不同的实现。很多著名的软硬件厂商都分别实现了针对自己产品专门优化过的BLAS实现。
最著名的实现有下面一些:
这是一套开源的实现。很多开源的数值软件都使用ATLAS优化的BLAS;
MKL:这是Intel针对它的CPU系列开发的核心数学运算库,提供了完整的BLAS和LAPACK实现,除此以外,还有很多功能;
AMD ACML: 作为Intel的长期对手,自然也不甘人后;
Sun Performance Library:& 主要针对Sun的SPARC架构;
另外,Apple, HP,
NEC都有各自的BLAS实现。各大芯片厂商其实都不遗余力地提高自己的BLAS实现的性能——因为,前面提到的那个著名函数dgemm的运算速度是衡量
一个CPU数值运算性能的非常重要的指标。一般来说,我接到一台新的机器,都会打开matlab算几次或者的随机矩
阵乘法(前面提到,matlab也是调用核心的dgemm做这个事情),这样我就大体知道这台机子的数值性能了。
既然大家都实现了BLAS,为什么我们通常不直接用它呢?答案很简单,太不方便了。dgemm这个函数做矩阵乘法,一般可能觉得它会有三个参数,两
个输入,一个输出。考虑到需要把大小信息m, n, l 也提供进去,最多6个参数。好,我们一起来参观一下这个C函数的声明:
void cblas_dgemm(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 double alpha,
&&&&&&&&&&&&&&&&
const double *A,
&&&&&&&&&&&&&&&&
const int lda,
&&&&&&&&&&&&&&&&
const double *B,
&&&&&&&&&&&&&&&&
const int ldb,
&&&&&&&&&&&&&&&&
const double beta,
&&&&&&&&&&&&&&&&
double *C,
&&&&&&&&&&&&&&&&
const int ldc);
总共14个参数。不知道大家是否有心情在一般的算法开发中用这东西做矩阵乘法,反正我是不会这么做的。而matlab这类软件的好处是包装了这些很
难用的函数,使得我们在很愉快的写A * B这样的表达式时,同时享用BLAS带来的高性能。
让矩阵乘法变得更快
我们都知道矩阵乘法的运算规则,其实很简单——一个10行内的的三重循环就能实现。为什么那么多大公司还要年复一年的研究怎么算矩阵乘法(还有别的
更简单的数值运算过程)呢?因为,算对很容易,算得快却非常艰难。通常来说,会使用这么一些技术:
- 分解小矩阵块,每个小块都用特殊优化过的算法计算;
把循环解开,减省内重循环中用于更新循环变量的开销。对于矩阵乘法这样的高密度数值运算,内重循环中每次循环哪怕减少一个指令周期,对整体性能都是很大的
- 对高速缓存(Cache)的调度进行改进,提高命中率;
- 充分利用指令流水线,使得数据的读取,计算,写入这些接续操作在流水线内同时进行;
- 使SIMD指令集(通常是SSE, SSE2, SSE3等)。SIMD全称是Single Instruction Multiple
Data,就是一条指令在单周期内处理多组数据,在新的CPU中都支持这些指令。
SIMD对于向量运算的加速有重要意义。举个例子,在SSE2有指令能在单周期同时对一组128位浮点数(两个double,或者四个float)
进行加减乘除或者开平方运算,可以想见,充分利用这些指令能对计算速度成倍提高。对于不同的CPU,不同的架构,不同大小的矩阵,对这些技术的运用也不尽
相同,因此最终形成的实现算法非常非常复杂——资料显示,现代CPU上高度优化的矩阵乘法实现不是10行以内的for-loop,而是超过10万行!其中
包含了大量和CPU和Cache密切相关的东西。
归纳起来,高速矩阵运算的全过程包含三个层次:
1.& 上层封装好的接口: 比如matlab里面的A * B;
2.& 中间层的 BLAS/LAPACK 的 C
函数,像dgemm,它们通过非常复杂并且硬件相关的技术来提高速度。
这些C函数会调用CPU中的指令进行运算,其中SIMD(SSEx)指令集对于运算速度的提高有着关键意义。
提高基本运算的速度显然不是我们的任务,Intel和AMD的工程师会管这个事情。对于我们来说,合理的做法就是拿来主意,让他们开发出来的技术来
提高我们的实验效率。如果能用matlab,matlab已经把这个包装好了。如果你是那种对性能特别有追求的人,那么你可以到Intel或者AMD的网
站获取最新版的MKL或者ACML,安裝到你的机器上,然后设置BLAS_VERSION环境变量就能让matlab使用最新的高性能库了。
其它的常用数值软件,比如Mathematica, numpy, Octave,
R都提供了方法链接不同的BLAS实现。对性能关键的数值运算程序,在选用支持库时,能否接入高性能BLAS实现是一个重要的标准。如果两个库都使用同一
种BLAS实现,那么它们的计算性能应该是差不多的(除了在封装层的overhead略有差别)。而接口封装的质量当然也是重要的考虑,这直接关系到它的
易用性——这方面matlab是我见过做得最好的,Octave的接口仿造matlab,不过octave的运行环境比matlab就差多了。numpy
和R都存在类似问题。
-----
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。matlab数据处理基础_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者贡献于
评价文档:
60页免费60页1下载券3页1下载券60页免费68页1下载券 68页免费68页1下载券37页1下载券123页2下载券68页1下载券
喜欢此文档的还喜欢56页免费57页免费7页免费72页1下载券60页免费
matlab数据处理基础|m​a​t​l​a​b​数​据​处​理
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:427.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢Matlab数据处理基础1_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者贡献于
评价文档:
58页免费98页免费72页免费47页免费27页免费 68页免费74页免费60页免费37页免费60页免费
喜欢此文档的还喜欢68页免费8页免费19页免费57页免费68页2下载券
Matlab数据处理基础1|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:280.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢matlab中,例如 p为一个矩阵,以赋值,b和u都是数,c=b*u*p,显示矩阵乘法维数不等,怎么解决,急急急!!_百度知道
matlab中,例如 p为一个矩阵,以赋值,b和u都是数,c=b*u*p,显示矩阵乘法维数不等,怎么解决,急急急!!
我有更好的答案
按默认排序
也就是说是行向量,根据矩阵乘法,不懂请追问,望采纳,肯定是维数不等,你需要检查一下你的P矩阵的形式,不然的话,p矩阵的维数必须是1*n维的b和u都是数字的话
可是公式要求p必须是方阵,怎么解决捏
哦,那你是要用数字乘以矩阵中每一个元素,那就用C=b*u.*p就可以了我刚才尝试了一下,如果P是方阵,即使b,u是数字也没有问题
其他类似问题
矩阵乘法的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 matlab两个向量相乘 的文章

 

随机推荐