This short video covers the difference between a “structure of arrays” and an “array of structures”.
Video Content
By Doug Hull
12:28 UTC | Posted in MATLAB Basics, PodCast, Video | Permalink |
You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response. Pinging is currently not allowed.
It’s easier to create vector s by: s = [people.SimmNum];
This and Emil’s comment were quite helpful to me.
To take this one step further, one advantage of Arrays of Structures would be the ability to have vectors of different lengths for each numerical part, and a cell array of names of different lengths for each name part.
For example:
people(1).name=’Erin’ people(2).name={’Joan’ ‘Carla’} people(1).sim=44 people(2).sim=[561 49]
Emil,
Yes, you are correct. I can not believe I over looked that. There are so many ways to do certain things in MATLAB.
Doug
If you have an array that you want to assign to a field across a structure array, you can do this:
[structArray(:).fieldname] = deal(num2cell(array))
Of course, the length of array should be the same as the length of structArray, but if structArray doesn’t exist yet, then you can do:
[structArray(1:length(array)).fieldname] = deal(num2cell(array))
If array is already a cell array, you can avoid using both deal and num2cell (although they will still work) and use:
[structArray(:).fieldname] = array{:} or [structArray(1:length(array)).fieldname] = array{:}
An example, modifying the struct array ‘people’ from the video:
names = {’Larry’,'Moe’,'Curly’}; [people(:).name] = names{:};
In one of my program, I’d like to use an array of array of structures, such like
s0 = struct('field1', [v1 v2], 'field2', [v3 v4]); s1 = struct('field1', [v1' v2'], 'field2', [v3' v4']);
I want another data structure s = [s0, s1] so that I can access s0(1) like s(0,1). How can I do that?
You want to use a cell array here:
s{1} = s0 s{2} = s1 s{1}.field1 s{1}.field1(1,3)
I may be wrong, but one of the examples in Post 4 (Ryan Gray) doesn’t work as advertised. Specifically,
ends up assigning the whole array to every instance of fieldname, instead of distributing the array across those instances. What does seem to work is:
cell_array = num2cell(array); [structArray(1:length(array)).fieldname] = cell_array{:};
I leave it as an exercise for a MATLAB guru to splain why this is the case.
Wrap code fragments inside <pre> tags, like this:
<pre class="code"> a = magic(3); sum(a) </pre>
If you have a "<" character in your code, either follow it with a space or replace it with "<" (including the semicolon).
Bob, Brett & Jiro share their favorite user-contributed submissions from the File Exchange.
These postings are the author's and don't necessarily represent the opinions of The MathWorks.
It’s easier to create vector s by:
s = [people.SimmNum];
This and Emil’s comment were quite helpful to me.
To take this one step further, one advantage of Arrays of Structures would be the ability to have vectors of different lengths for each numerical part, and a cell array of names of different lengths for each name part.
For example:
people(1).name=’Erin’
people(2).name={’Joan’ ‘Carla’}
people(1).sim=44
people(2).sim=[561 49]
Emil,
Yes, you are correct. I can not believe I over looked that. There are so many ways to do certain things in MATLAB.
Doug
If you have an array that you want to assign to a field across a structure array, you can do this:
[structArray(:).fieldname] = deal(num2cell(array))
Of course, the length of array should be the same as the length of structArray, but if structArray doesn’t exist yet, then you can do:
[structArray(1:length(array)).fieldname] = deal(num2cell(array))
If array is already a cell array, you can avoid using both deal and num2cell (although they will still work) and use:
[structArray(:).fieldname] = array{:}
or
[structArray(1:length(array)).fieldname] = array{:}
An example, modifying the struct array ‘people’ from the video:
names = {’Larry’,'Moe’,'Curly’};
[people(:).name] = names{:};
In one of my program, I’d like to use an array of array of structures, such like
s0 = struct('field1', [v1 v2], 'field2', [v3 v4]); s1 = struct('field1', [v1' v2'], 'field2', [v3' v4']);I want another data structure s = [s0, s1] so that I can access s0(1) like s(0,1). How can I do that?
You want to use a cell array here:
s{1} = s0 s{2} = s1 s{1}.field1 s{1}.field1(1,3)Doug
I may be wrong, but one of the examples in Post 4 (Ryan Gray) doesn’t work as advertised. Specifically,
ends up assigning the whole array to every instance of fieldname, instead of distributing the array across those instances. What does seem to work is:
cell_array = num2cell(array); [structArray(1:length(array)).fieldname] = cell_array{:};I leave it as an exercise for a MATLAB guru to splain why this is the case.