How to initialize an array of structs in MATLAB?

Solution 1:

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.

Solution 2:

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.

Solution 3:

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)