Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 Matlab中对象数组的效率

对于我的工作,我必须在Matlab中建立一个项目,这不是我选择的语言,并且我对效率存在一些疑问。

我目前正在处理具有多个属性的点集合。与其将所有这些都放置在等长的单独数组中,倒不如使用Matlab的用户定义类将Point对象制成单个数组。例如:

% Point.m classmethod Point < handle properties x, y, prop1, prop2 end end % script.m ... % define x(100), y(100), prop1(100), prop2(100) points(100) = Point; % this seems to be the way to allocate an object vector for i = 1:100 points(i).x = x(i); % copy values into object points(i).y = y(i); points(i).prop1 = prop1(i); points(i).prop2 = prop2(i); end 我之所以喜欢上面的原因,既是美观(对象应该是对象)又是实用的,因为它使我可以轻松创建点的子集,而不必索引多个不同的数组。

但是,考虑到该点集可能会增长成千上万个点,因此我想知道这是否是最有效的处理方式。我的主要问题是:
  1. 据我了解:Matlab如何在内存中存储对象数组?它如何处理依赖于prop1(例如,结构)的变化的对象大小?
  2. 这将如何影响像[points.x]这样的操作,这是我经常需要做的事情?这被认为是有效的操作吗?
  3. 有没有更好的方法来初始化对象数组?上面的循环构造似乎效率很低。
  4. 我想应该有可能模拟类对象的行为,同时更有利地存储属性,也许是通过重载subsref 。你会推荐吗?
或更笼统地说:组织我的观点的最佳方法是什么?

期待您的指教!



回答:

并不是真正按顺序回答您的问题,但是这里有一些希望有用的信息:
  1. 对象以与结构相同的方式存储在内存中-每个字段都是其自己完整的MATLAB数组(C-Mex程序员使用mxArray),因此每个字段的大小可以独立。
  2. 我可能会做出类似带有字段x,y,prop1,prop2的单个PointList对象的操作。这些字段将是适当长度的向量。几乎可以肯定,这将比Point对象列表更有效。当然,它将占用更少的内存。
  3. 您应该在PointList上定义访问器方法,以确保向量的长度始终相同,以此类推。
  4. 如果确实需要,可以让PointList的“容量”大于当前存储在其中的元素的数量-这样一来,就可以避免一直调整x,y,...的大小。
  5. 通常,重载subsref不适合胆小者。请记住,您还需要正确地至少重载numel,ndims,长度,末端和大小。

更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:23


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.