2

我想知道是否有一个 matlab 函数可以检查两个矩阵是否具有相同的元素,这些元素不一定是有序的。

示例:A = [1,2,3] 和 B = [3,2,1]

函数 isequal(A,B) 返回 0,但我想要的是返回 1 的函数或代码。我知道我可以遍历矩阵,但我想知道是否有更快的方法来做到这一点。谢谢,

4

4 回答 4

2

一种简单的向量方法可能是

isequal(sort(A), sort(B))

对于矩阵使用

isequal(sort(A(:)), sort(B(:)))

但是,对于大型矩阵,排序可能会很慢。

于 2013-03-15T11:05:47.830 回答
1

集与多集

这取决于您是否要将相同数量的多次出现视为单个项目(多集方法)或不(集合方法):

是否相同(集合方法)或不同(多集合方法)[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

于 2013-03-15T13:48:24.613 回答
0

最有效的方法是检查 的空虚setxor

isempty(setxor(set1,set2))

不确定这是否比sort选项更快......

于 2013-03-15T13:27:04.127 回答
-1

尝试

setdiff(A,B)

这几乎与您所寻求的相反。

于 2013-03-15T11:14:01.500 回答