How to convert a layered structure into arrays.

I have a structure like this
A.a.b.first, A.a.b.second, A.a.b.third
A.c.d.first, A.c.d.second, A.c.d.third
A.e.f.first, A.e.f.second, A.e.f.third
I want to extract the fields "first", "second" and "third" into arrays so that one array has all the firsts, another has all the seconds, and a thrid and all the thirds. Is there a simulink method to use or a matlab function? I am currently brute forcing it in matlab code. That is,
B(1) = A.a.b.first
B(2) = A.c.d.first
B(3) = A.e.f.first
and so forth. So it would be much better to have a loop or something even more streamlined.

4 comentarios

Matt J
Matt J el 18 de Mzo. de 2021
Editada: Matt J el 18 de Mzo. de 2021
Whoever gave you data in this form has a lousy sense of humor.... According to your pattern, there could only be 9 more steps., am I right? If so, that doesn't seem like such an onerous thing to type by hand.
B(4) = A.g.h.first
.
.
B(13) = A.y.z.first
John Petersen
John Petersen el 18 de Mzo. de 2021
Editada: John Petersen el 18 de Mzo. de 2021
I didn't want to take all the time to explain the organization fo the data, and so I see I didn't actually explain it exactly correct. There are many more fields and they are there for orgainization of the data. The main point is that the last structure is only the three fields, first, second, third (and those aren't the actual names either). So there are many more fields than the a,b,c,d, ... and I need to add more fields and so I wanted to simplify the code so that if ever we had to add more again, the code would not have to change, it would just handle it.
Matt J
Matt J el 18 de Mzo. de 2021
Editada: Matt J el 18 de Mzo. de 2021
Are the desired fields always at a fixed depth (4 fields deep in your example)? Also, if the field names are not a simple alphabetical progression, what decides the order of the elements in B(i)? We need to know the general pattern before a solution can be recommended.
John Petersen
John Petersen el 18 de Mzo. de 2021
Editada: John Petersen el 18 de Mzo. de 2021
No. Most are four, but some are only three deep. There is a bus in simulink that defines the order. Is it possible to use that? There is also an enum that is used in the code that defines the same order.

Iniciar sesión para comentar.

 Respuesta aceptada

Matt J
Matt J el 18 de Mzo. de 2021
Editada: Matt J el 18 de Mzo. de 2021
Here's a way you can recursively search down through a tree of nested structs. Since I don't know how you want to handle multiple occurrences of the target field name (e.g. "first") on the same branch of the treee, I propose one possibility:
A.b.c.d.e.first=3;
A.g.h.first=4;
out = findField(A,'first')
out = 1×2 cell array
{[3]} {[4]}
function out=findField(S,tfield)
if ~isstruct(S)
out=[];
elseif isfield(S, tfield)
out=S.(tfield); %found a match
else%recurse
f=fieldnames(S);
if numel(f)==1
out=findField( S.(f{1}) , tfield);
else
for i=1:numel(f)
out{i}=findField( S.(f{i}) , tfield);
end
end
end
end

Más respuestas (1)

Matt J
Matt J el 18 de Mzo. de 2021
Editada: Matt J el 18 de Mzo. de 2021
A more automated option,
f=string(num2cell('a':'z'));
for i=1:13
B(i)=A.( f(2*i-1) ).( f(2*i) ).first;
C(i)=A.( f(2*i-1) ).( f(2*i) ).second;
D(i)=A.( f(2*i-1) ).( f(2*i) ).third;
end

1 comentario

John Petersen
John Petersen el 18 de Mzo. de 2021
Editada: John Petersen el 18 de Mzo. de 2021
I was looking for a more general approach that was able to extract the last fields in the structure. The fields are not actually 'a', 'b', 'c'....

Iniciar sesión para comentar.

Categorías

Preguntada:

el 18 de Mzo. de 2021

Editada:

el 18 de Mzo. de 2021

Community Treasure Hunt

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

Start Hunting!

Translated by