为什么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
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Error using ScratchPaperFile>(parfor supply)
Index exceeds the number of array elements (6000).
Error in ScratchPaperFile (line 10)
parfor j = 1 : imgCount
Run Code Online (Sandbox Code Playgroud)
@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.
Run Code Online (Sandbox Code Playgroud)
正是对整体的访问non_crack_bytes迫使分析将其视为“广播”变量,这就是防止错误的原因。
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |