Matlab面向对象编程中,如何从一个对象数组中访问属性?

3

我刚接触Matlab,之前使用的是C/C++......

我有一个对象数组,尝试访问数组中每个对象的值并将它们连接成一个变量。

Class sample 
   properties(GetAccess = 'public', SetAccess ='public')
     ID;
     Value;
   end

   methods 
        function obj = sample(id, value)
            obj.ID = id;
            obj.Value = value;
         end
   end
end 

然后我创建了一个矩阵,包含一些对象。
x = sample.empty(3,0);
x(1) = sample(1,3);
x(2) = sample(1,4);
x(3) = sample(1,5);

我希望从对象中获取所有的值,并将它们存储到一个新数组中。

y = x(:).Value;

然而这种方法失败了,只将x(3)的值放入y中......以及:
y(:) = x(:).Value; 

抛出错误。

任何帮助将不胜感激。我知道可以用循环来完成这个任务,但我正在尝试以最快和最有效的方式完成它。

1个回答

5
简单但不直观。
y=[x.Value]

为什么?因为x.Value不是连续的内存块,所以不能直接赋值给数组。调用x.Value会依次返回每个x对象的Value数据成员。Matlab将其视为单独的操作。通过将调用括在[]中,您告诉Matlab通过连接每个结果来组合一个连续的数组。然后可以将其分配给y的double数组。
编辑:
关于您的评论,如果x在不同的对象中长度不同,即...
x(1) = sample(1,3);
x(2) = sample(1,[4 5 6]);
x(3) = sample(1,[20 10]);

那么

>> [x.Value]

ans =

     3     4     5     6    20    10

如果你的意思是想让“y”成为一个类似于C++中向量的向量,你需要使用单元数组表示法(大括号)。
>> y = {x.Value}

y = 

    [3]    [1x3 double]    [1x2 double]

Aka x 包含数组,但它们的长度不相等。 - Neppinger
1
请查看我的编辑以获取详细信息。x保存了一个sample类的数组。非严格类型的乐趣! - learnvst
谢谢,这解决了我的问题。我之前把数组存储成了纵向格式而不是横向格式,在索引时并没有关系,但在组合时就有了问题。现在我已经把它们转换成了横向格式,现在可以正常工作了...哎呀。 - Neppinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接