Как удалить дубликаты в массиве, но сохранить один и тот же порядок?
У меня есть этот массив ячеек в 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)