L'itération sur les struct fieldnames dans MATLAB
Ma question est facilement résumer comme suit: "Pourquoi ne le suivant pas de travail?"
teststruct = struct('a',3,'b',5,'c',9)
fields = fieldnames(teststruct)
for i=1:numel(fields)
fields(i)
teststruct.(fields(i))
end
de sortie:
ans = 'a'
??? Argument to dynamic structure reference must evaluate to a valid field name.
Surtout depuis teststruct.('a')
ne travail. Et fields(i)
imprime ans = 'a'
.
Je ne peux pas obtenir ma tête autour de lui.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser des accolades (
{}
) pour accéder àfields
, depuis lefieldnames
fonction renvoie un matrice de cellules de de chaînes:En utilisant des parenthèses pour accès aux données dans des cellules de tableau va juste retourner une autre cellule de tableau, qui est affiché différemment à partir d'un tableau de caractères:
Depuis
fields
oufns
sont des tableaux de cellules, vous devez d'index avec des accolades{}
afin d'accéder au contenu de la cellule, c'est à dire la chaîne de caractères.Note que, au lieu de boucler sur un numéro, vous pouvez également en boucle sur
fields
directement, par l'utilisation d'un joli Matlab fonctionnalités qui vous permet de boucle dans un tableau. La variable d'itération prend la valeur de chaque colonne de la matrice.Votre programme pnr est un cellstr tableau. Vous avez besoin de l'indice de lui avec {} au lieu de () pour obtenir la corde comme char.
Indexation dans avec () renvoie un 1-long cellstr tableau, ce qui n'est pas le même format que le char tableau que l' ".(nom)," dynamique de référence de terrain veut. La mise en forme, en particulier dans l'écran de sortie, peut être source de confusion. Pour voir la différence, essayez ceci.
Vous pouvez utiliser la boîte à outils de http://www.mathworks.com/matlabcentral/fileexchange/48729-for-each.
Utilisation:
Je l'aime beaucoup. Crédit bien sûr aller à Jeremy Hughes, qui a développé la boîte à outils.