parfor和处理类

ola*_*ndo 6 parallel-processing matlab handle

我有一个句柄类:

classdef A<handle


    properties
        a;
    end

    methods
        function obj = A(a)
            obj.a=a;
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

我有一个A对象的单元格数组:

arr={};
for i=1:3
    arr{i}=A(i);
end
Run Code Online (Sandbox Code Playgroud)

我想做的是将该单元格数组传递给parfor循环,以便每个对象的值都会改变:

parfor i=1:3
    arr{i}.a=i*5;
end
Run Code Online (Sandbox Code Playgroud)

但是,此代码根本不会更改arr.的确,这里说明了这一点

在循环迭代期间对worker处理类所做的更改不会自动传播到客户端.

我怎么能克服这个?

Rod*_*uis 7

一个有趣的问题; 我实际上从未遇到过这个问题.知道关于parfor限制的一切总是好的,所以我做了一些googlin'并想出了这个:

我从技术支持中得到了这个问题的答案.显然Mathworks认为它是一个"特征",不会返回对象的更改 - 虽然我看不出它是一个非常有用的功能.无论如何,从parfor循环返回修改类属性的方法是进行显式更改,parfor可以识别.以下是两个适用于上述示例对象的示例:

parfor n = 1:num
    exArray(n).data = n:n+5;
end
Run Code Online (Sandbox Code Playgroud)

要么

parfor n = 1:num
    temp = exArray(n);
    setData(temp,n:n+5);
    exArray(n) = temp;
end
Run Code Online (Sandbox Code Playgroud)

实际上,如果你改变任何对象属性,它似乎也有效.因此,例如,这也有效,如果有明确设置的第二个属性data2,则正确返回data和data2:

  parfor n = 1:num
      setData(exArray(n),n:n+5);
      exArray(n).data2 = n:n+5;
  end
Run Code Online (Sandbox Code Playgroud)

示例对象的位置由

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
Run Code Online (Sandbox Code Playgroud)

并且数组被简单地初始化为

% Initialise array of objects
for n = 1:num
    exArray(n) = Example(zeros(1,6));
end
Run Code Online (Sandbox Code Playgroud)