Performance 并行化大循环

Performance 并行化大循环,performance,matlab,for-loop,parallel-processing,Performance,Matlab,For Loop,Parallel Processing,我有一个大循环,我试图计算DEM中每个像素的某些属性(4800x6000)。我正在调用一个函数demPHV,在这个函数中,我对输出26个字段的结构的所有计算进行了矢量化。我有4个核,但也可以访问多核群集。我想加快运行此程序所需的时间 Z是本例中的dem。R是spatialref对象(例如,为了表示向量)。latlim和lonlim是美国西部海岸线lat和long的向量(在本例中是成对的)。 例如: Z=rand(48,60); R=makerefmat(120,40,.5,.5) latlim=

我有一个大循环,我试图计算DEM中每个像素的某些属性(4800x6000)。我正在调用一个函数demPHV,在这个函数中,我对输出26个字段的结构的所有计算进行了矢量化。我有4个核,但也可以访问多核群集。我想加快运行此程序所需的时间

Z是本例中的dem。R是spatialref对象(例如,为了表示向量)。latlim和lonlim是美国西部海岸线lat和long的向量(在本例中是成对的)。 例如:

Z=rand(48,60);
R=makerefmat(120,40,.5,.5)
latlim=[40:60]';
lonlim=[136:(143-136)/(length(latlim)-1):143]';
然后我的原始循环:

for col=11:size(Z,2)-11
    for row=11:size(Z,1)-11
        dpv=demPHV(Z,R,row,col,latlim,lonlim)

    fn=fieldnames(dpv);
    for k=1:length(fieldnames(dpv))
        DEM_PHV.(fn{k}).{row,col}=dpv.(fn{k});
    end
end
用于并行化的循环:

备选案文1:

[rows, cols] = meshgrid(12:(size(Z,1)-12), 12:(size(Z,2)-12));
inds = sub2ind(size(Z), rows, cols);
inds = inds(:)';
parfor i=inds(1):inds(end)
       dpv=demPHV(Z,R,i,latlim,lonlim)
end
这包括要在函数demPHV中使用的函数中的
[r,c]=ind2sub(大小(Z),i)

备选案文2:

parfor col=11:size(Z,2)-11
    for row=11:size(Z,1)-11
         dpv=demPHV(Z,R,row,col,latlim,lonlim)
    end
end
parfor需要连续整数,因此需要进行一些更改。我必须排除边界上的11行和11列,因为我的函数使用周围的像素来计算一些属性

所以,我的问题是:

  • 您是否希望这两个选项中的任何一个比另一个更快
  • parfor不允许我包含原始循环的第二部分:

    for col=11:size(Z,2)-11
        for row=11:size(Z,1)-11
            dpv=demPHV(Z,R,row,col,latlim,lonlim)
    
        fn=fieldnames(dpv);
        for k=1:length(fieldnames(dpv))
            DEM_PHV.(fn{k}).{row,col}=dpv.(fn{k});
        end
    end
    
    fn=字段名(dpv)

    k=1的
    长度(字段名(dpv))

    DEM_PHV.(fn{k})。{row,col}=dpv.(fn{k})

    end

  • 在此期间,我将输出结构分配给另一个变量。最终目标是让变量DEM_PHV具有我需要的每个属性的字段,并且每个字段都是矩阵大小(Z),其中每个单元格都是该属性的对应值。我试图让我的函数在矩阵的正确单元格中输出值,但是我得到了一个矩阵大小(Z),除了位置
    行,列
    处的值外,其他地方都是
    []
    。这似乎是一个非常低效的内存使用。。。还有更好的建议吗?我希望我涵盖了一切。
    谢谢你的关注

    我得到了以下代码来工作,并将每个函数结果存储到一个结构数组中。不过可能有更好的方法,因为现在我需要从结构中的每个字段中提取每个值,并将其放入自己的矩阵中

    有没有人建议创建这样的东西:
    DEM_PHV=struct('field1',[dPHV{:}.field1],'field2',[dPHV{:}.field2])
    ,其中每个字段中的每个矩阵都是
    大小(Z)
    。矩阵中的单元格将包含单个值或一对值,如[lat,long]

    dPHV=cell(110,110);
    parfor col=11:110%size(Z,2)-11
        for row = 11:110%size(Z,1)-11
           pixel_attributes=demPHV(Z,R,row,col,latlim,lonlim); %function produces structure of variables, each iteration is another pixel
           dPHV{row,col}=structfun(@(x) x,pixel_attributes,'UniformOutput',false)   
        end
    end  
    
    编辑:尽管这可能很麻烦,但以下内容可以用于重新分配变量。我很乐意接受关于更巧妙的“MATLAB”方式的建议

    % find all field names and get size of output
    fn=fieldnames(dPHV{11,11});
    [I, J]=size(dPHV);
    
    %initialize final output
    for f=1:numel(fn)
        DEM_PHV.(fn{f})=cell(size(dPHV));
    end
    % loops through datastructure to populate new fields
    for i=11:I-11
        for j=11:J-11
            for f=1:numel(fn)
                DEM_PHV.(fn{f}){i,j}=dPHV{i,j}.(fn{f});
            end
        end
    end