主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

parfor 循环中使用对象和句柄

对象

当您运行 parfor 循环时,您可以将广播变量或分段输入变量从客户端发送到工作单元,或者将分段输出变量从工作单元发送回客户端。每个向工作人员发送或从工作单元接收的对象都必须支持 saveload 函数。有关详细信息,请参阅对象的默认保存和加载过程

parfor 循环中不支持为对象的切片属性或结构体的切片字段赋值。

无效有效
s = struct;
parfor i = 1:4
    s.SomeField(i) = i;
end
parfor i = 1:4
    x(i) = i;
end
s = struct('SomeField',x);

有关第一级索引约束的更多信息,请参阅 分段变量

句柄类

您可以将句柄对象作为输入发送到 parfor 循环的主体。但是,在循环迭代期间对处理工作单元上的对象所做的任何更改都不会自动传播回客户端。也就是说,循环内所做的更改不会在循环后自动反映。

为了让客户端反映循环后的变化,明确将修改后的句柄对象分配给 parfor 循环的输出变量。在下面的示例中,maps 是一个分段输入/输出变量。

m1 = containers.Map;
m2 = containers.Map;
m3 = containers.Map;
maps = {m1,m2,m3};
parfor ii = 1:numel(maps)
    mymap = maps{ii};   % input slice assigned to local copy
    for jj = 1:1000
        mymap(num2str(jj)) = rand;
    end
    maps{ii} = mymap;   % modified local copy assigned to output slice
end
isequal(maps{1},m1) % false - maps{1} is no longer the same handle as m1.

引用函数句柄的分段变量

您不能直接使用循环索引作为输入参量来调用函数句柄,因为该变量无法与分段输入变量区分开来。如果必须使用循环索引变量作为参量来调用函数句柄,请使用 feval

下面的示例使用函数句柄和 for 循环。

B = @sin;
for ii = 1:100
    A(ii) = B(ii);
end

相应的 parfor 循环不允许 B 引用函数句柄。作为一种解决方法,可以使用 feval

B = @sin;
parfor ii = 1:100
    A(ii) = feval(B,ii);
end

另请参阅

主题