MATLAB中数据结构的高效索引

6

最近,我一直在使用MATLAB中的struct将时间序列数据存储在字段名的后面,例如:

Structure.fieldA(1) = 23423

所以,结构体有一组字段,每个字段都是一个向量。
我看到很多其他程序使用不同的格式,其中结构体本身是索引的,每个结构体的索引包含一组字段,例如:
Structure(1).fieldA

哪种方法最有效?我应该坚持使用顶部选项还是应该将我的程序切换到使用底部方法?

1个回答

6
每个字段都是数组的struct更有效率,因为您有较少的数据元素(每个字段一个数组),而struct数组具有更高的灵活性,但代价是性能和内存使用(每个struct元素每个字段)。 来自MATLAB自己的文档

每个字段需要相似数量的开销。 具有许多字段和小内容的结构具有很大的开销,应避免使用。 具有数字标量字段的大型结构数组比包含大型数字数组的字段的结构需要更多的内存。

我们可以通过一个简单的例子来检查内存使用情况。
S = struct('field1', {1, 2}, 'field2', {3, 4});
SArray = struct('field1', {[1,2]}, 'field2', {[3,4]});

whos S*
%  Name        Size            Bytes  Class     Attributes
%
%  S           1x2               608  struct
%  SArray      1x1               384  struct

一些由struct数组提供的灵活性包括能够轻松获取数据的子集:
subset = SArray(1:3);

% Compared to
subset.field1 = S.field1(1:3);
subset.field2 = S.field2(1:3);

此外,能够存储不同大小的数据,这些数据可能不容易适合于数组。
S(1).field1 = [1,2];
S(2).field1 = 3;

哪种解决方案更好,实际上取决于数据和使用方式。如果您有大量数据,则由于其较小的内存占用量,第一种选项很可能更可取。

如果您的代码能够正常工作,除非您在性能方面遇到问题(此时请使用数组结构体),或者难以访问/修改数据(请使用结构体数组),否则不必为了使用不同的约定而进行转换。


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