【问题标题】:Matlab function for check matrix equality, without order用于检查矩阵相等的Matlab函数,无序
【发布时间】:2013-03-15 21:48:24
【问题描述】:

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

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

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

【问题讨论】:

  • 出现多次的元素呢? [1, 2, 3] 是否等于 [1, 2, 3, 3]?也就是说,您的矩阵集还是多集?

标签: matlab matrix


【解决方案1】:

向量的一种简单方法是

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

对于矩阵使用

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

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

【讨论】:

    【解决方案2】:

    集合与多集合

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

    [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
    

    set 方法较慢,因为它们需要删除重复项。有趣的是,setxor 比使用 sort + unique 慢。

    【讨论】:

    • 有趣的地方。奇怪的是sort+uniquesetxor 更快...让我想知道setxor 是否有更好的实现...
    【解决方案3】:

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

    isempty(setxor(set1,set2))
    

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

    【讨论】:

      【解决方案4】:

      试试

      setdiff(A,B)
      

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

      【讨论】:

      • 当心 setdiff 返回 A 中不在 B 中的元素。这不是 OP 正在寻找的,因为检查结果的空性并不能保证身份......跨度>
      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多