我有一个句柄类:
classdef A<handle
properties
a;
end
methods
function obj = A(a)
obj.a=a;
end
end
end
我有一个A
个对象的单元格数组:
arr={};
for i=1:3
arr{i}=A(i);
end
我想要做的是将该单元格数组传递给parfor
循环,以便每个对象的值都会改变:
parfor i=1:3
arr{i}.a=i*5;
end
但是,此代码根本不会更改arr
。的确,here它表明了
在循环迭代期间对worker处理类所做的更改不会自动传播到客户端。
我怎样才能克服这个?
答案 0 :(得分:7)
一个有趣的问题;我实际上从未遇到过这个问题。了解parfor
限制的所有内容总是很好,所以我做了一些googlin'并提出了this:
我从技术支持部门得到了这个问题的答案。 显然,Mathworks将其视为一个改变的“特征” 对象不会被返回 - 虽然我看不出它是非常有用的 特征。无论如何,返回修改类属性的方法 从parfor循环中可以做出明确的改变 由parfor认可。以下是两个适用于上述内容的示例 示例对象:
parfor n = 1:num exArray(n).data = n:n+5; end
或
parfor n = 1:num temp = exArray(n); setData(temp,n:n+5); exArray(n) = temp; end
实际上,如果你改变任何对象属性,它似乎也有效。所以 例如,如果有第二个属性data2,这也有效 显式设置,正确返回数据和数据2:
parfor n = 1:num setData(exArray(n),n:n+5); exArray(n).data2 = n:n+5; end
示例对象由
给出classdef Example < handle
properties
data
end
methods
function obj = Example(data)
obj.data = data;
end
function setData(obj,data)
obj.data = data;
end
function data = getData(obj)
data = obj.data;
end
end
end
并将数组简单地初始化为
% Initialise array of objects
for n = 1:num
exArray(n) = Example(zeros(1,6));
end