很抱歉,目前我无法将我的代码简化为一个最小的示例。这是一大堆图像处理代码。
我有一个循环遍历图像(变量 stphogs 中的描述符),并为每个图像运行一个检测。
function hogpatches = extractDetectionsFromImages(stphogs, poselet)
hogpatches = cell(1,length(stphogs));
parfor i = 1:length(stphogs)
tmp = extractDetectionsFromImage(stphogs(i), poselet); %e.g. 1x6 struct
if ~isempty(tmp)
hogpatches{i} = tmp;
end
end
hogpatches = cell2mat(hogpatches);
end
所以这是主循环。但是函数调用extractDetectionsFromImage
非常深入。
我的问题:用普通的 for 循环运行它会得到正确的结果。如上所述使用 PARFOR 时,hogpatches
仅包含 5 个而不是 18 个结构。
我可以从哪里开始寻找错误?我有一个全局变量,程序确实改变了。我已经删除了。仍然有一个全局变量“配置”,但只能读取。还有其他提示吗?可能是什么问题呢?
编辑:即使我只运行一次迭代(stphogs 的大小为 1),parfor 也会失败。它与零件没有任何关系isempty
。如果我删除它,问题仍然存在。
EDIT2:好的,我把它煮成了一个最小的工作示例。它确实是由一个全局变量引起的:
function parGlobalTest()
global testVar;
testVar = 123;
parfor i = 1:1
fprintf('A Value: %d\n', testVar);
testFunction();
end
end
function testFunction()
global testVar;
fprintf('B Value: %d\n', testVar);
end
在这个例子中。A 的输出为 123,B 的输出为空(未定义)。这是为什么?