0

我正在尝试在 MATLAB 中并行化一个循环,并收到一条错误消息,指出“'X_train' 的有效索引在 PARFOR 循环中受到限制。” 我的代码如下:

parfor c = 1:num_channels

% sum_n_train calculated here

for n = 1:sum_n_train
    bin_n = bin(n);

    Xmj = X_train(bin_n, :);

% some calculations happen in between

    X_train(bin_n,:) = Xmj;
    X_train(bin_n, p) = X_train(bin_n, p) + 1;

    z_train(n)= zind;
end

z_train_cell{c} = z_train;
end

X_train 是一个 n x p 矩阵,Xmj 是一个 1 x p 向量。错误是针对 X_train。通过阅读文档,我看到每个变量的索引必须在 parfor 循环中固定。但是,即使我注释掉该行X_train(bin_n, p) = X_train(bin_n, p) + 1;(它的 X_train 索引与其他两行不同),我仍然会收到错误消息。有人可以解释一下为什么以及如何解决它吗?

4

2 回答 2

1

分析

我自己无法尝试,但似乎您正在尝试在parfor循环的多个实例中写入相同的内容。

这好像是

X_train(bin_n,:)=Xmx

每次输入 parfor 时都会发生,特别是:X_train(1,:)正如@Daniel 提到的那样被覆盖很多次。


解决方案

这是您可以执行的操作:

  1. 一行一行注释掉,从最简单的一行开始,直到错误消失
  2. 为注释掉的行中分配给的所有变量添加维度。这应该使它们的分配不重叠。

例子:

 `X_train(c,bin_n,:)`

然后再次取消注释并运行代码!如果问题仍然存在,您可能需要为更多变量添加维度。

于 2014-05-16T14:37:03.393 回答
0

我在这里给出了一个类似问题的答案。MATLAB 不知道如何处理

X_train(bin_n,:)
X_train(bin_n, p) = X_train(bin_n, p) + 1;

因为它需要在循环之前将 X_train 拆分到正确的处理器,但在计算索引 bin_n 之前它不知道如何拆分。简而言之,您不能保存到变量索引。

如果 bin 不重叠,那么您需要使用常量值对这些 bin 索引进行硬编码。如果箱确实重叠,那么它就像解决方案一样循环,取决于它运行的顺序(即您在 bin_n 位置更新 X_train,但通过 Xmj 使用它来计算遗漏部分中的其他内容),这意味着问题在它目前的形式无法通过 parfor 解决。

于 2016-01-21T20:36:25.973 回答