【问题标题】:Using parfor in MATLAB for indirect indexing of an array在 MATLAB 中使用 parfor 对数组进行间接索引
【发布时间】:2018-11-03 03:41:13
【问题描述】:

我目前正在尝试并行化我的脚本以获得运行时优势。

我的代码包含一个段,当以非常抽象的方式表示时,它具有以下形式:

x=zeros(5,1);

y{1}=[1; 3; 5];
y{2}=[2; 4];

parfor i=1:2
    x(y{i})= func(y{i});
end

所以,我想不按顺序填充变量x 的索引,而是以并行方式填充。然而,这给了我以下错误:

The variable x in a parfor cannot be classified.

要分配的索引总是不相交的(例如示例 [1; 3; 5][2; 4]),即在并行运行期间不会发生条目覆盖,否则会危及非顺序处理。

是否有其他方法可以重新构造此功能?

【问题讨论】:

  • MATLAB 无法提前知道您应用的拆分是不相交的。你需要明确这一点。例如,将输出收集到一个元胞数组中,并在完成处理后将它们重新组合成x

标签: matlab parallel-processing parfor


【解决方案1】:

我会使用结构,因为输出大小在变化。

x=zeros(5,1);
y{1}=[1; 3; 5];
y{2}=[2; 4];

parfor i=1:2
    temp{i}= sin(y{i});
end

for i=1:2
    x(y{i})=temp{i};
end

【讨论】:

  • 您应该预先分配temp,以防止调整大小。您也可以使用temp{i}=...,而不是结构数组,这对我来说看起来更简单。
  • @CrisLuengo 我用元胞数组对其进行了编辑。它也不需要预分配。 mathworks.com/help/matlab/matlab_prog/…
  • 在此代码中,temp{i} 将在每次循环迭代时扩大元胞数组,这意味着它需要重新分配。元胞数组的内容不会被复制,但元胞数组本身会。在这么短的循环中您不会注意到这一点,但通常这会显着减慢您的代码。只需在循环前执行temp=cell(2,1) 即可预分配元胞数组。
  • 我测试过,你是对的。我认为该页面意味着不需要预先分配。
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多