首页 > 解决方案 > MATLAB parfor 索引超出数组元素的数量

问题描述

为什么即使 MATLAB 不应该转到 switch 语句的第一种情况,它也会抛出错误?下面是最小的例子:

mycase = 2;
non_crack_bytes = 1:6000;
syn_crack_bytes = 1:10000;
imgCount = 10000;
parfor j = 1 : imgCount
    switch mycase
        case 1
            if ~(non_crack_bytes(j) == 0)
                % Do something
            else
                continue;
            end
        case 2
            if ~(syn_crack_bytes(j) == 0)
                % Do something
            else
                continue;
            end
    end        
end

我得到的错误是:

Error using ScratchPaperFile>(parfor supply)
Index exceeds the number of array elements (6000).
Error in ScratchPaperFile (line 10)
parfor j = 1 : imgCount

标签: matlabparfor

解决方案


@David 的回答显示了一个有效的解决方法,但它起作用的原因并不完全是它看起来的全部。

为了运行parfor循环,MATLAB 分析循环中使用的每个变量并对它们进行分类。在原始代码中,non_crack_bytes被归类为“切片输入”变量——换句话说,MATLAB 认为循环的每次迭代都需要一个non_crack_bytes与循环索引对应的值j。错误发生在工作人员尝试读取之前很久non_crack_bytes- 客户端尝试发送non_crack_bytes它认为工作人员需要的元素时发生错误。(这就是错误提到“parfor supply”的原因,这是一些与发送切片循环输入相关的内部术语)。

@David 的修复non_crack_bytes在循环内部引入了额外的访问,将其从“切片输入”变量更改为“广播”变量。这意味着客户端将全部发送non_crack_bytes给每个工作人员。这就是为什么不会发生错误,而不是仔细索引的原因。实际上,您也可以像这样修复循环:

parfor j = 1:imgCount
    size(non_crack_bytes); % access whole of non_crack_bytes
    switch mycase
        case 1
            if non_crack_bytes(j) ~= 0
        ... % etc.

正是对整体的访问non_crack_bytes迫使分析将其视为“广播”变量,这就是防止错误的原因。


推荐阅读