2013-12-10 8 views
0

У меня есть перечисление определено где:Matlab: ошибка в ismember?

classdef MyError 

    enumeration 

    Error0 
    Error1 
    Error2 

    end 

end 

Затем я пытаюсь простой вызов IsMember с другой версии Matlab.

R2012a: 

>> enums = enumeration('MyError'); 
>> ismember(MyError.Error0,enums) 

ans = 

    1 

R2013b:

>> enums = enumeration('MyError'); 
>> ismember(MyError.Error0,enums) 
Undefined function 'sort' for input arguments of type 'MyError'. 
Error in ismember>ismemberClassTypes (line 711) 
    sort(ab(1)); 
Error in ismember>ismemberR2012a (line 490) 
      lia = ismemberClassTypes(a,b); 
Error in ismember (line 57) 
    [varargout{1:max(1,nargout)}] = ismemberR2012a(A,B); 

Я смотрю на код, выдавшего ошибку, и я не могу понять, что цель вызова «рода», потому что его вход скалярное значение и выход не сохраняется. Учитывая, что вызов ismember по перечислимой ценности является довольно общей задачей, я удивлен, увидев такие регрессии.

Любые идеи для рабочего процесса?

+0

'sort' просто используется как часть алгоритма, стоящего за' ismember', чтобы ускорить все. Однако сообщение об ошибке также указывает на то, что, как представляется, существует особая процедура - при условии, что существует подфункция, называемая 'ismember2012a'. – sebastian

+0

Поведение 'ismember' изменилось, если вы хотите старое поведение установить устаревшую флаг: http://stackoverflow.com/questions/20397910/matlab-behavior-of-the-unique-function/20398118#20398118 – Daniel

+0

AFAIK Параметр «устаревший» должен выполнять либо с упорядочением выходного аргумента LOCB, либо с помощью комбинации классов (см. встроенную справку). Я ничего не делаю, поэтому, даже если обходное решение работает в моем случае, Mathworks действительно представила ошибку. –

ответ

0

Я не могу проверить это на месте, но вы можете проверить, что система работает с немного измененным определением класса:

classdef MyError < uint32 

    enumeration 

    Error0 (0) 
    Error1 (1) 
    Error2 (2) 

    end 

end 

подклассов любой числовой тип должен получить вам sort -метод. Это все еще не настоящее исправление или объяснение, но может оказаться лучшим решением.

+0

Да, я думал об этом, но реальная реализация класса, которую я использую, имеет свойства, и Matlab не разрешает свойства, когда встроенный класс используется как родительский. –

0

К сожалению, это, кажется, особенность, а не ошибка.

В «старой» версии MATLAB, то файл справка состояние:

In a future release, the behavior of ismember will change including: 
    - occurrence of indices in LOCB will switch from highest to lowest 
    - tighter restrictions on combinations of classes 

In order to see what impact those changes will have on your code, use: 

    [LIA,LOCB] = ismember(A,B,'R2012a') 
    [LIA,LOCB] = ismember(A,B,'rows','R2012a') 

If the changes in behavior adversely affect your code, you may preserve 
the current behavior with: 

    [LIA,LOCB] = ismember(A,B,'legacy') 
    [LIA,LOCB] = ismember(A,B,'rows','legacy') 

Если я пытаюсь его с R2012a флага включено, я действительно получаю ошибку, что вы упоминаете. Поэтому я полагаю, что данный совет будет работать на вас. Добавьте флаг legacy и, скорее всего, это будет трюк.

+0

Тем не менее, как отмечал ОП, изменение документа в поведении не имеет никакого отношения к наблюдаемой ошибке. Хотя, конечно, ошибка, по-видимому, возникла при введении нового поведения. – sebastian

+0

«Унаследованный» трюк работает для меня, но это не значит, что Mathworks не представила ошибку ... в старых файлах справки нет ничего конкретного, что я упоминаю об ошибке. Я подам билет Mathworks и посмотрю, что они могут сказать об этом. –

Смежные вопросы