检查两个数组的内容是否相等,忽略顺序

조회수:18(최근30일)
我想检查两个数组的内容是否相等,忽略元素的顺序。
由于某种原因,我找不到一个现成的答案。这个问题有两个部分,取决于数组是否是集合。
1.检验两个集合的相等性
假设没有重复的,我可以用集合运算但Matlab好像没有集合,只有集合运算,我找不到 setisequal 函数。此外,有很多可能的方法,我不确定哪一个是最好的:
A = [1 3];B = [3 1];
assert(isequal(intersect(A, B), union(A, B)))
断言(isempty(setdiff(A,B)) & isempty(setdiff(B,A))))
断言(all(ismember(B, A)) & all(ismember(A, B)))
断言(isequal(独特的(A),独特的(B)))
然而, 如果两个数组中的任意一个中有不同数量的重复项,则上述集合操作将忽略它们
2.检查非集的相等性
在这种情况下,这是我能想到的最好的方法,但它涉及两个非常低效的排序操作:
断言(isequal(排序(A),排序(B)))
毫无疑问,我在这里遗漏了一些非常简单的东西……

채택된답변

沃尔特·罗伯森
沃尔特·罗伯森 2021년10월17일
%设置情况
A = [1 3];B = [3 1];
isequal(独特的(A),独特的(B))
ans =逻辑
1
对于集合的情况,不同的方法可能会更快:
numel(A) == numel(B) && all(ismember(A, B))
ans =逻辑
1
% nonset案例:
A = [1 3];B = [3 1 3];
isequal(独特的(A),独特的(B))
ans =逻辑
1
댓글수:7
比尔Tubbs
比尔Tubbs 2021년10월18일
关于容忍你说得很对。因此,目前唯一可行的解决方案是:
assert(all(abs(sort(A) - sort(B)) < 1e-6))
我对这个胸腔镜很满意。

댓글을달려면로그,하십시오。

추가답변(2개)

比尔Tubbs
比尔Tubbs 2021년10월17일
我认为这可能是情况1的答案(A和B是集合):
A = [1 3];B = [3 1];
断言(isempty (setxor (A, B)))
A = [1 3];B = [3 1 2];
断言(~ isempty (setxor (A, B)))
注:A或B未设置时无效:
A = [1 3];B = [3 1 3];
断言(~ isempty (setxor (A, B)))
断言失败。

1月
1月 2021년10월17일
Unique、setdiff、union和ismember也在内部调用sort函数。所以
% assert(isequal(sort(A), sort(B)))
是一个非常有效的解决方案。
A = randperm(1e6, 1e6);
B = randperm(1e6, 1e6);
抽搐
K = 1:10
isequal(排序(A)、(B));
结束
toc
运行时间为1.138481秒。
抽搐
K = 1:10
(ismembc(一种,(B)));ISMEMBER的内部助手
结束
toc
运行时间为1.453001秒。
如果存在重复元素:
A = randi([0,1e3], 1,1e6);
B = randi([0,1e3], 1,1e6);
抽搐
K = 1:10
isequal(独特的(A),独特的(B));
结束
toc
运行时间为0.676562秒。
抽搐
K = 1:10
numel(A) == numel(B) && all(ismember(A, B));
结束
toc
运行时间为0.980030秒。
抽搐
K = 1:10
As = sort(A);
Au = As([true, diff(As) ~= 0]);%删除重复的元素
B =排序(B);
Bu = Bs([true, diff(Bs) ~= 0]);%删除重复的元素
isequal (Au, Bu);
结束
toc
运行时间为0.781304秒。
在R2018b中,最后一种方法比 isequal(独特的(A),独特的(B)) .在本地尝试一下。
댓글수:1
比尔Tubbs
比尔Tubbs 2021년10월18일
편집:比尔Tubbs 2021년10월18일
谢谢你的时间安排。只有 断言(isequal(排序(A),排序(B))) 在无序列表(不是集合)的情况下产生所需的结果,所以我猜没有其他选项。
另外,请注意你提出的这些解决方案并不能产生正万博 尤文图斯确的结果:
断言(~all(ismembc([1 2], sort([1 2 3])))) .
断言失败。
A = [1 2 2];B = [1 2 3];
断言(~(元素个数(A) = =元素个数(B) & & (ismember (A, B))))
断言失败。

댓글을달려면로그,하십시오。

범주

找到更多资料循环和条件语句帮助中心而且文件交换

제품


릴리스

R2020a

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!

翻译的