matlab - 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
解决方案
@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
迫使分析将其视为“广播”变量,这就是防止错误的原因。
推荐阅读
- wordpress - 更改 Wordpress REST 响应
- javascript - 避免出现 Bootstrap 灯箱滚动条
- java - 使用动态参数弹簧批处理在foreach循环中运行作业
- java - 尝试在 sublime 中构建 Latex 文档会导致 Java 错误
- python - 我该如何解决这个问题:错误:命令出错,退出状态为 1:尝试“pip install psycopg2”时
- c - 头文件中辅助函数中的动态内存分配问题
- django - 如何从 ModelForm 访问外键/ OneToOneField 表的数据?
- database - 带有 SQFlite 的“警告数据库已被锁定”警告和代码停止。为什么我不能查询表?
- api - 如何将 API 响应正文或属性保存在环境变量或 json 中,以便以后在赛普拉斯的其他请求中使用它
- python - 摆脱文件中的特定单词