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 Kommentar

Image Analyst
Image Analyst am 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.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Image Analyst
Image Analyst am 1 Nov. 2014

1 Stimme

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 Kommentare

pietro
pietro am 1 Nov. 2014
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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Jan
Jan am 1 Nov. 2014
Bearbeitet: Jan am 1 Nov. 2014

1 Stimme

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 am 1 Nov. 2014
Bearbeitet: per isakson am 1 Nov. 2014

0 Stimmen

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 Kommentare

pietro
pietro am 1 Nov. 2014
Bearbeitet: pietro am 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.
per isakson
per isakson am 1 Nov. 2014
"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 am 1 Nov. 2014
Bearbeitet: per isakson am 1 Nov. 2014
ok - I fixed it
pietro
pietro am 1 Nov. 2014
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 am 1 Nov. 2014
Bearbeitet: per isakson am 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.
pietro
pietro am 1 Nov. 2014
Why? I need it for printing the result in one xls file
per isakson
per isakson am 1 Nov. 2014
Bearbeitet: per isakson am 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

Melden Sie sich an, um zu kommentieren.

Kategorien

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by