Как я могу определить, имеет ли прямоугольная матрица повторяющиеся строки в MATLAB? - PullRequest
13 голосов
/ 24 марта 2010

У меня есть прямоугольная матрица размером n × m (n! = M).Как лучше всего узнать, есть ли в MATLAB дублирующиеся строки?Как лучше всего найти индексы дубликатов?

Ответы [ 4 ]

17 голосов
/ 24 марта 2010

Используйте 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,:)
4 голосов
/ 24 марта 2010

Вы можете использовать функции UNIQUE и SETDIFF , чтобы выполнить это:

>> 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
0 голосов
/ 24 марта 2010

Скажите, что ваша матрица M:

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

out будет содержать повторяющиеся индексы строк, если таковые имеются.

0 голосов
/ 24 марта 2010

Пробежаться по строкам матрицы и для каждой пары проверить, если

row1 == row2

...