# Automatically put content of structure fields in a matrix

6 views (last 30 days)
Inti Vanmechelen on 4 May 2020
Hi all,
For the following structure:
A.TEST=rand(15x8);
A.TEST1=rand(15x8);
A.TEST2=rand(15x8);
A.TEST3=rand(15x8);
A.TEST4=rand(15x8);
A.TEST5=rand(15x8);
I would like to find an optimal way to create a new matrix (let's say B) that contains all values from TEST to TEST5 concatenated vertically, which would be B = (15*5,8).
Preferabally automatically, since my real dataset is much bigger.
Thanks!

Stephen Cobeldick on 5 May 2020
Better data design would make your code simpler too, e.g. a non-scalar structure:
A.S(1).TEST = rand(15,8)
A.S(2).TEST = rand(15,8)
A.S(3).TEST = rand(15,8)
A.S(4).TEST = rand(15,8)
A.S(5).TEST = rand(15,8)
M = vertcat(A.S.TEST) % <- this is all you need
Inti Vanmechelen on 7 May 2020
I've changed my structure towards your proposal. Indeed easier.
I'm learning everyday, thanks for the tip!

darova on 4 May 2020
Edited: darova on 4 May 2020
Try getfield
fnames = fieldnames(A);
B = [];
for i = 1:length(fnames)
b1 = getfield(A,fnames{i});
B = [B; b1];
end
Use preallocation if for loop is slow

Inti Vanmechelen on 5 May 2020
Hi Darova,
This solution worked, but unfortunately, I have an extra field in the structure (should've probably added that from the beginning).
Do you know how to get the same command with a structure like this?
A.S.TEST = rand(15,8)
A.S.TEST1 = rand(15,8)
A.S.TEST2 = rand(15,8)
A.S.TEST3 = rand(15,8)
A.S.TEST4 = rand(15,8)
Where S varies from 1 to 20 and TEST varies from TEST to TEST4.
I tried to figure it out but can't seem to find the correct solution.
Thank you,
Inti
darova on 5 May 2020
Use nested for loop
fnames = fieldnames(A);
B = [];
for i = 1:length(fnames)
b1 = getfield(A,fnames{i});
s = whos('b1');
if strcmp('struct',s.class) % if type of variable is 'struct'
fnames1 = fieldnames(b1);
for j = 1:length(fnames1)
b2 = getfield(b1,fnames1{j});
B = [B; b2];
end
else
B = [B; b1];
end
end