做量化操作的時候經常需要使用到matlab編寫策略或者計算多因子,for循環非常慢,自己找了一些matlab中for循環的優化方法,for的部分每處理一個大矩陣都要花費大量的時間,這是不可避免需要遇到的問題~。
方法1:循環多不要緊,要緊的是循環嵌套得太多,要解決這個問題,需要從根本上找原因,用更好的數據結構和算法,從根源上減少對於循環的需求
方法2:將循環次數多的放在里面,循環次數少的放在外面做大循環
方法3:for循環中少用if——else if判斷,用switch——case,效率更高
方法4:多線程並發替代單循環么,盡可能利用CPU,比如用並行的parfor
1 for(int i = 0; i < 100; ++i) 2 { 3 a[i] = xxx; 4 }
優化:
1 for(int i = 0; i < 25; i += 4) 2 { 3 a[i] = xxx; 4 a[i + 1] = xxx; 5 a[i + 2] = xxx; 6 a[i + 3] = xxx; 7 }
減少循環次數,而且還能意外增加指令級的並行運算幾率,其次,用多線程,最簡單的就是openmp。要是對數據的處理,就用SSE指令什么的。
這樣下來。整個程序不不止快那么一點點
方法5:結合具體的循環,利用時間和空間的相互轉換,也就是用空間換時間
方法6:vectorization(向量化)處理后,例如通過對for循環的向量化,效率也有很大提高。
向量化實際上就是矩陣化,利用點運算代替for循環,利用matlab軟件強大的矩陣運算能力優化程序
1 sum1=0; 2 for i=1:100
3 for j=1:100
4 for k=1:100
5 d=i.^2+j.^2+k.^2; 6 sum1=sum1+d; 7 end 8 end 9 end
向量化之后
1 i=1:100;j=1:100;k=1:100; 2 sum1=sum(i.^2+j.^2+k.^2);
方法7:最基本的方面,別在窗口中顯示矩陣,每條語句的結尾加分號
方法8:找一台性能好的電腦,用服務器跑那就更好了!
PS:下面是一個測試,來區分優化前和優化后的時間效率問題,讀取mxm的矩陣。利用上述所提到的優化方式進行優化(具體怎么優化,還是根據實際情況進行優化,這里不做說明),如圖所示:
PS:如有問題,請留言,未經允許不得私自轉載,轉載請注明出處:http://www.cnblogs.com/xuliangxing/p/7372428.html