【问题标题】:How can I tell if a rectangular matrix has duplicate rows in MATLAB?如何判断矩形矩阵在 MATLAB 中是否有重复行?
【发布时间】:2010-03-24 17:37:29
【问题描述】:

我有一个 n×m 矩形矩阵 (n != m)。在 MATLAB 中找出是否有任何重复行的最佳方法是什么?查找重复项索引的最佳方法是什么?

【问题讨论】:

    标签: matlab matrix duplicates


    【解决方案1】:

    使用 unique() 查找不同的行值。如果最终行数减少,则存在重复项。它还将为您提供每个不同值的一个位置的索引。所有其他行索引都是您的重复项。

    x = [
        1 1
        2 2
        3 3
        4 4
        2 2
        3 3
        3 3
        ];
    [u,I,J] = unique(x, 'rows', 'first')
    hasDuplicates = size(u,1) < size(x,1)
    ixDupRows = setdiff(1:size(x,1), I)
    dupRowValues = x(ixDupRows,:)
    

    【讨论】:

    • 有谁知道 Matlab 用来计算这个的算法吗?
    【解决方案2】:

    您可以使用函数UNIQUESETDIFF 来完成此操作:

    >> mat = [1 2 3; 4 5 6; 7 8 9; 7 8 9; 1 2 3];    %# Sample matrix
    >> [newmat,index] = unique(mat,'rows','first');  %# Finds indices of unique rows
    >> repeatedIndex = setdiff(1:size(mat,1),index)  %# Finds indices of repeats
    
    repeatedIndex =
    
         4     5
    

    【讨论】:

    • 不应该repeatedIndex[3,4]
    • @AB:不,mat 的第四行和第五行是之前行的重复。
    【解决方案3】:

    遍历矩阵的行,并为每一对测试是否

    row1 == row2

    【讨论】:

    • 这可行,但肯定比其他基本选项(即使用 'unique()')更慢且更冗长。
    【解决方案4】:

    假设你的矩阵是 M:

    [S,idx1] = sortrows(M);
    idx2 = find(all(diff(S,1) == 0,2));
    out = unique(idx1([idx2;idx2+1]));
    

    out 将包含重复的行索引(如果有)。

    【讨论】:

    • 这仅在您的重复行彼此相邻时才有效。
    • 好吧,从技术上讲,OP 从来没有明确地说重复的行是否彼此相邻。虽然不像使用 UNIQUE 那样通用,但此解决方案在相邻重复项的特定情况下运行速度明显更快,因此 +1。
    • 好吧,您的新答案正在做一些我认为 OP 不想要的事情。它返回不唯一的 all 行的索引。我认为 OP 只是想要重复的索引不计算找到的第一个。换句话说,如果第 2 行、第 4 行和第 5 行相同,则第 4 行和第 5 行被视为“重复”,第 2 行是“原始”(或者 2 和 4 可以算作重复,第 5 行是原始的...OP没有指定顺序)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多