挖墳了…睡不著覺當個備忘錄記一下用過的方法吧
1. 循環向量化
2. 利用函數的矩陣輸入功能批量處理
3. 必須用for且費時的地方改成單層parfor,要是循環次數比cpu核數還少反而會拖慢程序
4. 非常大的矩陣的運算可以用gpuArray(這個在matlab 深度學習工具箱中深有體會)
5. 能用矩陣不要用cell,速度慢且占內存巨多
6. 對調用頻繁且費時的地方嘗試生成c ,寫成mex
7. 按編譯器提示先初始化矩陣大小(但我大部分時候還是懶得預先算矩陣大小…)
8. Matlab 是可以多開的,如果parfor不能改或者懶得改可以“人肉parfor”,也就是把一個for拆成幾段然后多開幾個matlab 一起執行,最后再合并結果,比較暴力哈哈
9. 費時的程序最后加個email發送程序,跑完直接把結果發郵箱里
10. 再想想
關于第6條前幾天做了個測試,自己造了個filter函數的小輪子,和內置函數,以及相應生成的mex函數的速度進行了對比,大體過程參考[Matlab] 濾波器filter函數造輪子及使用代碼生成進行速度優化 給個最后的結果吧:
可以看到自己寫的函數轉mex后速度能提升一個數量級,這其中主要也是C優化了MATLAB的for循環的功勞。