MATLAB 是否有类似集合的数据类型?

Does MATLAB have any set-like datatype?

我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象

a = [x y z];

b = [x z y];

我希望 isequal(a, b) 到 return 正确。对于数组,情况并非如此。简单的解决方法是在比较之前对条目进行排序。不幸的是,在我的例子中,元素是复杂的对象,不能轻易映射到彼此之间具有明确的数字关系。另一种方法是不使用 isequal,而是使用自定义比较函数,该函数断言匹配长度,然后简单地检查第一个数组中的每个元素是否包含在第二个数组中。但是,在我的例子中,数组并非平凡地嵌套在我试图通过 isequal 进行比较的结构中,并且为封装结构编写自定义比较函数会非常复杂。除了这个排序问题,内置的 isequal 函数满足了我的所有需求,因为它可以正确处理具有任意字段的任意嵌套结构,所以我真的很想避免为此编写复杂的自定义函数。

MATLAB 中是否有允许描述行为的数据类型?或者有没有办法轻松构建这样的自定义类型?在 Java 中,我可以简单地为 equals 方法编写一个带有自定义实现的包装器 class,但是在 MATLAB 中似乎没有这样的机制?

我找到了一种优雅地解决我的问题的方法。与我之前陈述的信念相反,MATLAB 实际上确实允许 class-specific 覆盖 isequal.

classdef CustomType
    properties
        value
    end

    methods
        function self = CustomType(value)
            self.value = value;
        end

        function equal = isequal(self, other)
            if not(isa(other, 'CustomType'))
                equal = false;
                return;
            end

            % implement custom comparison rules here
        end
    end
end

所以,我可以像这样简单地分配有问题的字段,而不必更改我的代码中的任何其他内容:

a = Set([x y z]); % custom type
...
b = Set([x z y]);
...
isequal(a, b); % true

在我的用例中,我什至不需要集合的唯一性 属性。所以我只需要执行 order-independent 比较,不需要将性能浪费在确保不需要的属性上。此外,通过使用专用类型,我可以在分配时明确区分有顺序的字段(即常规数组)和没有顺序的字段。

另一种解决方案可能是覆盖内置的 isequal 并使其在其参数为特定类型时应用自定义比较规则。但是,这会减慢整个程序中的所有比较,并导致封装不良。我觉得使用带有覆盖 isequal 的自定义类型是 解决此类问题的方法。但我仍然认为集合(以及其他类型的常用容器)应该包含在 MATLAB 的基本库中。