在parfor
循环内部,我试图调用一个无法访问global
的函数。
功能
function a = getA()
global OPTIONS;
a=OPTIONS.PROBLEM.A;
end
循环:
parfor i=1:3
b=getA();
end
错误:
Error using parallel_function (line 589)
Attempt to reference field of non-structure array.
我究竟做错了什么?
最佳答案
从parfor
上的documentation:
在您遇到问题的情况下,即在parfor
中调用一个函数,该函数又引用了global
,这表示:“parfor
可能不会给出预期或有意义的结果”。
这是很合理的。考虑以下
Lab 1: Lab 2:
GetB(); GetB();
如果
GetB()
的内容是这样的:function GetB()
global B;
%# do something useful
B = rand;
end
在
B
上引用Lab 1
的值将是什么?并在Lab 2
上?如何传达rand
的不同结果?一团糟!当编写适合
parfor
循环的代码时,如果该代码来自仅考虑正常for
-loops的东西,则可能会感到非常痛苦。通常,当您事先知道要编写一段计算量大的Matlab代码时,请从一开始就将所有函数和循环编写为parfor
循环。这是此类错误不会花费您一天代码转换功能的唯一方式。从
for
转换为parfor
就是,而不是琐碎的。