"Access Elements of a Nonscalar Structure Array" issue
6 views (last 30 days)
Show older comments
Hello,
I try to access data stored in a structure of this type:

I would love to have access easily for exemple to all the masses of all the subsystems, but i cannot manage to do it , i tried : (I pasted the full code at the end)
systems(:).subsystem.mass
but it returned: Reference to non-existent field 'subsystem'.
The real problem has a lot more system than that, do you have an idea on how i could access to all the masses contained in all the subsystems?
Thank you for your help!
I tried to follow this MatLab tutorial but it doesn't seem to work in my case:
clear all
clc
%% creation of the structure
systems=struct();
system1.mass=1000;
system1.CG=[0,1,2];
system1.subsystem.mass=[0;10;100];
system1.subsystem.CG=[0,1,2;3,4,5;6,7,8];
systems.system1=system1;
system2.CG=[0,1,2];
system2.mass=1000;
system2.subsystem.mass=[0;10;100];
system2.subsystem.CG=[0,1,2;3,4,5;6,7,8];
systems.system2=system2;
systems.mass=5000;
systems.CG=[10,20,30];
clear system1
clear system2
%% access to data
systems(:).subsystem.mass
Accepted Answer
Jan
on 7 Jun 2021
You cannot access fields of deeply nested structs in Matlab. You need a loop to do this.
2 Comments
Jan
on 7 Jun 2021
Hiding an index in the fieldname as in "system1" is a bad idea. Deeply nested structs are inefficient also, if you need to access nested fields. So restructuring the data might be the best approach.
More Answers (1)
Stephen23
on 7 Jun 2021
Edited: Stephen23
on 7 Jun 2021
sys = fakedata()
fnm = regexp(fieldnames(sys),'^system\d+$','match');
fnm = [fnm{:}]
fun = @(f)sys.(f).subsystem.mass;
out = cellfun(fun,fnm,'uni',0)
Checking (tip for the future: using different values for fake data is a simple sanity check):
out{1}
out{2}
0 Comments
See Also
Categories
Find more on Structures in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!