parfor
循环如果你将对象传递给parfor
-loop时,对象必须便于保存和加载。有关更多信息,请参见对象的保存和加载过程.
由于一级索引约束,不能对对象的字段进行切片。有关详细信息,请参见切变量.
例如,在左边的代码中,由于索引,循环中的两行都会生成一个分类错误。在右边的代码中,作为分段输出的解决方案,在循环中使用了单独的分段数组。然后在循环完成后分配结构字段。
无效的 | 有效的 |
---|---|
parfori = 1:4 outputData.outArray1(i) = 1/i;outputData.outArray2 (i) = i ^ 2;结束 |
parfori = 1:4 outArray1(i) = 1/i;outArray2 (i) = i ^ 2;结束outputData =结构(“outArray1”outArray1,“outArray2”, outArray2); |
可以将句柄对象作为输入发送到parfor
循环。但是,在循环迭代期间为处理工作者上的对象所做的任何更改不会自动传播回客户机。也就是说,在循环内部所做的更改不会在循环之后自动反映出来。
要在循环之后将更改返回给客户端,可以显式地将修改后的句柄对象赋给parfor
循环。在下面的例子中,地图
是一个切片的输入/输出变量。
地图= {containers.Map (), containers.Map (), containers.Map ()};parforIi = 1:numel(maps) mymap = maps{Ii};分配给本地副本的%输入片为mymap(num2str(Jj)) = rand;结束地图{2}=关联;分配给输出片的修改本地副本结束
不能直接将循环索引作为输入参数调用函数句柄,因为这个变量不能与切片输入变量区分开来。如果必须使用循环索引变量作为参数调用函数句柄,请使用函数宏指令
.
下面的示例使用函数句柄和为
循环。
B = @sin;为A(ii) = B(ii);结束
一个相应的parfor
-loop不允许B
引用函数句柄。你可以使用函数宏指令
.
B = @sin;parforA(ii) = 1; B (ii) = 1;结束