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

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

person Ben Fossen    schedule 17.06.2010    source источник
comment
Я полагаю, что ответ, данный Амро, - лучший способ добиться этого сейчас. unique(y, 'stable')   -  person Dennis Jaheruddin    schedule 23.07.2013


Ответы (3)



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

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

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