我想知道是否有一个 matlab 函数可以检查两个矩阵是否具有相同的元素,这些元素不一定是有序的。
示例:A = [1,2,3] 和 B = [3,2,1]
函数 isequal(A,B) 返回 0,但我想要的是返回 1 的函数或代码。我知道我可以遍历矩阵,但我想知道是否有更快的方法来做到这一点。谢谢,
一种简单的向量方法可能是
isequal(sort(A), sort(B))
对于矩阵使用
isequal(sort(A(:)), sort(B(:)))
但是,对于大型矩阵,排序可能会很慢。
这取决于您是否要将相同数量的多次出现视为单个项目(多集方法)或不(集合方法):
是否相同(集合方法)或不同(多集合方法)[1, 2, 3]
?[1, 2, 3, 3]
正如 reverse_engineer 所建议的:
f_xor = @(x, y) isempty(setxor(x, y))
H. Muster 方法的一组变体:
f_sortu = @(x, y) isequal(sort(unique(x(:))), sort(unique(y(:))))
正如 H.Muster 所建议的:
f_sort = @(x, y) isequal(sort(x(:)), sort(y(:)))
这里是各个变体的时间。
>> A = rand(1, 1000);
>> B = A; B(end) = B(end) - 1; % Make vectors almost equal
>> N = 10000;
>> tic; for i = 1 : N; f_sort(A, B); end; toc/N
ans =
1.6892e-04
>> tic; for i = 1 : N; f_sortu(A, B); end; toc/N
ans =
3.5647e-04
>> tic; for i = 1 : N; f_xor(A, B); end; toc/N
ans =
5.4098e-04
设置方法较慢,因为它们需要删除重复项。有趣的是,setxor
它比使用sort
+慢unique
。
最有效的方法是检查 的空虚setxor
:
isempty(setxor(set1,set2))
不确定这是否比sort
选项更快......
尝试
setdiff(A,B)
这几乎与您所寻求的相反。