我有一段代码将图像矩阵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
答案 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
将其转换为矩阵。