如何提高matlab运行效率

如何提高matlab运行效率

ID:32764174

大小:72.59 KB

页数:9页

时间:2019-02-15

如何提高matlab运行效率_第1页
如何提高matlab运行效率_第2页
如何提高matlab运行效率_第3页
如何提高matlab运行效率_第4页
如何提高matlab运行效率_第5页
资源描述:

《如何提高matlab运行效率》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、如何提高MATLAB运行效率(1)在我们的领域,MATLAB是进行实齡的最主要的工具之一。我听到过很多抱怨说MATLAB®慢,可是这往往不是MATMB的问题,而是因为自己程序没有写好。MATLAB是我非常欣赏的一种语言,堪称灵活易用和高效运算的结合典范。作为解释语言,MATLAB进行高效运算的秘诀有几个方面:(1)JIT即时编译技术。Matlab在第一次加载运行一个函数的时候,会在后台对它进行某种程度的编译和优化,使得后续运行更快。因此,除了第一次运行需要进行语句解释之外,后面运行的其实是已经放在内存中的

2、经过优化的中间码。所以,很多时候我们可能会看到第一次运行一个新函数,比它后面几次的运行明显慢一些。不过目前的JIT技术还不是非常成熟,和标准的编译语言相比还有相当差距,仅凭这个MATLAB还不能称为高效。⑵向量化(Vectorization)o这是MATLAB最著名的特色。向量化配合经过高度优化的数值运算引擎,是其高效运算的最重要的基石一艮多MATLAB的使用者都明白这一点。能够转化成矩阵操作的规则运算过程,使用MATLAB计算远比自己手工用C/C++实现高效。我自己做过很多次对比profile,MATL

3、AB在关键的核心运算上的实现可以比自己用C/C++按照标准的routine进行实现快几十倍。其实这不完全是MATLAB的功劳,其实MATLAB足建基于BLAS和LAPACK等的基础数学运算包的基础上的。Intel和AMD都发布了这些东西的vendor-implementation,并且针对各自的CPU进行了大量的优化,这非个人之力所能企及。因此,我从來都强烈不建议个人用C/C++去实现数值运算的关键代码(学习数值分析课者除外)。不过,对于向量化这个事情,也不宜极端化,下面的一些例子说明在哪些时候,for-

4、loop比vectorization更适合:(a)粗粒度的算法流程控制。比如,你要实现一个迭代算法,循环做一个爭情直到收敛。只要循环几次或者几十次,但是每个循环内部要进行大量的复杂运算,那么你就没有必要费心把这层循环给vectorize掉了。除非收敛结果有某种close-form的解析解。(b)如果向量化可能导致产生巨型矩阵,则使用前要三思!很多情况下,向量化是一种用空间换时间的行为,就是通过把数据组织成某种方式,从而使得内建的高效引擎能得以应用。但是,有些时候要处理大量的数据,可能导致其组织过程需要耗费

5、额外的数百兆乃至千兆内存空间,那么这有可能造成效率的不升反降。原因有几个方面:第一,数据组织过程也是需要时间的,最起码它也需要大量的操作进行密集的内存读写和用于定位的偏移量计算。这方面增加的时间vs.向量化节省的运算时间,孰轻孰重,需要衡量。第二,分配额外的大块内存是一件菲常耗时的事情,它可能导致虚拟内存的使用,那么当对这块矩阵进行读写和计算时可能涉及频繁的内存与外存交换区的I/O,这回造成效率的严重下降。我一直不赞同在OutofMemory的情况下,通过增大虚存来解决问题,这样,即使你勉强让程序能继续运

6、行下去,运行时间也会变得极为缓慢——这时应该做的是对程序进行重新思考和设计,降低其对内存的耗用。第三,vectorization有些时候还可能增加实际运算次数,这往往岀现在不适合的向量化过程中。这样,即使你通过生搬硬套的向量化过程让操作变成矩阵运算,但是增加的无用计算使得即使是更高效的引擎也无法挽回你的损失了。说了这么些,不是想劝说从向量化的道路退回去,而是提醍在做一些事情的时候,要考虑得周全一此•~■-O(3)InplaccOperationo这是一个很有趣的事情,MATLAB的对象管理策略是Copyo

7、nWrite,就是说你把一个矩阵传给一个函数的时候,会先传引用,而不产生副本,而当函数要对这个矩阵修改的时候,才会制造出它的副木出来,让函数去修改。这样听上去很完美,既保护了输入矩阵不被改变,又避免了大量无谓的复制。不过,这个策略真的没有缺陷么?可以看看下面的例子A=rand(2000,2000);fori=1:1000A=f(A);endfunctionA=f(A)A(l)=A(l)+1;%atemporarycopyrcturn;%themodifiedofAisproducedformodifica

8、tiontemporarycopyisassignedtoA在上面的代码中,只是想对A的第一个元素做1000次加法,结果却导致了对整个有四百万元素的大矩阵做了1000次副本复制!而且这些副本其实没有用,只要f(A)直接对八的原矩阵进行修改,这些巨大的浪费就能避免。你可能跟我argue说,这里完全可以写成A(l)二A(l)+1000,不用这么搞。我想说明的是,我只是想举一个简单例子说明,Copy-on-write的策略为什么可能

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。