如何在MATLAB中预分配结构数组?我想在此示例中预先分配"a",以便它不会多次调整大小.
a = []
for i = 1:100
a(i).x = i;
end
Run Code Online (Sandbox Code Playgroud)
jer*_*rad 73
repmat到目前为止,使用是预分配结构的最有效方法:
N = 10000;
b = repmat(struct('x',1), N, 1 );
Run Code Online (Sandbox Code Playgroud)
这是〜10倍的速度更快用Matlab 2011A不是通过索引预分配,如
N = 10000;
b(N).x = 1
Run Code Online (Sandbox Code Playgroud)
索引方法仅比不预分配快一点.
No preallocation: 0.075524
Preallocate Using indexing: 0.063774
Preallocate with repmat: 0.005234
Run Code Online (Sandbox Code Playgroud)
如果您想验证,请在下面编写代码.
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
tic;
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)])
Run Code Online (Sandbox Code Playgroud)
PS 我有兴趣知道为什么这是真的,如果有人能解释的话.
bla*_*bla 11
在Loren on the MAT of MATLAB博客上有一个很好的讨论.
如果我理解正确,这里有一种方法来初始化你想要的结构:
a(100).x = 100;
Run Code Online (Sandbox Code Playgroud)
使用此方法,我们可以看到元素用空数组填充.
Jon*_*nas 11
您可以通过多种方式初始化结构.例如,您可以使用以下struct命令:
a(1:100) = struct('x',[]);
Run Code Online (Sandbox Code Playgroud)
将所有字段设置x为空.
deal如果您知道哪些数据应该在那里,您还可以使用创建和填充结构
xx = num2cell(1:100);
[a(1:100).x]=deal(xx{:});
a(99).x
ans =
99
Run Code Online (Sandbox Code Playgroud)
或者你可以struct再次使用(注意,如果结构的一个字段应该是一个单元格数组,那么单元格需要用大括号括起来!)
a = struct('x',xx)
Run Code Online (Sandbox Code Playgroud)