"Access Elements of a Nonscalar Structure Array" issue
2 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
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!