如何提高matlab運行效率?

比如避免循環等,適合matlab自身特點的編程習慣有哪些?實際編程過程中哪些方法可以有效提高運行速度?


  1. 並不是所有的代碼都需要追求極致速度。使用 profile 命令來查看代碼運行的瓶頸,找出最需要優化的點。
  2. 減少不必要的循環。不過,使用 arrayfun/cellfun/structfun 通常並不會提高代碼運行速度,它只是幫你把代碼壓縮成一行,以及消除一段縮進。你需要真正的矢量化你的代碼。在代碼矢量化技巧中,除了用類似 bsxfun/cumsum/accumarray 這類「神器」外,其實更多情況下,只依靠點系列運算符(如:.*)、矩陣乘法、冒號(:)運算符、邏輯索引,以及 Matlab 內建的許多天生支持矢量化操作的函數,如 sin/sum/max/filter 等,就已經足夠應付了。
  3. 做到 0 warning。許多影響代碼運行性能的問題,Matlab 能夠提前幫你預見到,並以 warning 的方式提醒你,例如:循環中大小不斷增長的矩陣,不必要的 find 調用,或者 disp(sprintf(Hello world!)) 等等……
  4. 使用 mex 函數。通常我不推薦使用 mex 函數,因為太多人用它只是因為他們對 C/C++ 更熟悉,用 Matlab 卻只會玩玩 plot(而且是連坐標軸標籤都不畫的那種)。但若真的有需求,mex 就是你最後的希望。詳細情況,還是諮詢文檔吧。


可以閱讀這本書:

Accelerating MATLAB Performance: 1001 tips to speed up MATLAB programs


考慮到很多人還在用老版本, 甚至在用十幾年的版本, 升級版本是簡單有效的手段!

參考:芷菡:如何評價 MATLAB R2016b ?


瀉藥。

看這個吧:

Matlab tips and tricks

說來說去就是一句向量化。

無非就是用點運算符,用向量化函數啊balabala的。所以也沒什麼好說的了。

個人使用過程中有兩個神奇的函數accumarray和arrayfun,妙用無窮,應該doc一下。

另外繪動圖直接set句柄的"XData"加Drawnow效率簡直不要太高。

說實在的,Matlab就不要苛求效率了。

真對效率有要求,還是用C++吧。我都是C++算完直接用Matlab Engine Draw的。


少用for循環,儘可能用矢量運算。


  • 應該避免使用循環:優先考慮用向量化的運算來代替循環操作
  • 在必須使用多重循環時,循環次數少的放在外層,循環次數多的放在內層
  • 先給數組分配好空間再使用
    • 給數值型數組分配空間,優先使用 zeros 和 ones
    • 給單元數組分配空間,使用 cell
    • 給結構體分配空間,使用 struct
    • 擴充數組,使用 repmat
  • 優先使用 MATLAB 內建函數
  • 盡量使用函數而不要使用腳本(腳本文件轉換為函數文件的方法很簡單,就是在文件的開頭加一行無輸入參數和輸出參數的函數聲明即可)


對於mento carlo 類模擬,實用parfor+區域網並行。只要你的硬體資源足夠,mento carlo的運算次數可以忽略。

使用區域網並行之前,需要算半天。用了並行後幾分鐘搞定。腰不酸腿也不痛了。


用新的版本,寫自己的腳本


多用矩陣操作,避免循環


盡量把index轉換成矩陣運算。

比如有一個10000X1的向量x,你想要取出其中5000個值c=(c1, c2, ..., c5000),那可以直接用x(c)這種indexing,但是也可以先生成一個5000X10000的sparse matrix,C,其中(j,cj)元素為1,然後CX能給出同樣的結果,但是速度要快很多。

這個方法在value function迭代的時候很有用,因為矩陣C一般都是固定的,只需要生成一次,這樣能省更多時間。


推薦閱讀:

【辦公軟體】- PA口袋動畫,PPT小白也可輕鬆製作炫酷動畫
在公司里使用番茄工作法,如何有效而禮貌地告知別人自己在番茄中?
我是熬夜做完呢?還是早起再做呢?

TAG:學習 | 效率 | MATLAB |