初始化具有未知长度字段的结构数组

时间:2016-06-28 21:22:20

标签: matlab matlab-struct

当字段大小可变时,尝试预分配结构数组是否有价值?例如:

A.x = randn(1,randi(100));
A.y = randn(1,randi(100));

for k = 2:1000
    A(k).x = randn(1,randi(100));
    A(k).y = randn(1,randi(100));
end

我可以创建第一个条目然后使用repmat,但MATLAB仍然需要处理未知的字段长度。在我的测试中,与让它动态增长相比,几乎没有改进。顺便说一下,用括号(例如A = [A nextEntry])来增长它要慢得多。

是否有一种聪明的方法来进行预分配以加快速度?

1 个答案:

答案 0 :(得分:1)

MATLAB存储struct数组的方式是关于结构的元数据(维度,字段名等)存储在内存中的一个位置,每个字段的内容(值)是单独存储并将指向其位置的指针插入到元数据中,以便在请求时找到它们。

因此,如果您要初始化struct,可以将所有内容设置为[]进行初始化。您只需要确保字段数和初始struct的尺寸是正确的大小,以便我们有足够的空间来存储它最终将包含的数据的所有指针。

然后,您可以根据需要填写字段,将其值分配给新存储器,并将其指针存储在预分配位置的元数据中。

A relevant article from Loren's blog

因此,在您的情况下,您只需使用以下内容预先分配struct

A = struct('x', cell(1, 1000), 'y', cell(1, 1000));

填写:

for k = 1:numel(A)
    A(k).x = randn(1, randi(100));
    A(k).y = randn(1, randi(100));
end

为什么使用A增长[A newA]的速度较慢。这导致我们必须每次通过循环“增长”struct的元数据组件,这实际上需要每次都要执行扩展的元数据的整个副本。

相关问题