做量化操作的时候经常需要使用到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