Comment puis-je afficher et accéder au contenu d'un tableau de structure dans MATLAB ?
-
15-11-2019 - |
Question
Tout d'abord, je demande à l'utilisateur de saisir ses propres fichiers texte composés d'états, de capitales et de populations et je mets toutes ces valeurs dans un tableau de structure en utilisant le code suivant :
clear
clc
%Part A
textfile=input('What is the name of your text file?\n','s');
fid=fopen(textfile);
file=textscan(fid,'%s %s %f','delimiter',',');
State=file{1}
Capital=file{2}
Population=file{3}
regions=struct('State',State,...
'Capital',Capital,...
'Population',Population)
fclose(fid);
Ma première question :est-il possible d'afficher tous les valeurs dans la structure ?Afficher le tableau de structure me donne simplement ceci :
50x1 struct array with fields:
State
Capital
Population
Et ma deuxième question :est-il possible pour moi d'accéder aux informations de cette structure en essayant de trouver, par exemple, 'California'
seulement?
La solution
Comme vous l'avez déjà découvert, l'affichage par défaut des tableaux de structure dans MATLAB ne vous dit pas grand-chose, juste les dimensions des tableaux et les noms de champs.Si vous souhaitez voir le contenu, vous devrez créer vous-même une sortie formatée.Une façon de procéder consiste à utiliser STRUCT2CELL pour collecter le contenu de la structure dans un tableau de cellules, puis utilisez FPRINTF pour afficher le contenu de la cellule dans un format particulier.Voici un exemple :
>> regions = struct('State',{'New York'; 'Ohio'; 'North Carolina'},...
'Capital',{'Albany'; 'Columbus'; 'Raleigh'},...
'Population',{97856; 787033; 403892}); %# Sample structure
>> cellData = struct2cell(regions); %# A 3-by-3 cell array
>> fprintf('%15s (%s): %d\n',cellData{:}); %# Print the data
New York (Albany): 97856
Ohio (Columbus): 787033
North Carolina (Raleigh): 403892
Concernant votre deuxième question, vous pouvez récupérer les entrées du 'State'
champs dans un tableau de cellules, comparez-les à un nom donné avec STRCMP pour obtenir un index logique, puis récupérez l'élément de tableau de structure correspondant :
>> stateNames = {regions.State}; %# A 1-by-3 cell array of names
>> stateIndex = strcmp(stateNames,'Ohio'); %# Find the index for `Ohio`
>> stateData = regions(stateIndex) %# Get the array element for `Ohio`
stateData =
State: 'Ohio'
Capital: 'Columbus'
Population: 787033
NOTE:
Comme vous le mentionnez dans un commentaire, chacun 'Population'
l'entrée dans votre tableau de structure finit par contenir l'intégralité du vecteur 50 x 1 de données de population.Cela est probablement dû au fait que file{3}
dans votre exemple de code contient un vecteur, alors que file{1}
et file{2}
contenir tableaux de cellules.Afin de distribuer correctement le contenu du vecteur dans file{3}
à travers les éléments du tableau de structure, vous devez diviser le vecteur et placer chaque valeur dans une cellule distincte d'un tableau de cellules en utilisant NUM2CELL avant de le transmettre à STRUCTURER.Définir Population
comme ça devrait résoudre le problème :
Population = num2cell(file{3});