在MATLAB中与parfor并行化

时间:2014-05-16 05:50:04

标签: matlab parfor

我正在尝试在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×p矩阵,Xmj是1乘p矢量。错误是针对X_train的。通过阅读文档,我看到必须在parfor循环中修复每个变量的索引。即使我注释掉行X_train(bin_n, p) = X_train(bin_n, p) + 1;(其中X_train的索引与其他两行不同),我仍然会收到错误。有人可以解释为什么以及我如何解决它?

2 个答案:

答案 0 :(得分:1)

分析

我自己不能尝试,但似乎你试图在parfor循环的几个实例中写同样的东西。

好像是

X_train(bin_n,:)=Xmx

每次输入parfor时都会出现,具体来说:X_train(1,:)会被@Daniel提到的很多次覆盖。


解决方案

以下是您可以做的事情:

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

     `X_train(c,bin_n,:)`
    

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

答案 1 :(得分:0)

我回答了类似的问题over here。 MATLAB不知道如何处理

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

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

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