如何提高MATLAB运行效率.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何提高MATLAB运行效率(1) 在我们的领域,MATLAB是进行实齡的最主要的工具之一。我听到过很多抱怨说MATLAB?慢,可是 这往往不是MATMB的问题,而是因为自己程序没有写好。MATLAB是我非常欣赏的一种语言,堪称 灵活易用和高效运算的结合典范。 作为解释语言,MATLAB进行高效运算的秘诀有几个方面: (1) JIT即时编译技术。Mat lab在第一次加载运行一个函数的时候,会在后台对它进行某种程度 的编译和优化,使得后续运行更快。因此,除了第一次运行需要进行语句解释之外,后面运行的 其实是已经放在内存中的经过优化的中间码。所以,很多时候我们可能会看到第一次运行一个新 函数,比它后面几次的运行明显慢一些。不过目前的JIT技术还不是非常成熟,和标准的编译语 言相比还有相当差距,仅凭这个MATLAB还不能称为高效。 ⑵ 向量化(Vectorization) o这是MATLAB最著名的特色。向量化配合经过高度优化的数值运算 引擎,是其高效运算的最重要的基石一艮多MATLAB的使用者都明白这一点。能够转化成矩阵操 作的规则运算过程,使用MATLAB计算远比自己手工用C/C++实现高效。我自己做过很多次对比 profile, MATLAB在关键的核心运算上的实现可以比自己用C/C++按照标准的routine进行实现快 几十倍。 其实这不完全是MATLAB的功劳,其实MATLAB足建基于BLAS和LAPACK等的基础数学运算包的基础上 的。Intel和AMD都发布了这些东西的vendor-implementation,并且针对各自的CPU进行了大量的 优化,这非个人之力所能企及。因此,我从來都强烈不建议个人用C/C++去实现数值运算的关键 代码(学习数值分析课者除外)。 不过,对于向量化这个事情,也不宜极端化,下面的一些例子说明在哪些时候,for-loop比 vectorization 更适合: 粗粒度的算法流程控制。比如,你要实现一个迭代算法,循环做一个爭情直到收敛。只要循 环几次或者几十次,但是每个循环内部要进行大量的复杂运算,那么你就没有必要费心把这层循 环给vectorize掉了。除非收敛结果有某种close-form的解析解。 如果向量化可能导致产生巨型矩阵,则使用前要三思!很多情况下,向量化是一种用空间换 时间的行为,就是通过把数据组织成某种方式,从而使得内建的高效引擎能得以应用。但是,有 些时候要处理大量的数据,可能导致其组织过程需要耗费额外的数百兆乃至千兆内存空间,那么 这有可能造成效率的不升反降。原因有几个方面: 第一,数据组织过程也是需要时间的,最起码它也需要大量的操作进行密集的内存读写和用于定 位的偏移量计算。这方面增加的时间vs.向量化节省的运算时间,孰轻孰重,需要衡量。 第二,分配额外的大块内存是一件菲常耗时的事情,它可能导致虚拟内存的使用,那么当对这块 矩阵进行读写和计算时可能涉及频繁的内存与外存交换区的I/O,这回造成效率的严重下降。我 一直不赞同在Out of Memory的情况下,通过增大虚存来解决问题,这样,即使你勉强让程序能 继续运行下去,运行时间也会变得极为缓慢——这时应该做的是对程序进行重新思考和设计,降 低其对内存的耗用。 第三,vectorization有些时候还可能增加实际运算次数,这往往岀现在不适合的向量化过程中。 这样,即使你通过生搬硬套的向量化过程让操作变成矩阵运算,但是增加的无用计算使得即使是 更高效的引擎也无法挽回你的损失了。 说了这么些,不是想劝说从向量化的道路退回去,而是提醍在做一些事情的时候,要考虑得周全 一此 ?~■- O (3) Inplacc Operationo这是一个很有趣的事情,MATLAB的对象管理策略是Copy on Write,就 是说你把一个矩阵传给一个函数的时候,会先传引用,而不产生副本,而当函数要对这个矩阵修 改的时候,才会制造出它的副木出来,让函数去修改。这样听上去很完美,既保护了输入矩阵不 被改变,又避免了大量无谓的复制。不过,这个策略真的没有缺陷么?可以看看下面的例子 A = rand(2000, 2000); for i = 1 : 1000 A = f (A); end function A = f(A)A(l) = A(l) function A = f(A) A(l) = A(l) + 1; % a temporary copy rcturn; % the modified of A is produced for modification temporary copy is assigned to A 在上面的代码中,只是想对A的第一个元素做1000次加法,结果却导致了对整个有四百万元素的 大矩阵做了 1000次副

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档