Concatenation of arrays of structure

47 vues (au cours des 30 derniers jours)
pietro
pietro le 1 Nov 2014
Commenté : Image Analyst le 1 Nov 2014
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 commentaire
Image Analyst
Image Analyst le 1 Nov 2014
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.

Connectez-vous pour commenter.

Réponse acceptée

Image Analyst
Image Analyst le 1 Nov 2014
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 commentaires
pietro
pietro le 1 Nov 2014
thanks for your reply. How can I adapt it for a more general solution? My struct array is 500 elements long.
Image Analyst
Image Analyst le 1 Nov 2014
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

Connectez-vous pour commenter.

Plus de réponses (2)

Jan
Jan le 1 Nov 2014
Modifié(e) : Jan le 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 le 1 Nov 2014
Modifié(e) : per isakson le 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 commentaires
pietro
pietro le 1 Nov 2014
Why? I need it for printing the result in one xls file
per isakson
per isakson le 1 Nov 2014
Modifié(e) : per isakson le 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

Connectez-vous pour commenter.

Catégories

En savoir plus sur Structures dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by