Как найти уникальные строки в матрице без порядка элементов в каждой строке? - PullRequest
2 голосов
/ 15 июля 2010

У меня есть массив, состоящий из n строк и 4 столбцов. Каждая из четырех записей в строке является целым числом, то есть

X = [
       111 112 432   2
         6   9 115 111
       112 432 111   2

    ]; 

Каждая строка представляет вершины тетраэдра. Эти вершины не имеют направленности, поэтому в вышеописанном случае тетраэдры, представленные X (1, ​​:) и X (3, :), эквивалентны.

Я хочу удалить дубликаты тетраэдров из X, но не могу понять, как включить независимость порядка в мой код.

Я попробовал функцию UNIQUE (), но она возвращает (nx1) массив уникальных целых чисел, т.е.

Y = UNIQUE(X);

Y = [
     2
     6
     9
     111
     112
     115
     432
    ]

У кого-нибудь есть предложения относительно достаточно эффективного способа выполнения этой задачи?

Спасибо, S: -)

Ответы [ 4 ]

9 голосов
/ 15 июля 2010

Сначала отсортируйте строки вашей матрицы, чтобы получить «каноническое» представление для тетраэдров:

X = sort(X, 2);

Затем используйте unique с необязательным аргументом 'rows', чтобы найти уникальные строки:

Y = unique(X, 'rows');
5 голосов
/ 15 июля 2010

unique () будет работать со строками, но строки 1 и 3 имеют другой порядок.Таким образом, мы могли бы отсортировать их до использования уникального.

Y=unique(sort(X,2),'rows')

Y =

     2   111   112   432
     6     9   111   115

Если вы хотите сохранить исходный порядок, то уникальный будет возвращать индексы

[Y,yi]=unique(sort(X,2),'rows');

>> X(yi,:)

ans =

   112   432   111     2
     6     9   115   111
3 голосов
/ 15 июля 2010

Цитировать из документации:

b = уникально (A, «строки») возвращает уникальные ряды А.

Это то, что вы хотите?

1 голос
/ 15 июля 2010

сначала нужно отсортировать строки, а затем использовать уникальные (A, 'строки'), как подсказывает HPM

...