Как удалить дубликаты в массиве, но сохранить один и тот же порядок?

У меня есть этот массив ячеек в 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'

Ответ 1

Здесь одно решение, которое использует некоторые дополнительные входные и выходные аргументы, которые 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'

Ответ 2

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

>> y = {'d' 'f' 'a' 'g' 'g' 'a' 'w' 'h'};
>> unique(y, 'stable')
ans = 
    'd'    'f'    'a'    'g'    'w'    'h'

Ответ 3

Если вы посмотрите на документацию для 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)