Matlab:ismember中的bug?

Matlab:ismember中的bug?,matlab,Matlab,我在某处定义了一个枚举: classdef MyError enumeration Error0 Error1 Error2 end end 然后,我尝试用不同版本的Matlab调用ismember R2012a: >> enums = enumeration('MyError'); >> ismember(MyError.Error0,enums) ans = 1 R2013b: >> enums

我在某处定义了一个枚举:

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); 
我正在查看发出错误的代码,无法理解调用“sort”的目的是什么,因为它的输入是标量值,而输出没有存储。鉴于在枚举值上调用ismember是一项相当常见的任务,我很惊讶看到这样的倒退


有什么解决方法吗?

我无法在本地测试,但您可能需要检查稍微修改一下的类定义是否可以:

classdef MyError < uint32

  enumeration

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

  end

end
对任何数值类型进行子类化都会得到排序方法。
这仍然不是一个真正的修复或解释,但可能是最好的解决办法。

不幸的是,这似乎是一个功能,而不是一个bug

在“旧”版本的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标志,很可能这样做。

sort只是作为ismember后面的算法的一部分来加速事情。然而,错误消息也表明,似乎有一些特殊的处理方法-考虑到有一个子函数称为ismember2012a。ismember的行为发生了变化,如果您想要旧的行为设置legacy标志:AFAIK,“legacy”选项必须与LOCB输出参数的顺序或类组合有关,请参阅内联帮助。我没有这样做,所以即使在我的情况下,解决方法可行,Mathworks也确实引入了一个bug。我猜2倍于同一类的组合也是一个组合。您可以使用遗留标志。rows标志似乎也起到了作用,但我觉得这有点像黑客攻击。-请注意,对sort的调用似乎有些过分,但实际上正是它使ismember如此高效。@DennisJaheruddin注意到没有使用sort调用的输出吗?这怎么能使ismember高效呢?不过,正如OP所评论的,文档行为的改变与观察到的错误没有任何关系。当然,这个bug可能是在引入新行为时出现的。“遗留”技巧对我来说很有效,但这并不意味着Mathworks没有引入bug。。。在旧的帮助文件中没有特别提到我看到的错误。我将向Mathworks提交一份票证,看看他们对此有何评论。是的,我考虑过这一点,但我使用的实际类实现具有属性,并且当内置类用作父类时,Matlab不允许使用属性。