MATLAB程式设计入门篇程式码与记忆体之最佳化1.pptVIP

MATLAB程式设计入门篇程式码与记忆体之最佳化1.ppt

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MATLAB程式设计入门篇程式码与记忆体之最佳化1

* * * * * * * * * * * * * * * * * * * * * * * * * * MATLAB 程式設計入門篇:通用運算式 MATLAB 程式設計入門篇:通用運算式 MATLAB 程式設計入門篇 程式碼與記憶體之最佳化 張智星 jang@ /jang 清大資工系 多媒體檢索實驗室 重點說明 6.5 版之前,MATLAB 執行效率非常倚賴程式碼的向量化 6.5 (含)版後,MATLAB 引進了JIT 加速器,程式碼向量化的重要性相對降低。 同學們仍須瞭解程式碼向量化的實作方法、優缺點。 本章範例之執行環境 OS: Windows 7 CPU: Intel Core i7-2670QM, 2.20GHz RAM: 8GB MATLAB: 35 (R2011a) 2-1 程式碼的向量化 6.5 版之前,MATLAB 程式環境是一個傳統的解譯器(Interpreter),在執行 MATLAB的程式碼時,會進行下列動作: 逐列對程式碼轉換為 p-code,這是 MATLAB 可以解讀的格式。 對產生的 p-code 進行逐列執行。 MATLAB 程式運作流程 (I) 在執行每一列 p-code 時,都還包含一些「經常開銷」(Overhead) 若該列執行需要大量運算,經常開銷就會顯得很渺小而不會拖累程式執行速度。 若該列只是簡單的運算,那經常開銷的比例就會相對提高。 若該列是放在迴圈內,那麼程式碼的執行速度就會被這些經常開銷大幅拖慢。 MATLAB 程式運作流程 (II) 若要加快執行速度 MATLAB 6.5 版之前,就要盡量不使用迴圈 ,而盡量改用向量化的運算,以降低經常開銷的比例。 MATLAB 6.5 版(含)之後,已經加入了 JIT-Accelerator,有效地降低了經常開銷的比例,同時也使得向量化程式碼的重要性越來越低。 JIT: Just-In-Time 對向量化運算來進行說明,主要著眼點在於: 很多舊的程式碼還是包含向量化的運算。 MATLAB 6.5 之前的版本,向量化的運算還是提高執行效率的主要關鍵。 某些情況下,JIT-Accelerator 的效能無法完全發揮,還是需要配合向量化的運算才可以讓程式碼更有效率。 MATLAB 程式碼的向量化 傳統範例 (I) 計算 n 項調和數列的總和,若使用 for 迴圈,當 n = 100,000 時,可計算其執行時間如下: 範例2-1:hsum01.m tic n = 100000; total = 0; for i = 1:n total = total+1/i; end toc elapsed_time = 2.63000 由上可知,當 n = 100,000 時,使用 for 迴圈的程式碼約需 2.63 秒才能執行完畢。若改用向量化的運算,可計時如下: 範例2-2:hsum02.m tic n = 100000; sequence = 1:n; total = sum(1./sequence); toc elapsed_time = 0.0600 傳統範例 (II) 提示 上述的測試時間是根據Pentium-450, 256 MB RAM在 MATLAB 6.1 所得到的結果。如果你的電腦更快,計算時間的差異性就不會那麼顯著。 若使用我目前環境進行測試: hsum01 ? 0.009773 sec hsum02 ? 0.008938 sec 在 MATLAB 6.5 版之後,採用了 JIT (Just-In-Time) 的編譯技術,因此「向量化」和「非向量化」的程式執行速度差異較小。 要能夠熟練地運用向量化的運算,有下列三個訣竅: 對矩陣的索引(Indexing)非常熟悉。 對 MATLAB 可用的內建(Built-in)指令非常熟悉。 對問題本身的解法非常瞭解。 程式碼向量化的要訣 若要對一個矩陣 x 的每一個直行乘上向量 a 的每一個元素,我們可使用內建的 diag 指令來達成此功能,例如: 範例2-3: colMultiply01.m 此為「以空間換取時間」的範例。 x = [1 2 3; 1 1 1]; a = [3 2 1]; y = x*diag(a) y = 3 4 3 3 2 1 矩陣直行乘法 若要對一個矩陣 x 的每一個橫列乘上向量 a 的每一個元素,也可以使用 diag 指令,例如: 範例2-4: rowMultiply01.m 此為「以空間換取時間」的範例。 x = [1 2 3;4 5 6]; a = [3 1]; y = diag(a)*x y =

文档评论(0)

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

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

1亿VIP精品文档

相关文档