【问题标题】:MATLAB Slicing variable for PARFOR loopsPARFOR 循环的 MATLAB 切片变量
【发布时间】:2016-09-12 22:01:02
【问题描述】:

我正在尝试在MATLAB 中使以下循环并行友好,以便我可以使用parfor

for ivert = 1 : nVerts
    b = obj.f( obj.neighIDs{ ivert } ); 
    x = obj.coeffMatrix{ ivert } \ b;
    obj.solution( ivert, : ) = x( 1 : 3 );
end

我尝试根据here 发布的 MATLAB 文档对变量进行切片:

parfor ivert = 1 : nVerts
    i = obj.neighIDs{ ivert };
    b = obj.f( i ); 
    A = obj.coeffMatrix{ ivert }
    x =  A \ b;
    obj.solution( ivert, : ) = x( 1 : 3 );
end

但 MATLAB 抱怨说:

Valid indices for `obj` are restricted in PARFOR loops.

有人可以给我一些提示如何在上述循环中分割变量吗?

【问题讨论】:

  • obj.f( i ) 的索引可能是问题所在。我猜 Matlab 不高兴,你在循环中计算索引。

标签: matlab for-loop parallel-processing parfor


【解决方案1】:

这里的问题是 MATLAB 看到您的 parfor 循环的前三行,并将它们视为 obj 上的索引表达式 - 它得出结论 obj 必须是 parfor“广播”变量。 parfor 循环的最后一行被视为obj 的索引赋值(即使它看起来像是obj 字段的索引赋值)。因为obj 已被归类为“广播”,所以您不能分配给它。要解决此问题,我建议您执行以下操作:

tmpSolution = zeros(nVerts, 3);
parfor ivert = 1:nVerts
    ... %# calculate 'x'
    tmpSolution(ivert, :) = x(1:3);
end
obj.solution = tmpSolution;

【讨论】:

  • 谢谢。您是否还建议定义一个函数来计算x 并在parfor 中使用它?
  • 很遗憾,我无法通过定义 tmpSolution 来解决问题。
  • 剩余的错误是什么?您是否用我的建议替换了parfor 循环中的obj.solution(...) = ... 行?我无法运行您的代码,但是进行该更改可以消除静态分析问题...
  • 感谢您的建议。是的,我确实改变了那条线。单元格不是parfor 友好吗?
  • 元胞数组与parfor 完美匹配。也许您可以发布更新的代码来演示您正在尝试什么以及您得到的确切错误是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多