How to initialize an array of structs in MATLAB?
Using repmat
is by far the most efficient way to preallocate structs :
N = 10000;
b = repmat(struct('x',1), N, 1 );
This is ~10x faster using Matlab 2011a than preallocating via indexing, as in
N = 10000;
b(N).x = 1
The indexing method is only marginally faster than not preallocating.
No preallocation: 0.075524
Preallocate Using indexing: 0.063774
Preallocate with repmat: 0.005234
Code below in case you want to verify.
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)])
Results in command window:
No preallocation: 0.075524
Preallocate Indexing: 0.063774
Preallocate with repmat: 0.0052338
>>
P.S. I'd be interested to know why this is true, if anyone can explain it.
There's a bunch of ways you can initialize a structure. For example, you can use the struct
command:
a(1:100) = struct('x',[]);
which sets all fields x
to empty.
You can also use deal
to create and fill the structure if you know what data should go in there
xx = num2cell(1:100);
[a(1:100).x]=deal(xx{:});
a(99).x
ans =
99
Or you can use struct
again (note that if a field of the structure should be a cell array, the cell needs to be enclosed in curly brackets!)
a = struct('x',xx)
There's a nice discussion about this in Loren on the Art of MATLAB blog.
If I understand you correctly, here's a ways to initialize the struct you want:
a(100).x = 100;
With this method, we can see that elements are filled in with empty arrays.