ワークスペース内の同じクラスのすべてのインスタンスから特定のプロパティを自動的に取得したいと考えています。
例: インスタンス a、b、c、d を持つクラス C1 があります。これらのそれぞれには、x と呼ばれる特定のプロパティがあります。すべての x を取得したいと思います。どうすればいいですか?
ここに 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