Matlab中的对象数组效率

时间:2010-09-30 09:59:38

标签: matlab object performance

对于我的工作,我必须在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。你会推荐吗?
  5. 或者说更通用的事情:组织我的观点的最佳方式是什么?

    期待您的建议!

1 个答案:

答案 0 :(得分:9)

没有按顺序回答你的问题,但这里有一些有用的信息:

  1. 对象以与结构相同的方式存储在内存中 - 每个字段都是自己的完全成熟的MATLAB数组(mxArray到C-Mex程序员),因此每个字段的大小可以是独立的。
  2. 我可能会创建类似于单个PointList对象的字段x,y,prop1,prop2。然后,这些字段将是适当长度的向量。这几乎肯定比Point对象列表更有效。它肯定会占用更少的内存。
  3. 您应该在PointList上定义访问器方法,以确保您的向量始终具有相同的长度等。
  4. 如果你真的想要,你可以让你的PointList的“容量”大于当前存储在其中的元素数量 - 这样你就可以避免一直调整x,y,...... / LI>
  5. 一般来说,重载subsref不适合胆小的人。请记住,您还需要正确地重载至少数字,ndims,长度,结束和大小。