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

时间:2010-06-17 20:27:59

标签: list matlab arrays duplicates

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

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:21)

在MATLAB R2012a中,添加了一个新的order flag

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

答案 2 :(得分:6)

如果查看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)