6

我有一个句柄类:

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。确实,这里指出

在循环迭代期间为处理工作人员上的类所做的更改不会自动传播到客户端。

我该如何克服呢?

4

1 回答 1

7

一个有趣的问题;我实际上从未遇到过这个问题。了解有关限制的一切总是好的parfor,所以我做了一些谷歌搜索并想出了这个

我已从技术支持处收到了对此问题的答复。显然,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 ,则 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
于 2012-08-30T16:12:11.747 回答