MATLAB for循环的改善方法
前段时间做了大数据仿真计算,计算了百万个样本,其中采用了for循环结构,居然花费了半天的时间才运行完,那么如何改善这个循环体使它能花费更短的时间来运行。我采用了将for循环改变成多维向量计算的方法。
测试代码(截取)如下:
for step=1:100
sigma=0;
data_f1=[];
data_f2=[];
data_f=[];
for i=1:m;
if ((i>=(step+1))&(i<=m-step))
for j=-step:step
sigma=sigma+(csv(i-j,3)-1)^2;
end
f1=(sigma./(2*step)).^0.5;
data_f1=[data_f1;f1];
sigma=0;
else
f2=abs(csv(i,3)-1);
data_f2=[data_f2;f2];
end
data_f=[data_f2(1:step,:);data_f1;data_f2((step+1):(2*step),:)];
[P1_fi,p]=corr(csv(1:m,1),data_f);
data_corr=[data_corr;P1_fi];
end
我们看到,在这个结构中,为了计算样本在定义公式下的值,包含有3个for循环嵌套结构和一个if条件语句,尽管工作重复但是在上百万个样本下Matlab运行速度还是非常慢的。
现在的代码可以看作是一个很长的一维向量逐个做着重复的计算,那么改进的思想就是把计算模型升几个维度,变成多维向量,相当于把百万个样本同时输入,按照条件语句选择计算路径。
改进代码如下:
for step=1:100%在1-100步进范围内,找到fai相关系数最大值所取的步长
i=(step+1):(m-step); %第一种情况,i在区间内
j=-step:step;
sigma=zeros(m-2*step,1);
i_x1=(ones(length(j)));
i_x2=i'.*(i_x1(1,:));
i_x3=ones(length(i),length(j));
sigma=(filename(i_x2-j.*i_x3,3)-1).^2;
sigma_juzhen=reshape(sigma',m-2*step,2*step+1);
f1=(sum(sigma_juzhen,2)./(2*step)).^0.5;
data_f1=f1;
i2=1:step;
i2=[i2,(m-(step-1)):m];
f2=abs(filename(i2,3)- mean(filename(:,3)));
data_f2=[data_f2;f2];
data_f=[data_f2(1:step,:);data_f1;data_f2((step+1):(2*step),:)];
[P1_fi,p]=corr(filename(1:m,1),data_f);
data_corr=[data_corr;P1_fi];
end
这样,我们将原来的for全部用向量代替,把简单的条件语句直接转化为分路后的计算模型,把原来“细水长流”式的逐个计算变为整体并行的多路计算,极大降低了程序运行时间,本研究模型也从半天多的运行时间优化为秒级运行时间。
所以在遇到大数据下的循环体计算,不妨可以转换为多维矢量,通过极短时间计算机负荷工作来换取更短的运行时间是提高程序可靠性的一个省时省力的好方法。
最后
以上就是勤恳蜜蜂最近收集整理的关于MATLAB for循环的改善方法MATLAB for循环的改善方法的全部内容,更多相关MATLAB内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复