如何删除数组中的重复项但保持相同的顺序?

Ben*_*sen 25 arrays matlab list duplicates

我在MATLAB中有这个单元格数组:

y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}
Run Code Online (Sandbox Code Playgroud)

unique(y)用来摆脱重复,但它按字母顺序重新排列字符串:

>> unique(y)

ans =

'a'    'd'    'f'    'g'    'h'    'w'
Run Code Online (Sandbox Code Playgroud)

我想删除重复项但保持相同的顺序.我知道我可以编写一个函数来做这个但是想知道是否有更简单的方法unique用于删除重复项,同时保持相同的顺序只删除重复项.

我希望它返回这个:

>> unique(y)

ans = 

'd'    'f'    'a'    'g'    'w'    'h'
Run Code Online (Sandbox Code Playgroud)

gno*_*ice 28

这是一个使用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'
Run Code Online (Sandbox Code Playgroud)

  • 现在为什么我没想到这样做呢?+1 (2认同)

Amr*_*mro 21

在MATLAB R2012a中,添加了一个新的订单标志:

>> y = {'d' 'f' 'a' 'g' 'g' 'a' 'w' 'h'};
>> unique(y, 'stable')
ans = 
    'd'    'f'    'a'    'g'    'w'    'h'
Run Code Online (Sandbox Code Playgroud)


Dor*_*oom 6

如果查看文档unique,可以选择返回索引以及排序数组.您可以指定是否要将数字的第一个或最后一个出现返回到索引.

例如:

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

[b,order]=unique(a,'first')
Run Code Online (Sandbox Code Playgroud)

回报

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
Run Code Online (Sandbox Code Playgroud)

最后重新索引b

b=b(index)
Run Code Online (Sandbox Code Playgroud)