4

ワークスペース内の同じクラスのすべてのインスタンスから特定のプロパティを自動的に取得したいと考えています。

例: インスタンス a、b、c、d を持つクラス C1 があります。これらのそれぞれには、x と呼ばれる特定のプロパティがあります。すべての x を取得したいと思います。どうすればいいですか?

4

1 に答える 1

4

ここに 1 つの可能性があります。ワークスペース内のすべての double を見つけたいとしましょう。私はこのようなことをすることができます

>> x = 12.3;
>> y = 45.6;
>> z = '789';

ワークスペース内のすべての変数のリストを取得します

>> vars = whos();

どれが double かを把握する

>> location = strcmp('double',{vars.class});

名前を取得する

>> names = {vars(location).name};
>> names
names = 
    'x'    'y'

プロパティ x の配列を取得したい場合 (たとえば、各 double のコサインを取得したい場合)、次のようにすることができます。

>> N = length(names);
>> arr = NaN(1,N);
>> for n = 1:N
     obj    = eval(names{n}); # dubious use of 'eval'
     arr(n) = cos(obj);       # assign the relevant property to an array
   end

今、あなたは持っています

>> arr
arr =
    0.9647   -0.0469

カスタム オブジェクトを使用した例を次に示します。まず、このコードをファイルDProtein.mに入れます。

classdef DProtein
    properties
        x;
        y;
    end
    methods
        function self = DProtein(x, y)
            self.x = x;
            self.y = y;
        end
    end
end

ここで、いくつかのオブジェクトを作成します

>> a = DProtein(1, 'foo'); # a.x = 1
>> b = DProtein(2, 'bar'); # b.x = 2

以前と同じように、ワークスペースで正しいクラスのすべてのオブジェクトを見つけました

>> vars = whos();
>> location = strcmp('DProtein', {vars.class});
>> names = {vars(location).name};

ループがすべてのオブジェクトの配列を収集するようになりました

>> for n = 1:length(names)
       objects(n) = eval(names{n}); # N.B. important that 'objects' does not
                                    # exist in the workspace before this line!
   end

そして、このようにすべてのプロパティを収集できます

>> [objects.x]
ans =
    1    2
于 2013-07-31T08:29:20.147 に答える