MATLAB: Sorting a custom enumeration

enumerationsMATLABoopsort

For various reasons, I want to be able to define an enumeration. This enumeration will have some properties. I'd also like to be able to use it as a key.
Undefined function 'sort' for input arguments of type 'MyGreatEnum'.
However, methods like 'unique' don't work, which is strange for me, as there is clearly a well defined set of unique enums in a list of enums, that are from the same class.
Any ideas?
i.e. I'd like to do
events
events =
2×1 MyGreatEnum enumeration array
MyGreatEnum1
MyGreatEnum2
unique(events)
Error using sort
Undefined function 'sort' for input arguments of type 'MyGreatEnum'.
Error in unique>uniqueR2012a (line 211)
sortA = sort(a);
Error in unique (line 103)
[varargout{1:nlhs}] = uniqueR2012a(varargin{:});

Best Answer

You should be able to sort your enumeration class if you derive it from a numeric class:
classdef myGreatEnum < double
enumeration
myGreatEnum1 (1)
myGreatEnum2 (2)
myGreatEnum3 (3)
myGreatEnum4 (4)
myGreatEnum5 (5)
myGreatEnum6 (6)
myGreatEnum7 (7)
myGreatEnum8 (8)
myGreatEnum9 (9)
end
end
>> events = [myGreatEnum.myGreatEnum1, myGreatEnum.myGreatEnum5, myGreatEnum.myGreatEnum2, myGreatEnum.myGreatEnum5];
>> unique(events)
ans =
1×3 myGreatEnum enumeration array
myGreatEnum1 myGreatEnum2 myGreatEnum5
Personally, I don't like the way enumerations are implemented in matlab. I would recommend that you use ordinal categorical arrays instead of enums.
>> events = categorical([1 5 2 5], 1:9, compose('MyGreatEnum%d', 1:9), 'Ordinal', true)
events =
1×4 categorical array
MyGreatEnum1 MyGreatEnum5 MyGreatEnum2 MyGreatEnum5
>> unique(events)
ans =
1×3 categorical array
MyGreatEnum1 MyGreatEnum2 MyGreatEnum5
Related Question