poster
2019-12-10, 20:48
对于我的工作,我必须在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 我之所以喜欢上面的原因,既是美观(对象应该是对象)又是实用的,因为它使我可以轻松创建点的子集,而不必索引多个不同的数组。
但是,考虑到该点集可能会增长成千上万个点,因此我想知道这是否是最有效的处理方式。我的主要问题是:
据我了解:Matlab如何在内存中存储对象数组?它如何处理依赖于prop1(例如,结构)的变化的对象大小?
这将如何影响像[points.x]这样的操作,这是我经常需要做的事情?这被认为是有效的操作吗?
有没有更好的方法来初始化对象数组?上面的循环构造似乎效率很低。
我想应该有可能模拟类对象的行为,同时更有利地存储属性,也许是通过重载subsref (http://www.mathworks.es/help/techdoc/ref/subsref.html) 。你会推荐吗?
或更笼统地说:组织我的观点的最佳方法是什么?
期待您的指教!
回答:
并不是真正按顺序回答您的问题,但是这里有一些希望有用的信息:
对象以与结构相同的方式存储在内存中-每个字段都是其自己完整的MATLAB数组(C-Mex程序员使用mxArray),因此每个字段的大小可以独立。
我可能会做出类似带有字段x,y,prop1,prop2的单个PointList对象的操作。这些字段将是适当长度的向量。几乎可以肯定,这将比Point对象列表更有效。当然,它将占用更少的内存。
您应该在PointList上定义访问器方法,以确保向量的长度始终相同,以此类推。
如果确实需要,可以让PointList的“容量”大于当前存储在其中的元素的数量-这样一来,就可以避免一直调整x,y,...的大小。
通常,重载subsref不适合胆小者。请记住,您还需要正确地至少重载numel,ndims,长度,末端和大小。
更多&回答... (https://stackoverflow.com/questions/3829538)
我目前正在处理具有多个属性的点集合。与其将所有这些都放置在等长的单独数组中,倒不如使用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 我之所以喜欢上面的原因,既是美观(对象应该是对象)又是实用的,因为它使我可以轻松创建点的子集,而不必索引多个不同的数组。
但是,考虑到该点集可能会增长成千上万个点,因此我想知道这是否是最有效的处理方式。我的主要问题是:
据我了解:Matlab如何在内存中存储对象数组?它如何处理依赖于prop1(例如,结构)的变化的对象大小?
这将如何影响像[points.x]这样的操作,这是我经常需要做的事情?这被认为是有效的操作吗?
有没有更好的方法来初始化对象数组?上面的循环构造似乎效率很低。
我想应该有可能模拟类对象的行为,同时更有利地存储属性,也许是通过重载subsref (http://www.mathworks.es/help/techdoc/ref/subsref.html) 。你会推荐吗?
或更笼统地说:组织我的观点的最佳方法是什么?
期待您的指教!
回答:
并不是真正按顺序回答您的问题,但是这里有一些希望有用的信息:
对象以与结构相同的方式存储在内存中-每个字段都是其自己完整的MATLAB数组(C-Mex程序员使用mxArray),因此每个字段的大小可以独立。
我可能会做出类似带有字段x,y,prop1,prop2的单个PointList对象的操作。这些字段将是适当长度的向量。几乎可以肯定,这将比Point对象列表更有效。当然,它将占用更少的内存。
您应该在PointList上定义访问器方法,以确保向量的长度始终相同,以此类推。
如果确实需要,可以让PointList的“容量”大于当前存储在其中的元素的数量-这样一来,就可以避免一直调整x,y,...的大小。
通常,重载subsref不适合胆小者。请记住,您还需要正确地至少重载numel,ndims,长度,末端和大小。
更多&回答... (https://stackoverflow.com/questions/3829538)