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 によって認識できる明示的な変更を行うことです。上記のサンプル オブジェクトで機能する 2 つの例を次に示します。

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

実際、オブジェクトのプロパティを変更すると、それも機能するようです。したがって、たとえばこれも機能します。明示的に設定された 2 番目のプロパティ 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 に答える