Vertical concatenation of structure fields
41 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Initial Conditions
le 23 Sep 2014
Commenté : Kelly Kearney
le 23 Sep 2014
Hi,
I have a structure 'all' which has 45 fields with names 'day_X' where X goes from 1 to 45. Each 'day_X' level has 19 fields and it is these fields I want to concatenate. The fields are all vectors, and each Day_X struct has the same structure (fieldnames).
In other words, I want to vertically concatenate all.day_1.field1 through all.day_45.field1 , for each field. Is there an efficient way of doing this i.e., without a loop? I've tried numerous things, including a loop, but I know this can probably be done in a few lines.
Thanks in advance.
0 commentaires
Réponse acceptée
Kelly Kearney
le 23 Sep 2014
I'd do it with one loop and one cellfun. You might be able to eliminate the loop entirely, but this keeps it a little more readable, in my opinion.
all.day1.one = 1;
all.day2.one = 2;
all.day1.two = 3;
all.day2.two = 4;
fld1 = fieldnames(all);
fld2 = fieldnames(all.day1);
for ii = 1:length(fld1)
tmp = cellfun(@(x) all.(x).(fld2{ii}), fld1, 'uni', 0);
A.(fld2{ii}) = cat(1, tmp{:});
end
3 commentaires
Plus de réponses (1)
Guillaume
le 23 Sep 2014
First of all, do not name your structure all as that shadows the name of a very useful matlab function.
Secondly, having a structure the way you've done it a bad idea (as you've just found out). You should have made the day field a structure array and the same with the field field.
Anyway, to answer your question:
c = cellfun(@(fn) all.(fn).field1, fieldnames(all), 'UniformOutput', false);
vertfield1 = vertcat(c{:});
Voir également
Catégories
En savoir plus sur Structures dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!