Найти дубликаты парных сравнений в MATLAB - PullRequest
0 голосов
/ 21 мая 2018

У меня действительно большой набор данных, который выглядит следующим образом:

x1 x2
2  5
4  10
5  2
....

Однако я хочу найти все строки, которые имеют одинаковые значения (дубликаты), независимо от порядка.В приведенном выше примере я хотел бы найти строки 1 и 3, поскольку они оба имеют значения 2 и 5.

Поскольку у меня есть приблизительно 14000 сравнений, как я могу сделать это эффективным способом с помощью MATLAB?

1 Ответ

0 голосов
/ 21 мая 2018

Сначала сортируйте по столбцам.Это означает, что каждая строка сначала будет иметь самое низкое значение, и вы сравниваете строки независимо от исходного порядка.

arr = [2 5; 4 10; 5 2; 6 7; 6 7; 6 7];
arrSorted = sort( arr, 2 );

Затем используйте unique, чтобы получить все уникальные строки с соответствующими им индексами.

[uRows, ~, iRows] = unique( arrSorted, 'rows' );

Вывод:

>> uRows = [2  5 
            4 10
            6  7]
>> iRows = [1
            2
            1
            3 
            3
            3]

Массив iRows - это индекс в uRows каждой строки в arr, поэтому, например, 3-я строка [6 7] появляется в последней3 строки arr (в некотором порядке).

Существует множество форматов, в которых вы можете захотеть получить результат. Если вам нужно больше, чем просто массивы выше, вы можете рассмотреть массивы ячеек.Простой цикл был бы ясным способом создать это:

c = cell(size(uRows,1), 2);
for ii = 1:size(uRows,1)
    c{ii,1} = uRows(ii,:);         % This row
    c{ii,2} = find( iRows == ii ); % Indices of this row value within 'arr'
end
...