Как я могу удалить дубликаты в массиве, но сохранить тот же порядок? - PullRequest
25 голосов
/ 18 июня 2010

У меня есть этот массив ячеек в MATLAB:

y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}

Я использую unique(y), чтобы избавиться от дубликатов, но это переставляет строки в алфавитном порядке:

>> unique(y)

ans =

'a'    'd'    'f'    'g'    'h'    'w'

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

Я хочу вернуть это:

>> unique(y)

ans = 

'd'    'f'    'a'    'g'    'w'    'h'

Ответы [ 3 ]

28 голосов
/ 18 июня 2010

Вот одно решение, которое использует некоторые дополнительные входные и выходные аргументы, которые UNIQUE имеет:

>> y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'};  %# Sample data
>> [~,index] = unique(y,'first');        %# Capture the index, ignore the actual values
>> y(sort(index))                           %# Index y with the sorted index

ans = 

    'd'    'f'    'a'    'g'    'w'    'h'
21 голосов
/ 16 июня 2012

В MATLAB R2012a добавлен новый флаг заказа :

>> y = {'d' 'f' 'a' 'g' 'g' 'a' 'w' 'h'};
>> unique(y, 'stable')
ans = 
    'd'    'f'    'a'    'g'    'w'    'h'
6 голосов
/ 18 июня 2010

Если вы посмотрите документацию для unique, есть возможность вернуть индекс вместе с отсортированным массивом. Вы можете указать, хотите ли вы, чтобы первое или последнее вхождение числа также возвращалось в индекс.

Например:

a=[5, 3, 4, 2, 1, 5, 4];

[b,order]=unique(a,'first')

возвращает

b=[1, 2, 3, 4, 5] и m=[5, 4, 2, 3, 1]

Вы можете отсортировать массив заказов и сохранить следующий индекс

[~,index]=sort(order) %# use a throw-away variable instead of ~ for older versions

и, наконец, переиндексировать b

b=b(index)
...