撰写快速 MATLAB 程序代码.docVIP

  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 程序代码

撰写快速的 MATLAB 程序代码 MATLAB程序语言是剖析式(parsed)的,原始码是实时直译的。像C++和Fortran的程序语言比较快,因为它们在变成计算机原生 (native)语言前先被编译。实时剖析的优点是较与平台不相关、具强固性(robustness)和更容易除错。缺点是在速度上会变慢,负荷会变多, 及受限的低阶控制。 要弥补速度上的损失,MATLAB提供了能帮助加速的程序代码。此文章讨论这些和其它的策略来改善MATLAB原始码的速度。 * 数组预先配置 * 向量化的计算和逻辑 * 向量化的参考(Vectorized referencing) h2警告!/h2 *先学习程序语言:最佳化(不仅是MATLAB)需要熟悉程序语言的语法和函式。本文并不是MATLAB的教学。 *使用批注:最佳化的程序代码是精练和神秘的。为了帮助他人和你自己,记得要加批注。 *不要在它需要被最佳化程序代码之前最佳化它:在最佳化程序代码之前,考虑它是否值得这些心力。如果程序代码很快就会被修改或扩充,无论如何它会被重写。 *只要最佳化必要的部份:确定程序确实是速度的瓶颈。如果它不是,最佳化只会把程序代码变得难以理解。 h21. 速度剖析器(The Profiler)/h2 MATLAB 5.0和较新的版本都包含了一个叫作profiler的工具,它帮助你决定程序里哪里是瓶颈。考虑下面的程序: function result = example1(Count) for k = 1:Count result(k) = sin(k/50); if result(k) -0.9 result(k) = gammaln(k); end end 要分析程序的效率,首先启动profiler,并清除任何旧的profiler数据: profile on profile clear 现在执行程序吧。将输入的自变量变得大些或小些,让它跑个几秒。 example1(5000); 然后输入 profreport(’example1’) profiler会在函式上产生一个HTML报表,然后开启一个浏览器窗口。根据系统,profiler的结果可能会与此例有些不同。 在蓝色的「example1」连结上按一下会提供更多的细节: 显示了最花时间的行数,伴随着时间、时间的百分比和行数。代价最高的行数是第4和第7行。 h22. 预先配置数组/h2 MATLAB的矩阵变量有动态的自变量行和列的能力。例如: a = 2 a = 2 a(2,6) = 1 a = 2 0 0 0 0 0 0 0 0 0 0 1 MATLAB会自动地改变矩阵的尺寸大小。在内部,矩阵数据存储器必须被预先配置予较大的尺寸。如果矩阵可重复地改变大小--像是在for循环里--此负荷会变得很显著。要避免经常性的重新配置,用zero命令来「预先配置」矩阵。思考下列的程序代码: a(1) = 1; b(1) = 0; for k = 2:8000 a(k) = 0.99803 * a(k - 1) - 0.06279 * b(k - 1); b(k) = 0.06279 * a(k - 1) + 0.99803 * b(k - 1); end profiler计算此程序代码的时间花费了0.47秒。在执行for循环之后,二个数组都是长度8000的列向量,因此要预先配置,建立8000个元素的空的a和b列向量。 a = zeros(1,8000); % 预先配置 b = zeros(1,8000); a(1) = 1; b(1) = 0; for k = 2:8000 a(k) = 0.99803 * a(k - 1) - 0.06279 * b(k - 1); b(k) = 0.06279 * a(k - 1) + 0.99803 * b(k - 1); end 经此修改,程序代码只花费0.14秒(快超过三倍)。预先配置通常很容易,在本例中它只需要决定正确的预先配置大小及新增二行。如果最终的数组尺寸大小会变 动那么会怎么样?一个可能的方法,是在循环执行完之后使用数组尺寸大小的上界(upper bound),并且裁剪掉超出的部份: a = zeros(1,10000); % 预先配置 count = 0; for k = 1:10000 v = exp(rand(1)*rand(1)); if v 0.5 % conditionally add to array count = count + 1; a(count) = v; end end a = a(1:count); % 裁剪结果 此程序的平均的执行时间是0.42秒(没有预先配置),及0.18秒(有预先

文档评论(0)

130****9768 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档