Concatenation of arrays of structure

Hi all
I have to concatenate the field of an array of structure. Here a simple example:
a=struct('a',[]);
a(1).a=[1:5;6:10];
a(2).a=[10:50;60:100]; [EDITED, should be:] [10:10:50; 60:10:100]
Results:
Concatenated_afield=[1,2,3,4,5,6,7,8,9,10;10,20,30,40,50,60,70,80,90,100]
Thank you
Best regards

1 Comment

You can't do that unless you change the step in (2) to be 10 instead of 1, or change (1) to be a 2-by-41 array like (2) is instead of a 2 by 5 array.

Sign in to comment.

 Accepted Answer

Try this:
% Construct sample data
s=struct('a',[]);
s(1).a=[1:5;6:10]
s(2).a=[10:10:50;60:10:100]
% Now concatenate:
t1 = s(1).a'
t2 = s(2).a'
output = [t1(:), t2(:)]'
In the command window:
t1 =
1 6
2 7
3 8
4 9
5 10
t2 =
10 60
20 70
30 80
40 90
50 100
output =
1 2 3 4 5 6 7 8 9 10
10 20 30 40 50 60 70 80 90 100
Note I didn't use the field name of "a" on a structure also called "a" - I think that's a very bad idea that will lead to confusion, so I named my structure "s".

2 Comments

thanks for your reply. How can I adapt it for a more general solution? My struct array is 500 elements long.
Use a for loop
% Construct sample data
s=struct('a',[]);
s(1).a=[1:5;6:10]
s(2).a=[10:10:50;60:10:100]
s(3).a=[20:10:60;70:10:110]
% Now concatenate
for k = 1 : length(s)
this_t = s(k).a'
output(k, :) = this_t(:)';
end
output

Sign in to comment.

More Answers (2)

Jan
Jan on 1 Nov 2014
Edited: Jan on 1 Nov 2014
a = struct('a',[]);
a(1).a = [1:5; 6:10];
a(2).a = [10:10:50; 60:10:100];
v = cat(2, a.a);
r = reshape(permute(reshape(v, 2, 5, 2), [3,2,1]), [2, 10]);
per isakson
per isakson on 1 Nov 2014
Edited: per isakson on 1 Nov 2014
I assume that &nbsp [10:50;60:100] &nbsp should be &nbsp [10:10:50;60:10:100]
a=struct('a',[]);
a(1).a=[1:5;6:10];
a(2).a=[10:10:50;60:10:100];
>> cat( 1, transpose( a(1).a(:) ), transpose( a(2).a(:) ) )
ans =
1 6 2 7 3 8 4 9 5 10
10 60 20 70 30 80 40 90 50 100
&nbsp
And another try
transpose(cell2mat(arrayfun(@(s)reshape(transpose(s.a),[],1),a,'uni',false)))
ans =
1 2 3 4 5 6 7 8 9 10
10 20 30 40 50 60 70 80 90 100
And a for-loop
M = nan( length(a), length(a(1).a(:)) );
for jj = 1 : length( a)
M( jj, : ) = [ a(jj).a(1,:), a(jj).a(2,:) ];
end
xlswrite( filespec, M )

8 Comments

pietro
pietro on 1 Nov 2014
Edited: pietro on 1 Nov 2014
Thanks for your help, but the result is different and it works only with arrays with two elements. My array is longer than 500 elements.
"but the result is different" &nbsp In what way different?
This is the result I need:
1 2 3 4 5 6 7 8 9 10
10 20 30 40 50 60 70 80 90 100
per isakson
per isakson on 1 Nov 2014
Edited: per isakson on 1 Nov 2014
ok - I fixed it
Thanks, but I still get a different result, in the first row I have 1 6 3...instead of 1 2 3.
per isakson
per isakson on 1 Nov 2014
Edited: per isakson on 1 Nov 2014
Now I think I got it right. It's a bit ridiculous to squeeze it into one line. A plain for-loop is probably better.
Why? I need it for printing the result in one xls file
per isakson
per isakson on 1 Nov 2014
Edited: per isakson on 1 Nov 2014
Because the for-loop is
  • easier to construct
  • easier to read and understand in three weeks from now
  • and - I guess - executes faster

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!