2013-12-10 71 views
0

我有一个枚举某处定义:Matlab:在ismember中的错误?

classdef MyError 

    enumeration 

    Error0 
    Error1 
    Error2 

    end 

end 

然后,我想一个简单的调用不同版本的Matlab在ismember。

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 'legacy'选项必须与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

但是,正如OP所评论的那样,文件行为的改变与观察到的错误没有任何关系。当然这个错误大概是在介绍新行为的时候出现的。 – sebastian

+0

“传统”技巧适用于我,但这并不意味着Mathworks不会引入错误......旧帮助文件中没有任何内容特别提及我目睹的错误。我将向Mathworks提交一张票,并看看他们对此有何评论。 –