我们知道,matlab 更适合的处理对象是矩阵,而不是大规模的循环运算。当有时不得不使用 for 循环时,如果提高 for 循环的执行效率呢。这就是 parfor 的用武之地了,既然是并行运算,就是一次可以执行多次 iterations 处理(类似于操作系统的多线程作业),以加快循环的速度。与传统 for 循环最大的不同在于,parfor 执行迭代时并不按照一个确定的顺序(因此,需要求不同的迭代之间,彼此独立,不存在 A(i) = A(i-1)/A(i+1) 的情况,)。
i=1:100000;
j=1:100000;
Y=0;
parfor i=1:100000
for j=1:1:100000
Y=Y+i+j;
end
end
parfor注意事项?
- matlab默认是不能在parfor里面使用save函数的。因为matlab不知道要把工作区的哪个变量保存到内存中。但是有时候,你的实验里确实需要保存中间的结果,那么matlab还是有解决方案的:1)你可以将需要保存文件的操作放进另一个函数里进行操作,然后再当前的parfor循环体内调用这个函数parsave[1, 2](链接中有具体的代码参考)。2)你也可以不用save的操作,在需要保存的数据后断点,然后自己实现保存操作。
- 用parfor循环的下标必须为连续的递增整数。
————————————————图形化使用方法
简单步骤如下:
1.点击matlab最底下左边的正三角标号,选择“start parallel pool”(当然用其他方式开启也可以);
2.将符合条件的循环for改成parfor即可开始并行运算。
3.payfor不可循环嵌套
parfor要求循环中的数据没有上下依赖,每个循环之间相互独立,这样才能在多个处理器上运行并行任务。
% 读取数据
path1="C:\Users\32649\Desktop\nc\test\Brother\+0.1\differ_+0.1.nc";
nlat=double(ncread(path1,'lat')); %读取纬度变量,为二维数据省略meshgrid
nlon=double(ncread(path1,'lon')); %读取经度变量
pr=double(ncread(path1,'discharge')); %获取变量数据
[mlat,mlon]=meshgrid(nlat,nlon);
mkdir('img') %创建img子文件夹
par=parpool('local', 6); %设置6个处理器
% 展示
parfor day=1:size(pr,3) %展示第几层的数据,数据依赖于nc文件,层数代表时间`
m_proj('miller','lon',[85 131],'lat',[18 38]); %设置投影方式,经纬度范围,经纬度范围可以提前在arcgis中查看(这里对应的经度:85-131;纬度:18-38)
m_contourf(mlon,mlat,pr(:,:,day),'linestyle','none');
% colormap(flipud(m_colmap('hsv')));%设置颜色legend
color=cbrewer2('div','RdBu',10,'linear');% 生成PuBu的配色方案的color矩阵,10就是把色带分为10份
colormap(color);%将color配色用于colormap
hold on
m_coast('line','Color', [.5 .5 .5]);% 只保留轮廓线
% m_grid('linestyle','none','box','fancy','tickdir','out','LineWidth',0.5); %设置网格
m_grid %设置网格
colorbar;
% set(gca,'CLim',[-60,20]) %指定颜色范围,这里是-60到20
title(['time: ', num2str(day)]) %设置标题
hold off
saveas(gcf, ['img\', num2str(day), '.jpg'])
end