gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:46:28 29 4
gpt4 key购买 nike

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

a = [x y z];

b = [x z y];

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

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

最佳答案

我找到了一种优雅地解决我的问题的方法。与我之前陈述的信念相反,MATLAB 实际上确实允许对 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

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

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

关于matlab - MATLAB 是否有类似集合的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71176989/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com