2017-08-03 4 views
0

J'essaie de parcourir plusieurs structures à la fois, d'extraire des variables d'intérêt et de les combiner en un seul tableau de cellules. Le problème: toutes les variables ont les mêmes noms. J'ai un pseudo-code fonctionnel - le voici:Comment faire une boucle sur plusieurs structures et effectuer les mêmes opérations [Matlab]

Supposons que je charge des structures i dans mon espace de travail. Maintenant, je veux faire une boucle dans chaque structure, et extraire les données de temps et de position de chaque structure.

D'abord, je charge mes structures. Quelque chose comme ...

data_1 
data_2 
data_3 

Ensuite, créer un tableau de cellules de taille appropriée. Enfin, je boucle dans mes structures pour extraire des réseaux de cellules et créer un seul réseau. Je veux terminer avec un tableau de cellules contenant une concaténation de toutes les variables dans une structure de cellule unique.

Pourriez-vous s'il vous plaît aider à convertir mon pseudo code/idées en un script, ou me diriger vers des ressources qui pourraient aider?

Merci!

+0

Comment est ce code ne vous donne pas ce que vous voulez? Quelles erreurs courez-vous? – Flynn

+0

Merci, laissez-moi clarifier ma question: je ne sais pas comment boucler réellement à travers des structures "i". En d'autres termes, comment définir "i", une variable numérique changeante, dans le cadre d'un nom de structure? – ahach

+0

Ok, en utilisant eval devrait fonctionner. plus en changeant je à une chaîne. – Flynn

Répondre

1
... 
    eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;']) 
    eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;']) 
... 
+0

Bien que cet extrait de code puisse être une solution, il serait [grandement amélioré s'il comprenait une explication] (// meta.stackexchange.com/q/114762) de * comment * et * pourquoi * cela résout le problème.S'il vous plaît [modifier] votre réponse pour ajouter une explication, et donner une indication des limites et des hypothèses qui s'appliquent. – whrrgarbl

+0

Will faire, je vais résumer mon code et le poster dans un peu. – ahach

1

Vous allez probablement mieux charger vos données internes à la boucle et le stocker dans une cellule ou une structure plutôt que d'essayer de traiter avec des variables itérativement nommées dans votre espace de travail. eval est, dans presque tous les cas, une odeur de code significative, notamment parce que le compilateur JIT de MATLAB ignore les instructions eval de sorte que vous n'obtenez aucune des optimisations du moteur. Les instructions eval sont également difficiles à analyser, à déboguer et à gérer.

Un exemple d'une approche plus forte:

for ii = 1:nfiles 
    tmp = load(thefilenames{ii}); % Or use output of dir 

    trialstr = sprintf('trial_%u', ii); % Generate trial string 
    data.(trialstr).time = tmp.numbers.time; 
    data.(trialstr).position = tmp.numbers.position; 
end 

Ce qui vous laisse avec une structure de données finale de:

data 
    trial_n 
    time 
    position 

Ce qui est beaucoup plus facile à itérer plus tard.

+0

Merci, j'aime cette idée, il sera utile pour quand je dois accéder à ces variables à nouveau pour d'autres calculs plus tard. – ahach

1

Mon script final pour toute personne intéressée:

for i = 1:4 %for 4 structures that I am looping through 
    eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;']); 
    eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;']); 
    %concatenate data into a single cell array here 
    time{i} = {eval(['time_',num2str(i)])}; 
    position{i} = {eval(['position_',num2str(i)])}; 
end