【问题标题】:object array efficiency in MatlabMatlab中的对象数组效率
【发布时间】:2011-04-19 06:37:32
【问题描述】:

为了我的工作,我必须在 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。你会推荐吗?

或者更笼统地说:组织我的观点的最佳方式是什么?

期待您的建议!

【问题讨论】:

    标签: matlab object performance


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我是 - 但这些信息都在文档中以某种方式。
    • +1 有用信息。对于#4,看看这个问题:stackoverflow.com/questions/1548116/…
    • @Edric:那么也许您可以回答句柄对象性能有什么问题:stackoverflow.com/questions/1446281/matlabs-garbage-collector
    • 感谢 Edric,他很有见地。根据您编写的内容,我将删除对象数组并专注于单个 PointList 方法。而不是制作单独的向量 x y 等,尽管我正在考虑将它们并排放在一个矩阵中并使用访问器方法来挑选出请求的列;这意味着长度的一致性,更重要的是允许我通过索引单个矩阵来制作点子集。实际上,为了提高效率,我将预先分配空间块,还要感谢 Mikhail 的参考。非常感谢!
    • @Mikhail 关于 GC,我没有什么要补充的 - 我看到你已经看到其他 MathWorkers 在各个地方发布的东西比我在这个主题上知识渊博得多。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2018-03-01
    • 2011-06-05
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多