我正在尝试使用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循环无法运行。
我不明白如何解决这两件事。非常感谢任何帮助!
答案 0 :(得分:0)
据我了解,parfeval
负责根据可用的工作人数运行您的功能,这就是为什么它不需要被parfor
包围的原因。假设您已经有一个有效parpool
,将外部parfor
更改为for
可以消除这两个问题。
不幸的是,我不能用基准测试来支持我的答案,或建议更合适的解决方案,因为你的输入是未知的。
在我看来,代码可以通过其他方式进行优化,主要是vectorization。我建议您查看以下资源:
P.S。:(i = m+1:row-m,
i_options.cores)
的第二部分似乎不合适......