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