parfor和处理类

时间:2012-08-30 15:19:58

标签: matlab parallel-processing handle

我有一个句柄类:

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处理类所做的更改不会自动传播到客户端。

我怎样才能克服这个?

1 个答案:

答案 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