【轉】提高matlab程式的執行速度
對於撰寫高效MATLAB程式碼,一些建議:
雖然for-loop的速度有了很大改善,vectorization(向量化)仍舊是改善效率的重要途徑,尤其是在能把運算改寫成矩陣乘法的情況下,改善尤為顯著。
在不少情況下,for-loop本身已經不構成太大問題,尤其是當迴圈體本身需要較多的計算的時候。這個時候,改善概率的關鍵在於改善迴圈體本身而不是去掉for-loop。
MATLAB的函式呼叫過程(非built-in function)有顯著開銷,因此,在效率要求較高的程式碼中,應該儘可能採用扁平的呼叫結構,也就是在保持程式碼清晰和可維護的情況下,儘量直接寫表示式和利用built-in function,避免不必要的自定義函式呼叫過程。在次數很多的迴圈體內(包括在cellfun, arrayfun等實際上蘊含迴圈的函式)形成長呼叫鏈,會帶來很大的開銷。
在呼叫函式時,首選built-in function,然後是普通的m-file函式,然後才是function handle或者anonymous function。在使用function handle或者anonymous function作為引數傳遞時,如果該函式被呼叫多次,最好先用一個變數接住,再傳入該變數。這樣,可以有效避免重複的解析過程。
在可能的情況下,使用numeric array或者struct array,它們的效率大幅度高於cell array(幾十倍甚至更多)。對於struct,儘可能使用普通的域(欄位,field)訪問方式,在非效率關鍵,執行次數較少,而靈活性要求較高的程式碼中,可以考慮使用動態名稱的域訪問。
雖然object-oriented從軟體工程的角度更為優勝,而且object的使用很多時候很方便,但是MATLAB目前對於OO的實現效率很低,在效率關鍵的程式碼中應該慎用objects。
如果需要設計類,應該儘可能採用普通的property,而避免靈活但是效率很低的dependent property。如非確實必要,避免過載subsref和subsasgn函式,因為這會全面接管對於object的介面呼叫,往往會帶來非常巨大的開銷(成千上萬倍的減慢),甚至使得本來幾乎不是問題的程式碼成為效能瓶頸。