在MATLAB中有效地对结构进行索引

Cap*_*rog 5 indexing matlab struct matlab-struct

直到最近,我一直将时间序列数据存储struct在MATLAB中,方法是将索引放在字段名后面,例如:

Structure.fieldA(1) = 23423
Run Code Online (Sandbox Code Playgroud)

因此,struct有一组字段,每个字段都是一个向量.

我已经看到很多其他程序使用不同的格式,其中结构本身被索引,并且结构的每个索引包含一组字段,例如:

Structure(1).fieldA
Run Code Online (Sandbox Code Playgroud)

哪种方法最有效?我应该坚持使用top选项还是应该使用bottom方法切换我的程序?

Sue*_*ver 5

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
Run Code Online (Sandbox Code Playgroud)

struct数组提供的一些灵活性包括能够轻松获取数据的子集:

subset = SArray(1:3);

% Compared to
subset.field1 = S.field1(1:3);
subset.field2 = S.field2(1:3);
Run Code Online (Sandbox Code Playgroud)

此外,能够存储可能不容易适合阵列的不同大小的数据.

S(1).field1 = [1,2];
S(2).field1 = 3;
Run Code Online (Sandbox Code Playgroud)

什么解决方案更好,实际上取决于数据以及您如何使用它.如果您有大量数据,第一个选项可能会更好,因为它的内存占用量更小.

如果您的代码正在为您工作,我不会担心转换它只是为了使用不同的约定,除非您遇到性能问题(在这种情况下使用struct数组)或难以访问/修改数据(使用数组struct).