44 votes

Comment puis-je créer des types énumérés dans MATLAB?

Existe-il des types énumérés dans MATLAB? Si non, quelles sont les alternatives?

44voto

Jonas Points 54073

À partir de R2010b, MATLAB prend en charge les énumérations.

Exemple tiré de la documentation:

classdef Colors
   properties
      R = 0;
      G = 0;
      B = 0;
   end

   methods
      function c = Colors(r, g, b)
         c.R = r; c.G = g; c.B = b;
      end
   end

   enumeration
      Red   (1, 0, 0)
      Green (0, 1, 0)
      Blue  (0, 0, 1)
   end
end

28voto

Marc Points 1771

Vous pouvez obtenir une partie de la fonctionnalité avec le nouveau style de MATLAB classes:

classdef (Sealed) Colors
    properties (Constant)
        RED = 1;
        GREEN = 2;
        BLUE = 3;
    end

    methods (Access = private)    % private so that you cant instantiate
        function out = Colors
        end
    end
end

Ce n'est pas vraiment un type, mais depuis MATLAB est faiblement typé, si vous utilisez des nombres entiers, vous pouvez faire des choses qui se rapprochent de ça:

line1 = Colors.RED;
...
if Colors.BLUE == line1
end

Dans ce cas, MATLAB "enum" sont proches de style C enums - remplacer la syntaxe pour les entiers.

Avec la prudence dans l'utilisation de méthodes statiques, vous pouvez même faire MATLAB enums approche d'Ada dans la sophistication, mais malheureusement avec le plus maladroit de la syntaxe.

18voto

gnovice Points 70970

Si vous voulez faire quelque chose de similaire à ce que Marc a suggéré, vous pouvez simplement faire une structure pour représenter vos types énumérés au lieu d'une toute nouvelle classe:

colors = struct('RED',1,'GREEN',2,'BLUE',3);

L'un des avantages est que vous pouvez facilement accéder à des structures de deux façons différentes. Vous pouvez spécifier un champ en utilisant directement le nom du champ:

a = colors.RED;

ou vous pouvez utiliser la dynamique des noms de champ, si vous avez le nom du champ dans une chaîne de caractères:

a = colors.('RED');

En vérité, il ya quelques avantages à faire ce que Marc a suggéré, et la création d'une toute nouvelle classe pour représenter un "enum" objet:

  • Vous pouvez contrôler la façon dont l'objet est modifié.
  • Vous pouvez conserver la définition en un seul endroit et facilement l'utiliser dans de multiples endroits.
  • Vous pouvez les défaillances de contrôle et de les rendre plus "gracieux", comme au retour d'une matrice vide si vous essayez d'accéder à un champ inexistant (par opposition à lancer une erreur).

Toutefois, si vous n'avez pas besoin de ce genre de complexité et juste besoin de faire quelque chose de rapide, une structure est probablement la plus facile et la plus straight-forward de la mise en œuvre. Il travaillera également avec les anciennes versions de MATLAB qui n'utilisent pas le nouveau cadre de la programmation orientée objet.

8voto

kv. Points 81

Il est en fait un mot-clé dans MATLAB R2009b appelé 'énumération'. Il semble être sans-papiers, et je ne peux pas dire que je sais comment l'utiliser, mais la fonctionnalité est probablement là.

Vous pouvez le trouver en matlabroot\toolbox\distcomp\examples\+examples

classdef(Enumeration) DmatFileMode < int32

    enumeration
        ReadMode(0)
        ReadCompatibilityMode(1)
        WriteMode(2)
    end
<snip>
end

7voto

Andrew Janke Points 11942

Vous pouvez également utiliser énumérer les classes Java à partir de votre code Matlab. Définir en Java et les mettre sur votre Matlab javaclasspath.

// Java class definition
package test;
public enum ColorEnum {
    RED, GREEN, BLUE
}

Vous pouvez faire référence à son nom dans M-code.

mycolor = test.ColorEnum.RED
if mycolor == test.ColorEnum.RED
    disp('got red');
else
    disp('got other color');
end

% Use ordinal() to get a primitive you can use in a switch statement
switch mycolor.ordinal
    case test.ColorEnum.BLUE.ordinal
        disp('blue');
    otherwise
        disp(sprintf('other color: %s', char(mycolor.toString())))
end

Il ne sera pas attraper des comparaisons avec d'autres types. Et la comparaison de chaîne de caractères a une drôle de retour de la taille.

>> test.ColorEnum.RED == 'GREEN'
ans =
     0
>> test.ColorEnum.RED == 'RED'
ans =
     1     1     1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X