Convert data in nested structure to array

2 次查看(过去 30 天)
Hi everybody,
I have a nested structure like this one:
S.a1.b1.x=1
S.a1.b1.y=2
S.a1.b1.u=3
S.a1.b1.v=4
S.a1.b2.x=5
S.a1.b2.y=6
S.a1.b2.u=7
S.a1.b2.v=8
S.a2.b1.x=9
S.a2.b1.y=10
S.a2.b1.u=11
S.a2.b1.v=12
S.a2.b2.x=13
S.a2.b2.y=14
S.a2.b2.u=15
S.a2.b2.v=16
Now I would like to plot all the data in the structure using quiver. To do so I need to extract all the x, y, u and v in the structure with something like:
X=S.(:).(:).x
Y=S.(:).(:).y
U=S.(:).(:).u
V=S.(:).(:).v
quiver(X,Y,U,V)
Which is the best (readable, fast, best-practice) way to do so? I'm starting to think that maybe it has been wrong to save these data into a nested struct. Is there a better way?
In order to answer this latter question I need to point out that the user must be able to specify which "a" (a1, a2, ...) sub structure to extract. That's the reason why I decided to use a structure in first instance: to be able to use commands like
S.(choice).b1
S.(choice).b2
ecc
Thank you very much,
Luca Amerio

回答(2 个)

Guillaume
Guillaume 2015-2-4
The most straightforward I can think of getting at your data is using structfun repeatedly on each subfield
points = cell2mat(structfun(@(fa) {cell2mat(structfun(@(fb) {structfun(@(fxyzu) fxyzu, fb)'}, fa))}, S);
XYUV = num2cell(points, 1);
quiver(XYUV{:})

Tim Baur
Tim Baur 2022-3-31
Would you know a solution that could extract the desired values/rangens dynamically from a structured array, too?
So depending on the number of levels and the selected indeces, e.g.:
X = S(1:3).a(:).b(1).c(4:5).d >> 4x nested structfun
X = S(1:3).a(:) >> 1x nested structfun
X = S(1:3).a(:).b(1).c(4:5).d.e.f.g.h(:) >> 8x nested structfun
etc.
That would be super useful in case the depth of the structure is not always the same

类别

Help CenterFile Exchange 中查找有关 Structures 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by