Suppose that you want to create a 2D array whose entries are the structures:
geoLocationStruct = struct('latitude', nan, 'longitude', nan);
The easiest (in my opinion) way to to this is using the syntax:
geoLocation(128,128) = geoLocationStruct;
This will initialize the element (128,128) of a 2D array to the
geoLocationStruct structure just defined, causing the allocation of a struct array like:
geoLocation = 128x128 struct array containing the fields: latitude longitude
But what happens to the elements with indices different from (128,128)? Apparently, the behavior of Matlab differs from the behavior of Octave. In Matlab we have:
>> geoLocation(8,127) = ans = latitude:  longitude: 
This makes sense: an element that is not initialized has structure entries that are empty. The struct array consumes 262496 bytes (as it can be found typing
whos geoLocation): this also makes sense, since space is reserved for 16384 entries each one 16 bytes long (2 doubles each one taking 64 bits or, equivalently, 8 bytes). However, in Octave (GNU Octave Version 3.4.3) we have that:
> geoLocation(8,127) ans = scalar structure containing the fields: latitude = error: octave_base_value::print (): wrong type argument `<unknown type>' longitude = error: octave_base_value::print (): wrong type argument `<unknown type>'
This does not look too good… Also, inspecting the memory consumption with
whos geoLocation, we get:
Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== geoLocation 128x128 16 struct Total is 16384 elements using 16 bytes
This means that only the memory for element (128, 128) was allocated. Any time we add a new element, the memory for the corresponding structure will be allocated.
To learn more about structure initialization in Matlab you may want to give a look to Loren’s post.