web-dev-qa-db-fra.com

Comment définir une structure dans Matlab

Je sais qu'une structure peut être définie de plusieurs manières, telles que:

  1. Ajout de champs à une variable

    p.color.red = .2;
    p.color.green = .4;
    p.color.blue = .7;
    
  2. Définir une structure scalaire par attribution

    S = struct('a',  0, 'b',  1, 'c',  2);
    

Ce que je veux pouvoir faire est de créer une définition de structure (comme c). Mon objectif final est d'avoir un éventail de structures que je peux parcourir et effectuer des tests sur. Y a-t-il un moyen de définir une structure générique puis de créer des instances? Devrais-je utiliser un autre mécanisme. Je sais que Matlab prend en charge Java, devrais-je utiliser une classe/une interface?

19
Joel B

Contrairement à C, Matlab vous permet d'ajouter ou de supprimer des membres d'une structure au fur et à mesure. Il s'agit plus d'une convention qu'une structure avec certains domaines peut être utilisée avec certaines fonctions.

Donc, oui, ce sont les deux moyens de base de créer des structures. Bien sûr, vous pouvez toujours écrire une fonction dans un fichier * .m qui crée une structure avec certains champs pour vous. Ou si vous voulez obtenir plus de OO, voir ici

6
aschepler

Vous avez mentionné votre objectif était de travailler avec plusieurs structures du même type, vous devez donc être conscient des deux principales approches disponibles pour vous et leur comparaison:

1) Tableau de structures

Vous pouvez l'initialiser en développant la matrice de manière dynamique

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;

Cependant, il est toujours préférable de commencer par pré-allouer le tableau

p = repmat( struct('r',[], 'g',[], 'b',[], 'str',[]), 1, 10);

un autre tour à pré-allouer:

p(10) = struct('r',[], 'g',[], 'b',[], 'str',[]);

Ou même donner toutes les valeurs à l'initialisation:

p = struct('r',{1 0}, 'g',{1 0}, 'b',{1 0}, 'str',{'white' 'black'});

Un moyen simple de remplir des valeurs

names = {'white' 'black'};
[p(1:2).str] = names{:};
red = num2cell([1 0]);
[p(1:2).r] = red{:};

Voici comment vous récupérez toutes les valeurs d'un champ:

red = [p(:).r];
names = {p(:).str};

2) Structures de 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 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 une gamme de structures, et chaque structure a des pointeurs sur son champ (il y a beaucoup de mémoire au-dessus de la mémoire):

>> 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'autre part, puisque chacun des champs d'une structure est stocké comme une éventail à part, il vous appartient de faire respecter le fait qu'ils doivent correspondre à la longueur.

Certains autres publient si vous voulez en savoir plus à ce sujet:

32
Amro