Comment définir une structure dans Matlab
je sais qu'une structure peut être définie par plusieurs moyens tels que:
ajouter des champs à une variable
p.color.red = .2; p.color.green = .4; p.color.blue = .7;
Définition d'un scalaire structure par affectation
S = struct('a', 0, 'b', 1, 'c', 2);
ce que je veux pouvoir faire c'est créer une définition de structure (comme C). Mon objectif final est de disposer d'un tableau de structures que je peux parcourir et effectuer des tests sur. Est il possible que je peux définir une structure générique et puis créer des instances de celui-ci? Dois-je utiliser un autre mécanisme. Je sais que MATLAB supporte Java, devrais-je utiliser une classe/interface?
2 réponses
contrairement à C, Matlab vous permet d'ajouter ou de supprimer des membres d'une structure au fur et à mesure. C'est plus une convention qu'un struct avec certains champs peuvent être utilisés avec certaines fonctions.
donc oui, ce sont les deux façons fondamentales de créer des structures. Bien sûr, vous pouvez toujours écrire une fonction dans un *.m fichier qui crée une structure avec certains champs pour vous. Ou si vous voulez obtenir plus de OO, voir ici
vous avez mentionné que votre but était de travailler avec plusieurs structures du même type, donc vous devriez être au courant des deux principales approches à votre disposition et de la façon dont elles se comparent:
1) tableau de structures
vous pouvez l'initialiser en augmentant dynamiquement le tableau
p(1).str = 'white';
p(1).r = 1;
p(1).g = 1;
p(1).b = 1;
p(2).str = 'black';
p(2).r = 0;
p(2).g = 0;
p(2).b = 0;
Toutefois, il est toujours préférable de commencer par pré-allouer le tableau
p = repmat( struct('r',[], 'g',[], 'b',[], 'str',[]), 1, 10);
un autre truc à pré-allouer:
p(10) = struct('r',[], 'g',[], 'b',[], 'str',[]);
ou même donner toutes les valeurs à initialisation:
p = struct('r',{1 0}, 'g',{1 0}, 'b',{1 0}, 'str',{'white' 'black'});
une façon simple de remplir les valeurs
names = {'white' 'black'};
[p(1:2).str] = names{:};
red = num2cell([1 0]);
[p(1:2).r] = red{:};
Voici comment récupérer toutes les valeurs d'un champ:
red = [p(:).r];
names = {p(:).str};
2) structures des tableaux
p.r = [1 0];
p.g = [1 0];
p.b = [1 0];
p.str = {'white' 'black'};
p1 = [p.r(1) p.g(1) p.b(1)];
l'avantage de ceci est que la structure est simplement un tableau de pointeur (r,g,B,str sont stockés séparément en mémoire). Comparez ceci à l'approche précédente, où nous avons un tableau de structure, et chaque structure a des pointeurs vers son champ (il y a toute une mémoire les frais généraux):
>> s1 = repmat( struct('r',0, 'g',0, 'b',0), 1, 1000);
>> s2 = struct('r',zeros(1,1000), 'g',zeros(1,1000), 'b',zeros(1,1000));
>> whos
Name Size Bytes Class Attributes
s1 1x1000 204192 struct
s2 1x1 24372 struct
d'un autre côté, puisque chacun des champs d'une structure est stocké comme un tableau propre, c'est à vous de renforcer le fait qu'ils doivent correspondre en longueur.
Certains autres postes, si vous voulez lire plus à ce sujet: