从Matlab中一个类的所有实例中检索属性,将值写入文件

从Matlab中一个类的所有实例中检索属性,将值写入文件,matlab,oop,Matlab,Oop,我想从工作区中同一类的所有实例中自动检索某些属性 例:我有一个C1类,有实例a、b、c、d。 每一个都有一个叫做x的属性。我想找回所有的x。 我该怎么做呢?这里有一种可能性。假设我想找到工作区中的所有替身。我可以这样做 >> x = 12.3; >> y = 45.6; >> z = '789'; >> N = length(names); >> arr = NaN(1,N); >> for n = 1:N ob

我想从工作区中同一类的所有实例中自动检索某些属性

例:我有一个C1类,有实例a、b、c、d。 每一个都有一个叫做x的属性。我想找回所有的x。
我该怎么做呢?

这里有一种可能性。假设我想找到工作区中的所有替身。我可以这样做

>> x = 12.3;
>> y = 45.6;
>> z = '789';
>> 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
>> [objects.x]
ans =
    1    2
获取工作区中所有变量的列表

>> vars = whos();
找出哪些是双打

>> location = strcmp('double',{vars.class});
知道他们的名字吗

>> names = {vars(location).name};
>> names
names = 
    'x'    'y'
如果你现在想得到某个属性x的数组(比如我想得到每个双精度的余弦),你可以这样做

>> x = 12.3;
>> y = 45.6;
>> z = '789';
>> 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
>> [objects.x]
ans =
    1    2
现在你有了

>> arr
arr =
    0.9647   -0.0469

下面是一个使用自定义对象的示例。首先,我把这个代码放在文件DProtein.m中

现在我创建了两个对象

>> 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
你可以收集所有像这样的属性

>> x = 12.3;
>> y = 45.6;
>> z = '789';
>> 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
>> [objects.x]
ans =
    1    2

您是否可以对代码进行结构化,以便将
a
b
c
d
保存在一个数组中?我希望使用一种不会影响对象创建方式的方法,例如使用“whos”查找类的所有实例,然后从那里继续。但是,我如何引用不同的属性呢?我的类不仅仅有一个属性,还有很多属性。如何指定要使用哪一个?我真的不知道“eval”在这里的用法。。。编辑:eval试图将对象转换为double,如果它是关于一个自定义类,则这不是很有用。@lhcgeneva您可以将
eval
更改为eval([names{n},.x”]),以仅获取
x
属性。否则,您可能可以保持
eval
不变,并将
cos(obj)
更改为
obj.x
eval
在此处用于仅基于对象名称(字符串)获取所需的实例(对象)。我刚刚尝试了此操作,引用不起作用,我收到一个错误:从DProtein转换为double时发生以下错误:无法使用从DProtein转换为double的错误。D蛋白质是我的类别。你想得到的财产的类别是什么?还有,你想运行什么代码?@Chris,Dan事实上我想使用像Dan建议的,但自动的东西。类似于创建一个包含所有已存在对象的数组。然后我可以很容易地检索属性。