我正在寻找一种在MATLAB中比较具有非确定性排序的有限序列数据的方法。基本上,我想要一个数组,但不对其中包含的元素施加顺序限制。如果我有这些对象:
a = [x y z];
并且
b = [x z y];
我希望
isequal(a, b)
返回true。但当涉及到数组时,情况并非如此。解决方法是在比较之前对条目进行排序,然而,在我的情况下,元素是复杂对象,它们不能轻易地映射为彼此具有明确的数字关系。另一种方法是不使用isequal
,而是使用自定义比较函数,该函数断言匹配长度,然后仅检查第一个数组中的每个元素是否包含在第二个数组中。但是,在我的情况下,通过isequal
比较的数组是嵌套在我正在尝试比较的结构体中的,编写封装结构体的自定义比较函数将非常复杂。除了这个排序问题之外,内置的isequal
函数涵盖了我所有的需求,因为它正确处理任意嵌套的结构体和任意字段,所以我真的想避免为此编写一个复杂的自定义函数。
MATLAB中是否有允许上述行为的数据类型?还是有一种简单的方法来构建这样的自定义类型?在Java中,我可以编写一个包装器类,并为equals方法编写自定义实现,但是在MATLAB中似乎没有这样的机制?
isequal
除了顺序外符合您的需求,您不能做类似这样的事情吗?:a = {[20 20 30], 'abc', {[1 2]; [3:4]}}; b = a; [aa, bb] = ndgrid(a, a); m = arrayfun(@isequal, aa, bb), result = all(any(m,1))&all(any(m,2))
它遵循了您测试一个数组中的每个元素与另一个数组中的每个元素(通过调用isequal
)的想法,这可能是时间效率低下的。当然,您可以将ndgrid
替换为两个for
循环以增加内存效率,并且如果另一个数组中缺少元素,则可以提前退出以增加时间效率。 - Luis Mendoisequal
除了顺序外都有效,那么我使用isequal
的方法也应该有效,包括嵌套等,对吧?我在想像下面这样的东西。无论如何,如果尺寸的乘积太大,以至于尝试所有元素对是不切实际的。 - Luis Mendoisempty(setdiff(a,b))
不起作用吗? - beakersetdiff
、ismember
、intersect
、union
等)进行集合操作。但我不知道这些函数是否适用于非可排序值,甚至是否适用于非数值矩阵。 - Cris Luengo