如何在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