如何在MATLAB中初始化一个结构数组?

我怎样才能在MATLAB中预分配一个结构数组? 我想在这个例子中预先分配“a”,这样它不会调整多次。

a = [] for i = 1:100 a(i).x = i; end 

使用repmat是迄今为止预先分配结构的最有效的方法:

 N = 10000; b = repmat(struct('x',1), N, 1 ); 

使用Matlab 2011a的速度比通过索引预分配快了10倍 ,如

 N = 10000; b(N).x = 1 

索引方法的速度只比没有预先分配更快。

 No preallocation: 0.075524 Preallocate Using indexing: 0.063774 Preallocate with repmat: 0.005234 


下面的代码以防万一你想validation。

  clear; N = 10000; %1) GROWING A STRUCT tic; for ii=1:N a(ii).x(1)=1; end noPreAll = toc; %2)PREALLOCATING A STRUCT tic; b = repmat( struct( 'x', 1 ), N, 1 ); for ii=1:N b(ii).x(1)=1; end; repmatBased=toc; %3)Index to preallocate c(N).x = 1; for ii=1:N c(ii).x(1)=1; end; preIndex=toc; disp(['No preallocation: ' num2str(noPreAll)]) disp(['Preallocate Indexing: ' num2str(preIndex)]) disp(['Preallocate with repmat: ' num2str(repmatBased)]) No preallocation: 0.075524 Preallocate Indexing: 0.063774 Preallocate with repmat: 0.0052338 >> 

PS我有兴趣知道为什么这是真实的,如果任何人可以解释它。

关于这个在MATLAB的博客艺术罗兰有一个很好的讨论。

如果我正确地理解了你,下面是一个初始化你想要的结构的方法:

 a(100).x = 100; 

用这个方法,我们可以看到元素用空数组填充。

有很多方法可以初始化一个结构。 例如,你可以使用struct命令:

 a(1:100) = struct('x',[]); 

将所有字段x为空。

你也可以使用deal来创build和填充结构,如果你知道哪些数据应该在那里

 xx = num2cell(1:100); [a(1:100).x]=deal(xx{:}); a(99).x ans = 99 

或者你可以再次使用struct (注意,如果结构的一个字段应该是一个单元格数组,那么这个单元格需要用大括号括起来)!

 a = struct('x',xx) 

根据这个答案 ,还有另一种方法来做到这一点:

 [ax] = deal(val); 

其中val是要分配给结构的每个元素的值。

这个命令的效果与其他命令的效果不同,因为每个结构体a每个x字段将被赋予val值。

而不是预先分配结构数组可能更容易扭转循环。 通过这种方式,数组在第一次迭代中被分配,其余的迭代被用来填充结构。

 a = [] for i = 100:-1:1 a(i).x = i; end