matlab双循环语句,双for循环的语句如何修改为matlab语句?

%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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值