MATLAB parfor切片3D数组

时间:2015-07-24 15:03:38

标签: algorithm matlab parfor sliding-window

我正在尝试使用parfor来加速我的代码。代码的目的是在3D图像上滑动3D方形窗口,并为每个mxmxm块应用函数。

我写了这段代码:

function [ o_image ] = SlidingWindow( i_image, i_padSize, i_fun, i_options )
%SLIDINGWINDOW Summary of this function goes here
%   Detailed explanation goes here

o_image = zeros(size(i_image,1),size(i_image,2),size(i_image,3));
i_image = padarray(i_image,i_padSize,'symmetric');
i_padSize = num2cell(i_padSize);
[m,n,p] = deal(i_padSize{:});
[row,col,depth] = size(i_image);
windowShape = i_options.windowShape;
mask = i_options.mask;
parfor (i = m+1:row-m,i_options.cores)
    temp = i_image(i-m:i+m,:,:);
    for j = n+1:col-n
        for h = p+1:depth-p
            ii = i-m;
            jj = j-n;
            hh = h-p;
            temp = temp(:,j-n:j+n, h-p:h+p);
            o_image(ii,jj,hh) = parfeval(i_fun, temp, windowShape, mask);
        end
    end
end

end

我得到一个警告和一个我不明白如何解决的错误。 警告说:

  

整个数组或结构'i_image'是一个广播变量。

错误说:

  

由于使用变量'o_image'的方式,PARFOR循环无法运行。

我不明白如何解决这两件事。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

据我了解,parfeval负责根据可用的工作人数运行您的功能,这就是为什么它不需要被parfor包围的原因。假设您已经有一个有效parpool将外部parfor更改为for可以消除这两个问题

不幸的是,我不能用基准测试来支持我的答案,或建议更合适的解决方案,因为你的输入是未知的。

在我看来,代码可以通过其他方式进行优化,主要是。我建议您查看以下资源:

P.S。:(i = m+1:row-m, i_options.cores) 的第二部分似乎不合适......