我有一个句柄类:
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 http://www.mathworks.com/help/toolbox/distcomp/bq__cs7-1.html它指出
在循环迭代期间处理工作线程上的类所做的更改不会自动传播到客户端。
我怎样才能克服这个问题?
一个有趣的问题;我其实从来没有遇到过这个问题。了解一切总是好的parfor
局限性,所以我做了一些谷歌搜索并想出了this http://www.mathworks.com/matlabcentral/answers/26604:
我已收到技术支持对此问题的答复。
显然 Mathworks 认为它是一个“功能”,可以更改为
对象没有返回 - 尽管我看不出它是非常有用的
特征。无论如何,返回修改后的类属性的方法
从 parfor 循环中进行显式更改可以是
被parfor认可。这是适用于上述内容的两个示例
示例对象:
parfor n = 1:num
exArray(n).data = n:n+5;
end
or
parfor n = 1:num
temp = exArray(n);
setData(temp,n:n+5);
exArray(n) = temp;
end
实际上,如果您更改任何对象属性,它似乎也可以工作。所以
例如,如果有第二个属性 data2 ,这也有效
显式设置后,data 和 data2 都会正确返回:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)