For loop 在matlab中对子矩阵使用parfor

For loop 在matlab中对子矩阵使用parfor,for-loop,parallel-processing,matlab,For Loop,Parallel Processing,Matlab,我有一段代码,将图像矩阵img分割成小块,并并行处理。但是Matlab说不能使用parforloop,因为outC{i,j}的方式是索引的。我该如何解决这个问题 子矩阵的大小不同。如果img=[4x7],则 C=[3x3 3x3 3x1; 1x3 1x3 1x1] 另一方面,我不确定在这里使用单元阵列是否是一个好主意。如果没有,也可以就如何划分img提出建议 C=mat2cell(img, rowSplit, colSplit); [rowc,colc]=size(C); outC=ce

我有一段代码,将图像矩阵
img
分割成小块,并并行处理。但是Matlab说不能使用
parfor
loop,因为
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

只需构建一个输出向量,然后使用
重塑
将其生成矩阵。

只需构建一个输出向量,然后使用
重塑
将其生成矩阵。

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

首先,我假装输入您的形状,并使用一个简单的
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

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

首先,我假装输入您的形状,并使用一个简单的
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

尽管这里有许多答案可以帮助您使用
parfor
块来完成所需的工作,但我认为更好的解决方案可能是使用块

不要把你的图像分割成一个单元格数组中的较小部分,而是把它转换成一个,也许在与你当前正在做的相同的部分上分布。在
spmd
块中,您可以执行
doWork
函数,并且它将应用于该worker上存在的(协同)分布式阵列的任何部分。最后,您可以组合结果并将其返回给客户机


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

虽然这里有很多答案可以帮助你使用
parfor
块来做你需要的事情,但我认为更好的解决方案可能是使用块来代替

不要把你的图像分割成一个单元格数组中的较小部分,而是把它转换成一个,也许在与你当前正在做的相同的部分上分布。在
spmd
块中,您可以执行
doWork
函数,并且它将应用于该worker上存在的(协同)分布式阵列的任何部分。最后,您可以组合结果并将其返回给客户机


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

你能演示一下如何做到这一点吗?子矩阵的大小不同,例如img=[4x7]变为C=[3x3 3x3 3x1;1x3 1x3 1x1]。@Usavich:我是指单元数组。如果您编写了
outC{i+j*colc}=…
,然后调用
reformate
,它是否有效?您能演示一下如何做到这一点吗?子矩阵的大小不同,例如img=[4x7]变为C=[3x3 3x3 3x1;1x3 1x3 1x1]。@Usavich:我是指单元数组。如果您编写了
outC{i+j*colc}=…
,然后调用
reformate
,它是否有效?您能给出一个代码示例吗?我有一个图像,我想在上面应用一个过滤器。例如,半径为5的过滤器。最好的办法是什么?谢谢。你能举个代码的例子吗?我有一个图像,我想在上面应用一个过滤器。例如,半径为5的过滤器。最好的办法是什么?非常感谢。