%unknown input parameters are: rice_h, rice_den
clc
close all
clear all
global function_in
rice = imread('rice30.tif', 'tiff');
sar_16bit=imread('rs0914-hh.tif','tiff');
[row col]=size(sar_16bit);
rice_h=uint16(zeros(row,col));
rice_den=uint16(zeros(row,col));
err=uint16(zeros(row,col));
bounds=[100,120;250,350]; % Set lower/heigher bounds of [height, density]
X = zeros(2,1);
FVAL = 0;
function_in = zeros(1);
%you need to change the i, j following the size of your image.
for i = 1:row % 1586
for j = 1:col % 2430
fprintf(1,'i = %d, j = %d\n',i,j);
% save line.dat i -ascii
if rice(i,j) <= 0
rice_h(i,j) = 0;
rice_den(i,j) = 0;
err(i,j) = 0;
else
function_in = -0.001*single(sar_16bit(i,j))-2.0;
initPop=initializega(300,bounds,'usereval');
[bestx endPop]= ga(bounds,'usereval',[],initPop,[1e-6 1 1],'maxGenTerm',20,...
'normGeomSelect',[0.08],['arithXover'],[2 0],'nonUnifMutation',[4 20 3]);
rice_h(i,j) = uint16(bestx(1,1));
rice_den(i,j) = uint16(bestx(1,2));
err(i,j) = uint16(1000*myfunction(bestx(1:2)));
end
end
end
%save finish.dat i -ascii
imwrite(rice_h,'rice914_h.tif','tiff');
imwrite(rice_den,'rice914_den.tif','tiff');
imwrite(err,'err914_1000.tif','tiff');
答复:
(1)坦白的讲,上面的程序太乱了,模块化程度较差,所以交流起来费劲。
(2)parfor中可以嵌套for循环,但是有一些限制,特别是内外两层循环变量使用起来需要特别注意。对于复杂的应用,我不建议这么用。最好的办法是将内层循环用函数封装,函数里面可以再调用for等语句,
这样限制小得多,而且程序容易管理。
(3)具体到您的程序,起始没必要二层循环,直接一层循环就可以了。因为你所有的索引都是(i,j),将二维阵列看作一维阵列循环就可以。
(4)有一个疑问:没有运行你的程序,但是gp调用第一个参数都是目标函数句柄吧(只是疑问,不太熟悉:))
(5)具体到程序优化有几个问题,其中“fprintf出现在正式程序里面太不应该了”;另外,应当遵循先模块化后性能优化的基本思路,程序或开发思路不清晰,优化很难做到最佳。
% % % 1、涉及两个for循环,我需要怎样去优化让他计算的效率高一些呢?
% % % 2、如果我用您文章里提到的mtlab通用并行程序设计里章节里,用parallel job能否实现并行计算?需要怎么样修改?
答复:这个要看具体应用,具体您的应用,暂时没看出来parallel job的优势
% % % 3、另外文字中要设定两个属性(见pg164)
% % % set(pjob,'MaximumNumberOfWorkers',4)
% % % set(pjob,'MiniimumNumberOfWorkers',4)
% % % 这里的两个值“4”有限定呢?(早期查资料如果用spool的话2009是8个核心限制2010是12核心限制?),目前我拥有10个节点,每个节点8核的cluster集群。
答复:不用PCT的local配置,用job manager,没有限制,有多少节点就可以启动多少WORKER或LAB。
% % % 4、我现在使用的是10个8核节点的集群,linux 系统,matlab2012a版本,下面这一段能否利用其80个核心来呢?
答复:完全可以。但是如果采用parfor,启动matlabpool时请采用job manager作为scheduler。
% % % jobmanager已经启动,并且80个worker也已经启动
% % tic
% % jm = findResource('scheduler','type','jobmanager','Name','jobm','LookupURL', 'mu01');
% % job = createJob(jm);
% % set(job, 'FileDependencies', {'hp.m'})
% % set(job,'MaximumNumberOfWorkers',80)
% % set(job,'MinimumNumberOfWorkers',80)
% % N = 5000;
% % M = 100000;
% % t=createTask(job, @hp, 1, {M, N});
% % submit(job)
% % waitForState(job, 'finished');
% % results = getAllOutputArguments(job)
% % toc
% %
% % % ######
% % %hp.m