Existe-il des types énumérés dans MATLAB? Si non, quelles sont les alternatives?
Réponses
Trop de publicités?À 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
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.
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.
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
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