How to convert all of a structures fields into strings that represent the complete names.

69 views (last 30 days)
I have a structure of variable numbers of fields. I want to display them on a GUI so that they can be changed by a user. So I want to display the field names just as you would see them in matlab.
For example, let's say the structure is
Offset = struct('X',0,'Y',0,'Z',0);
Rot = struct('Roll',0,'Pitch',0,'Yaw',0);
IMU = struct('Offset',Offset,'Rot',Rot);
EKFerrors = struct('MeasTimeout',1,'MaxBound',3);
EKF = struct('IMU',IMU,'Errors',EKFerrors,'InitMode',2);
So the list of elements of the structure are shown below
EKF.IMU.Offset.X
EKF.IMU.Offset.Y
EKF.IMU.Offset.Z
EKF.IMU.Rot.Roll
EKF.IMU.Rot.Pitch
EKF.IMU.Rot.Yaw
EKF.Errors.MeasTimeout
EKF.Errors.MaxBound
EKF.InitMode
I would like each of these in an array of strings or cells of strings that I can display on the GUI just as they are shown here (not their value, their name), but I would have an edit box so a user could enter in values. I just need the struct converted to these strings.

Accepted Answer

Stephen23
Stephen23 on 28 Apr 2022
Edited: Stephen23 on 28 Apr 2022
The only general solution is to use a recursive function. Here is code which works for scalar structures, although you could extend it to include indexing into non-scalar structures.
Offset = struct('X',0,'Y',0,'Z',0);
Rot = struct('Roll',0,'Pitch',0,'Yaw',0);
IMU = struct('Offset',Offset,'Rot',Rot);
EKFerrors = struct('MeasTimeout',1,'MaxBound',3);
EKF = struct('IMU',IMU,'Errors',EKFerrors,'InitMode',2);
Z = myfun(EKF)
Z = 9×1 cell array
{'EKF.IMU.Offset.X' } {'EKF.IMU.Offset.Y' } {'EKF.IMU.Offset.Z' } {'EKF.IMU.Rot.Roll' } {'EKF.IMU.Rot.Pitch' } {'EKF.IMU.Rot.Yaw' } {'EKF.Errors.MeasTimeout'} {'EKF.Errors.MaxBound' } {'EKF.InitMode' }
function C = myfun(S)
assert(isstruct(S),'Input <S> must be a structure.')
assert(isscalar(S),'Input <S> must be scalar.')
C = {};
recfun(S,inputname(1))
%
function recfun(A,N)
F = fieldnames(A);
for k = 1:numel(F)
T = sprintf('%s.%s',N,F{k});
B = A.(F{k});
if isstruct(B)
assert(isscalar(B),'Structure <%s> must be scalar.',T)
recfun(B,T)
else
C{end+1,1} = T;
end
end
end
end
  1 Comment
John Petersen
John Petersen on 28 Apr 2022
Edited: John Petersen on 28 Apr 2022
Perfect! And thanks for teaching me how to do recursive functions. I thought it might require it, but I wasn't sure how to keep the output building on itself.

Sign in to comment.

More Answers (1)

Image Analyst
Image Analyst on 28 Apr 2022
Use fieldnames():
Offset = struct('X',0,'Y',0,'Z',0);
Rot = struct('Roll',0,'Pitch',0,'Yaw',0);
IMU = struct('Offset',Offset,'Rot',Rot);
EKFerrors = struct('MeasTimeout',1,'MaxBound',3);
EKF = struct('IMU',IMU,'Errors',EKFerrors,'InitMode',2);
OffsetFields = fieldnames(Offset)
OffsetFields = 3×1 cell array
{'X'} {'Y'} {'Z'}
RotFields = fieldnames(Rot)
RotFields = 3×1 cell array
{'Roll' } {'Pitch'} {'Yaw' }
IMUFields = fieldnames(IMU)
IMUFields = 2×1 cell array
{'Offset'} {'Rot' }
EKFerrorsFields = fieldnames(EKFerrors)
EKFerrorsFields = 2×1 cell array
{'MeasTimeout'} {'MaxBound' }
EKFFields = fieldnames(EKF)
EKFFields = 3×1 cell array
{'IMU' } {'Errors' } {'InitMode'}

Categories

Find more on Structures in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!