在MATLAB中使用parfor实现数组的间接索引

在MATLAB中使用parfor实现数组的间接索引,matlab,parallel-processing,parfor,Matlab,Parallel Processing,Parfor,我目前正在尝试并行化我的脚本,以获得运行时的好处 我的代码包含一个段,当以非常抽象的方式表示时,该段具有以下形式: 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. 要分配的索引始终是不相交的

我目前正在尝试并行化我的脚本,以获得运行时的好处

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

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]
),即在并行运行期间不会覆盖条目,否则会危及非顺序处理


是否有其他方法可以重新格式化此功能?

由于输出大小正在更改,我将使用结构

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

MATLAB无法提前知道所应用的拆分是不相交的。你需要明确这一点。例如,通过收集单元格数组中的输出,并在完成处理后将其重新组合为
x
。应预先分配
temp
,以防止调整大小。您也可以使用
temp{i}=…
,而不是结构数组,它看起来更简单。@CrisLuengo我用单元格数组编辑了它。它也不需要预分配。在这段代码中,
temp{i}
将在每次循环迭代中放大单元数组,这意味着它将需要重新分配。不会复制单元格数组的内容,但会复制单元格数组本身。在如此短的循环中,您不会注意到这一点,但通常这会显著降低代码的速度。只需在循环之前执行
temp=cell(2,1)
即可预分配单元数组。我测试过了,您是对的。我认为页面意味着不需要预先分配。