【发布时间】:2020-07-27 16:28:55
【问题描述】:
为什么即使 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
【问题讨论】:
-
我最好的猜测是,Matlab 试图在 parfor-entry 上变得聪明,并做了一些循环启发式,这在这种情况下是错误的。当您更改为 10.000 时,这将按预期工作,并且错误也发生在循环条目上。责备他们没有适当的调试消息或检查工具。
-
@Jay-Pi:这与聪明无关。 MATLAB 需要跨实例划分数据数组。检查循环内的代码,它看到两个数组以
j为索引,因此需要将这两个数组分开。但是其中一个不够大,所以会出错。如果它更聪明一点,它会注意到mycase是恒定的并且永远不会进入开关的一个分支,它会在分割数组之前优化该分支。 -
@CrisLuengo Matlab 不返回有用的消息也无济于事。 documentation 没有描述数组的划分或者我错过了什么?
-
@Jay-Pi:您的文档页面链接到此:mathworks.com/help/parallel-computing/…
-
@CrisLuengo 谢谢。不过,要求不在第一页上,这有点奇怪。