【问题标题】:Using parfor on submatrix in matlab在matlab中的子矩阵上使用parfor
【发布时间】:2011-12-23 02:41:15
【问题描述】:

我有一段代码将图像矩阵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

【问题讨论】:

    标签: for-loop parallel-processing matlab


    【解决方案1】:

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

    首先我假装输入你的形状,以及一个简单的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
    

    【讨论】:

      【解决方案2】:

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

      与其将您的图像拆分为单元阵列中的较小部分,不如考虑将其转换为distributed array,也许与您当前所做的分配相同的部分。在spmd 块中,您可以执行doWork 函数,它将应用于该工作程序上存在的(共同)分布式数组的任何部分。最后,您可以将结果汇总并gather 将它们返回给客户端。

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

      【讨论】:

      • 你能举个例子吗?我有一张图像,我想对其应用过滤器。例如,半径为 5 的过滤器。并行化它的最佳方法是什么?谢谢。
      【解决方案3】:

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

      【讨论】:

      • 您能说明如何做到这一点吗?子矩阵的大小不同,例如img=[4x7] 变为 C=[3x3 3x3 3x1;1x3 1x3 1x1]。
      • @Usavich:我的意思是单元阵列。如果你写outC{i + j*colc} = ...,然后调用reshape,它是否有效?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多