Comment puis-je accéder à la structure des champs dynamiquement?
J'ai une structure avec de nombreux champs qui sont des vecteurs de longueurs différentes. Je voudrais accéder aux champs à l'intérieur d'une boucle, dans l'ordre. J'ai essayé getfield comme suit, mais ELLE n'aime pas cela. Comment puis-je faire cela?
S = struct('A', [1 2], 'B',[3 4 5]);
SNames = fieldnames(S);
for loopIndex = 1:2
field = getfield(S, SNames(loopIndex));
%do stuff w/field
end
??? Index exceeds matrix dimensions
Je suis en utilisant des structures, en premier lieu, car un tableau auraient de la difficulté avec les différentes longueurs de champ. Est-il une meilleure alternative pour qui?
Vous devez vous connecter pour publier un commentaire.
Essayer champ dynamique de référence où vous mettez une chaîne de caractères dans la parenthèse comme on le voit sur la ligne définissant trucs.
Je suis d'accord avec Steve et Adam. Utiliser des cellules. Cette syntaxe est bon pour les gens dans d'autres situations, si!
Il y a trois points que je voudrais faire ici:
La raison pour laquelle vous faites une erreur dans votre code ci-dessus est à cause de la façon dont vous êtes l'indexation
SNames
. La fonctionfieldnames
renvoie une matrice de cellules de de chaînes, de sorte que vous avez à utiliser l'indexation de contenu (c'est à dire des accolades) pour accéder à la chaîne des valeurs. Si vous modifiez la quatrième ligne dans votre code à ceci:puis votre code devrait fonctionner sans erreur.
Comme suggéré par MatlabDoug, vous pouvez utiliser dynamique des noms de champ pour éviter d'avoir à utiliser
getfield
(qui donne propres à la recherche du code, à mon avis).La suggestion d'Adam d'utiliser un matrice de cellules de au lieu d'une structure est à droite sur la marque. Ce est généralement la meilleure façon de collecter une série de tableaux de longueurs différentes en une seule variable. Votre code peut finir par ressembler à cela:
La getfield approche est d'accord (même si je n'ai pas de MATLAB disponible dès maintenant et ce n'est pas clair pour moi pourquoi le ci-dessus ne fonctionnerait pas).
Pour une autre structure de données, vous pouvez également regarder dans MATLAB tableaux de cellules. Ils vous permettent également de stocker et de l'indice de vecteurs de longueur variable.
Vous pouvez utiliser du côlon notation pour éviter d'indices:
Si vous avez besoin d'utiliser une structure de ce que j'ai trouvé très bien fonctionné était d'abord de convertir une cellule alors que vous avez le meilleur des deux mondes.
J'ai utilisé quelque chose de similaire pour quelque chose qui a été généré dans une structure (struct) et puis j'ai besoin d'y accéder comme une matrice, dans ce cas, c'était aussi simple que
Pour la convertir en une matrice
Juste pour ajouter une autre réponse à la mix. J'aime la solution de @Niver, mais il ne fonctionne que pour les champs avec une seule lettre de noms. La solution que j'ai utilisé était:
for
va itérer sur les colonnes d'une matrice de cellules (d'où le transposer surfieldnames(S)'
. Pour chaque boucle SName devient une 1x1 matrice de cellules de nous utilisons donc l'indexation de contenu pour accéder à la première et seul élément avecSName{1}
.