在matlab中使用parfor on submatrix

时间:2011-11-06 15:44:38

标签: for-loop parallel-processing matlab

我有一段代码将图像矩阵img分成小块并平行处理它们。但是Matlab说parfor循环不能被使用,因为outC{i,j}被索引的方式。我该如何解决这个问题?

子矩阵的大小不同。如果是img=[4x7],那么

C=[3x3 3x3 3x1;
   1x3 1x3 1x1]

另一方面,我不确定在这里使用单元阵列是否是一个好主意。如果没有,请随时就如何划分img提出建议。

C=mat2cell(img, rowSplit, colSplit);
[rowc,colc]=size(C);
outC=cell(rowc,colc);
parfor i=1:rowc
    for j=1:colc
       outC{i,j}=doWork(C{i,j}); 
    end
end

3 个答案:

答案 0 :(得分:4)

您可以对输入和输出使用线性索引。

首先,我假装输入你的形状,以及一个简单的doWork函数:

>> C= {rand(3) rand(3) rand(3,1); rand(1,3) rand(1,3) rand(1)};
>> C
C = 
    [3x3 double]    [3x3 double]    [3x1 double]
    [1x3 double]    [1x3 double]    [    0.3922]
>> doWork = @(x)2*x;

然后使用线性索引:

>> outC=cell(size(C));
>> parfor ci=1:numel(C)
     outC{ci} = doWork(C{ci});
   end

快速检查一下它是否有效:

>> outC{2,1}./C{2,1}
ans =
     2     2     2

答案 1 :(得分:1)

虽然这里有很多答案可以帮助您使用parfor块来完成您的需要,但我认为更好的解决方案可能是使用spmd块。

而不是将图像分割成单元格数组中的较小部分,而是考虑将其转换为distributed array,或者分布在您当前正在执行的相同部分中。在spmd块中,您可以执行doWork函数,它将应用于该工作者上存在的(共)分布式数组的任何部分。最后,您可以将结果和gather组合回客户端。

我发现spmd要比parfor更难掌握,但是一旦你了解它就会非常强大;我认为这个例子可以用这种形式非常方便地表达出来。

答案 2 :(得分:0)

只需构建一个输出向量,然后使用reshape将其转换为矩阵。