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就是,而不是琐碎的

10-08 16:12