2

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

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])增长它要慢得多。

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

4

1 回答 1

1

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

出于这个原因,如果你想初始化 a struct,你可以将它的所有内容都设置为[]。您只需要确保字段的数量和初始的维度struct是正确的大小,以便我们有足够的空间来存储指向最终将包含的数据的所有指针。

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

来自 Loren 博客的相关文章

因此,在您的情况下,您可以简单地预先分配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通过循环“增长”每次的元数据组件,这实际上需要制作元数据的完整副本来执行每次扩展。

于 2016-06-28T21:43:33.650 回答