检查两个数组的内容是否相等,忽略顺序
조회수: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)))
毫无疑问,我在这里遗漏了一些非常简单的东西……
댓글수:0
채택된답변
沃尔特·罗伯森
2021년10월17일
%设置情况
A = [1 3];B = [3 1];
isequal(独特的(A),独特的(B))
对于集合的情况,不同的方法可能会更快:
numel(A) == numel(B) && all(ismember(A, B))
% nonset案例:
A = [1 3];B = [3 1 3];
isequal(独特的(A),独特的(B))
추가답변(2개)
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
抽搐
为K = 1:10
(ismembc(一种,(B)));ISMEMBER的内部助手
结束
toc
如果存在重复元素:
A = randi([0,1e3], 1,1e6);
B = randi([0,1e3], 1,1e6);
抽搐
为K = 1:10
isequal(独特的(A),独特的(B));
结束
toc
抽搐
为K = 1:10
numel(A) == numel(B) && all(ismember(A, B));
结束
toc
抽搐
为K = 1:10
As = sort(A);
Au = As([true, diff(As) ~= 0]);%删除重复的元素
B =排序(B);
Bu = Bs([true, diff(Bs) ~= 0]);%删除重复的元素
isequal (Au, Bu);
结束
toc
在R2018b中,最后一种方法比
isequal(独特的(A),独特的(B))
.在本地尝试一下。