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 Commento

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.

Accedi per commentare.

 Risposta accettata

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 Commenti

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

Accedi per commentare.

Più risposte (2)

Jan
Jan il 1 Nov 2014
Modificato: Jan il 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 il 1 Nov 2014
Modificato: per isakson il 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 Commenti

pietro
pietro il 1 Nov 2014
Modificato: pietro il 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 il 1 Nov 2014
Modificato: per isakson il 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 il 1 Nov 2014
Modificato: per isakson il 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 il 1 Nov 2014
Modificato: per isakson il 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

Accedi per commentare.

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by