我正在尝试在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的索引与其他两行不同),我仍然会收到错误。有人可以解释为什么以及我如何解决它?
答案 0 :(得分:1)
我自己不能尝试,但似乎你试图在parfor
循环的几个实例中写同样的东西。
好像是
X_train(bin_n,:)=Xmx
每次输入parfor时都会出现,具体来说:X_train(1,:)
会被@Daniel提到的很多次覆盖。
以下是您可以做的事情:
示例:
`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解决。