FAQ MATLAB
FAQ MATLABConsultez toutes les FAQ
Nombre d'auteurs : 11, nombre de questions : 172, dernière mise à jour : 29 septembre 2022
Une structure est un tableau multidimensionnel dont l'accès aux éléments s'effectue par l'utilisation de noms de champs.
Ce type de variable convient parfaitement aux données référencées (base de données, carnet d'adresses…).
Comme les tableaux de cellules, les structures peuvent contenir tous les types de variables (matrice, chaîne de caractère, tableau de cellules, structures etc.).
L'initialisation d'une structure s'effectue directement ou à l'aide de la fonction structDocumentation de la fonction struct.
S.nom = 'Caro-Line'
;
S.age = 33;
S.fonction = 'Modératrice MATLAB'
;
Le code précédent crée une structure S dont les trois champs sont « nom », « age » et « fonction ».
Une structure est un type de variable multidimensionnelle :
S(1,1).nom = 'Caro-Line'
;
S(1,1).age = 33;
S(1,1).fonction = 'Modératrice MATLAB'
;
S(2,1).nom = 'Dut'
;
S(2,1).age = 30;
S(2,1).fonction = 'Responsable MATLAB'
;
S(3,1).nom = 'tug83'
;
S(3,1).age = 27;
S(3,1).fonction = 'Modérateur MATLAB'
;
S(4,1).nom = 'rostomus'
;
S(4,1).age = 24;
S(4,1).fonction = 'Modérateur MATLAB'
;
Le code précédent crée un tableau de structures S de dimension 3x1.
Ce même tableau de structures S peut être directement créé de cette façon :
S = struct('nom'
,{'Caro-Line'
; 'Dut'
; 'tug83'
; 'rostomus'
}, ...
'age'
,{33 ; 30 ; 27 ; 24}, ...
'fonction'
,{'Modératrice MATLAB'
; 'Responsable MATLAB'
; 'Modérateur MATLAB'
; 'Modérateur MATLAB'
})
L'accès s'effectue en mentionnant le nom du champ désiré comme ceci :
S = struct('nom'
,{'Caro-Line'
; 'Dut'
; 'tug83'
; 'rostomus'
}, ...
'age'
,{33 ; 30 ; 27 ; 24}, ...
'fonction'
,{'Modératrice MATLAB'
; 'Responsable MATLAB'
; 'Modérateur MATLAB'
; 'Modérateur MATLAB'
});
>> S(1,1).nom
ans =
Caro-Line
>> S(3,1).fonction
ans =
Modérateur MATLAB
L'accès aux éléments à l'intérieur d'une structure s'effectue en utilisant soit (), soit {}, soit ., en fonction du type de l'élément.
S(1,1).data = {[1 2 ; 3 4] 'raw'
};
S(1,1).range = [1:50];
S(1,1).operateur.nom = 'moi'
;
S(1,2).data = {ones(5) 'filter'
};
S(1,2).range = [51:100];
S(1,2).operateur.nom = 'toi'
;
>> S(1,1).data{1}
ans =
1 2
3 4
>> S(1,1).data{1}(2,1)
ans =
3
>> S(1,2).data{2}
ans =
filter
>> S(1,2).range(1:10)
ans =
51 52 53 54 55 56 57 58 59 60
>> S(1,2).operateur.nom
ans =
toi
Les champs dynamiques de structure sont disponibles depuis la version 6.5 de MATLAB. Ils se substituent (presque) aux fonctions getfieldDocumentation de la fonction getfield et setfieldDocumentation de la fonction setfield (ou eval). Ils offrent une syntaxe plus naturelle à l'indexage des structures par leurs champs dont le nom peut être variable.
À la place de :
>> maStructure = struct();
>> champ = 'nomDynamique'
;
>> maStructure = setfield(maStructure, champ, 42)
maStructure =
nomDynamique: 42
>> valeur = getfield(maStructure, champ)
valeur =
42
on a :
>> maStructure = struct();
>> champ = 'nomDynamique'
;
>> maStructure.(champ) = 42
maStructure =
nomDynamique: 42
>> valeur = maStructure.(champ)
valeur =
42
Cette notation permet entre autres :
- de supprimer le coût d'appel aux fonctions setfield et getfield ;
- d'éviter deux copies de la structure dues au passage en paramètre et retour.
On notera que l'usage des fonctions getfield et setfield reste néanmoins nécessaire pour des manipulations complexes. Par exemple, un nombre de descendants inconnu :
>> champs = {'un'
, 'deux'
, 'trois'
};
>> maStructure = struct();
>> maStructure = setfield(maStructure, {5}, champs{:} , 3);
% équivalent à
% maStructure(5).(champs{1}).(champs{2}).(champs{3}) = 3
>> maStructure.un.deux.trois
ans =
trois: 3
>> champs{end+1} = 'quatre'
;
>> maStructure = struct();
>> maStructure = setfield(maStructure, {5}, champs{:} , 4);
% équivalent à
% maStructure(5).(champs{1}).(champs{2}).(champs{3}).(champs{4}) = 4
>> maStructure.un.deux.trois.quatre
ans =
quatre: 4
On pourra à tout moment obtenir la liste des champs d'un niveau de la structure avec la fonction fieldnamesDocumentation de la fonction fieldnames.
Lien : Use Dynamic Field References