Comment définir une structure dans Matlab

je sais qu'une structure peut être définie par plusieurs moyens tels que:

  1. ajouter des champs à une variable

    p.color.red = .2;
    p.color.green = .4;
    p.color.blue = .7;
    
  2. 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?

18
demandé sur Amro 2010-11-12 18:55:58

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

6
répondu aschepler 2010-11-12 16:04:08

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:

32
répondu Amro 2010-11-12 21:32:16