Matlab 广播变量的值错误

Matlab 广播变量的值错误,matlab,broadcast,parfor,Matlab,Broadcast,Parfor,在这段最小的可执行代码中: a = []; workers = parpool('local',4); someboolean = false; parfor i = 1:4 if someboolean % broadcast variable b = a(i); % ERROR else b = 0; end end 。。。someboolean的值为“true”,执行无效行会导致以下错误: 使用错误脚本时出错(第4行) 索引超过了矩

在这段最小的可执行代码中:

a = [];
workers = parpool('local',4);
someboolean = false;
parfor i = 1:4
    if someboolean % broadcast variable
        b = a(i); % ERROR
    else
        b = 0;
    end
end
。。。someboolean的值为“true”,执行无效行会导致以下错误:

使用错误脚本时出错(第4行)
索引超过了矩阵维度

行号指的是最后一条非平行行,如果删除了
b=a(i)
赋值,则错误消失


我在网上找不到其他人也有同样的问题。有人能解释发生了什么事吗?我使用的是MATLAB R2015a。

问题是因为MATLAB执行静态代码分析,以确定每个工作人员在循环的每次迭代中需要哪些变量。由于它看到您正在访问循环内部的
a(i)
,因此它尝试获取该值,并在本地工作人员需要时将其提供给本地工作人员。的此行为对于通过仅发送该迭代访问的数据来减少发送给每个工作者的数据量是必要的。如果
a
有数千个值,并且每次迭代仅访问其中一个值,则这一点尤为重要。您只希望在
a
中发送单个条目,而不是发送整个数组

在您的情况下,它尝试访问
a(i)
以发送给工作进程,而您看到的错误是由这个过程(而不是循环内容本身)引起的

不用担心,广播变量
someboolean
的值实际上是
false
,正如您预期的那样,您可以使用以下循环来确认它

parfor i = 1:4
    disp(someboolean)
end
作为一种解决方案,我只需使用值预先分配
a
,以便
a
的切片成功,并且有效数据能够发送给工作人员(即使未使用)


我发现您的代码中有两个问题:

  • 所有工作进程都试图同时更新
    b
    变量。这不会导致错误,但会有未定义的行为。您将不知道哪个进程得到了最后一次更新

  • 您的
    a
    数组未初始化为至少有4个值,工作人员试图访问数组边界以外的区域。这会导致错误,您应该从初始化
    a
    开始

  • a = NaN(1,4);