# how to concatenate structure fields

37 views (last 30 days)
Newman on 15 Jul 2016
Commented: Azzi Abdelmalek on 15 Jul 2016
Hello I have a structure s(i).f(j).d where i=1:40 and j=1:10.I want to concantenate all the fields in to one single matrix. for eg
for j=1:10
m(:,j)=s(1).f(j).d
with the following code above
this concatenates 10 column matrix into m .But this is just for s(1) how to proceed for s1..s2...s40 for all the 40 fields?

Azzi Abdelmalek on 15 Jul 2016
Look at this example
s(1).f(1).d=11
s(1).f(2).d=12
s(2).f(1).d=21
s(2).f(2).d=22
a=s.f
n=numel(a)
for k=1:numel(s)
M(k,:)=[s(k).f(1:n).d]
end
Azzi Abdelmalek on 15 Jul 2016
a=s.f;
n=numel(a);
M=[]
for k=1:numel(s)
b=[s(k).f(1:n).d];
M=[M;b];
end
M

Guillaume on 15 Jul 2016
Use a double for loop, then:
m = zeros(numel(s(1).f(1).d), numel(s(1).f(1)), numel(s)); %preallocation is advised
for sidx = 1:numel(s)
for fidx = 1:numel(s(sidx).f)
m(:, fidx, sidx) = s(sidx).f(fidx).d;
end
end
Note that I've concatenated the s1, ... s40 along the 3rd dimension. You didn't specify what you wanted exactly.
##### 2 CommentsShowHide 1 older comment
Guillaume on 15 Jul 2016
Whichever shape you want for the output, the idea is still the same. Iterate over both arrays. To get the above:
m = zeros(numel(s(1).f(1).d, numel(s) * numel(s(1).f));
col = 1;
for sidx = 1 : numel(s)
for fidx = 1 : numel(f)
m(:, col) = s(sidx).f(idx).d;
col = col + 1;
end
end