用于检查矩阵相等的Matlab函数,无需订单

时间:2013-03-15 11:00:25

标签: matlab matrix

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

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

函数isequal(A,B)返回0,但我想要的是一个函数或代码将返回1.我知道我可以遍历矩阵,但我想知道是否有更快的方法来执行它。谢谢,

4 个答案:

答案 0 :(得分:2)

矢量的简单方法可能是

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

对于矩阵使用

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

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

答案 1 :(得分:1)

设置与Multiset

这取决于您是否要处理与单个项目相同数量的多次出现(多集方法)或不处理(设置方法):

[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(:))))

Multiset方法

根据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慢。

答案 2 :(得分:0)

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

isempty(setxor(set1,set2))

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

答案 3 :(得分:-1)

尝试

setdiff(A,B)

这几乎与你寻求的相反。