MATLAB parfor广播变量的值不正确

Orw*_*ell 3 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
Run Code Online (Sandbox Code Playgroud)

... someboolean的值为'true',执行无效行导致以下错误:

使用bugscript时出错(第4行)
索引超出了矩阵维度.

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

我无法在互联网上找到遭受同样问题的其他人.谁能解释一下发生了什么?我正在使用MATLAB R2015a.

Sue*_*ver 7

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

在你的情况下,尝试访问a(i)发送到工人和它的这个过程(而不是环内容本身)会导致您看到的错误.

没有恐惧,广播变量的值,someboolean,在事实上false为你所期望的,你可以用下面的循环确认.

parfor i = 1:4
    disp(someboolean)
end
Run Code Online (Sandbox Code Playgroud)

作为一个解决方案,我只需要预先分配a值,以便切片a成功,并且有效数据可以发送给工作者(即使它没有被使用).

a = NaN(1,4);
Run Code Online (Sandbox Code Playgroud)