Как найти уникальные строки в матрице без порядка элементов в каждой строке?

arrays matlab unique

4115 просмотра

4 ответа

2608 Репутация автора

У меня есть массив, состоящий из 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 :-)

Автор: Darren J. Fitzpatrick Источник Размещён: 15.07.2010 10:45

Ответы (4)


3 плюса

70694 Репутация автора

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

b = unique (A, 'lines') возвращает уникальные строки A.

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

Автор: High Performance Mark Размещён: 15.07.2010 10:54

9 плюса

19976 Репутация автора

Решение

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

X = sort(X, 2);

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

Y = unique(X, 'rows');
Автор: Martin B Размещён: 15.07.2010 10:56

1 плюс

5987 Репутация автора

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

Автор: Sanjay Manohar Размещён: 15.07.2010 10:57

5 плюса

3011 Репутация автора

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

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

Y =

     2   111   112   432
     6     9   111   115

Если вы хотите сохранить первоначальный порядок, то unique вернет индексы

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

>> X(yi,:)

ans =

   112   432   111     2
     6     9   115   111
Автор: Adrian Размещён: 15.07.2010 11:04
Вопросы из категории :
32x32