gpt4 book ai didi

MATLAB parfor 索引超出数组元素的数量

转载 作者:行者123 更新时间:2023-12-03 23:34:08 28 4
gpt4 key购买 nike

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

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

最佳答案

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

要运行 parfor 循环,MATLAB 会分析循环中使用的每个变量,并classifies them .在原始代码中,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 的访问迫使分析将其视为“广播”变量,从而防止错误发生。

关于MATLAB parfor 索引超出数组元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63107591/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com