开发者

How can I remove duplicates in an array but keep the same order?

开发者 https://www.devze.com 2023-01-03 16:58 出处:网络
I have this cell array in MATLAB: y = { \'d\' \'f\' \'a\' \'g\' \'g\' \'a\' \'w\' \'h\'} I use unique(y) to get rid of the duplicates but it rearranges the strings in alphabetical order:开发者_如何

I have this cell array in MATLAB:

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

I use unique(y) to get rid of the duplicates but it rearranges the strings in alphabetical order:开发者_如何学Go

>> unique(y)

ans =

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

I want to remove the duplicates but keep the same order. I know I could write a function do do this but was wondering if there was a simpler way using unique to remove duplicates while keeping the same order just with the duplicates removed.

I want it to return this:

>> unique(y)

ans = 

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


Here's one solution that uses some additional input and output arguments that UNIQUE has:

>> 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'


In MATLAB R2012a, a new order flag was added:

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


If you look at the documentation for unique, there's the option to return an index along with the sorted array. You can specify whether you want the first or last occurrence of a number to be returned to the index as well.

For example:

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

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

returns

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

You can sort your order array and store the index next

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

and finally re-index b

b=b(index)
0

精彩评论

暂无评论...
验证码 换一张
取 消