2010-06-17 61 views
24

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

我想通過給答案Amro是現在實現這一目標的最佳方式。 '獨特(y,'stable')' – 2013-07-23 08:39:43

回答

27

下面是一個使用一些額外的輸入和輸出參數是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

現在爲什麼我不這樣想? +1 – Doresoom 2010-06-17 20:46:11

+0

+1:我在我的路徑中已經有了一個名爲'uniq.m'的函數,可以完全做到這一點,我一直都在使用它:) – Amro 2010-06-17 22:08:46

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 

最後重新索引A

b=b(index) 
+0

+1:看起來我們在同一時間修改了我們的答案。 – gnovice 2010-06-17 20:48:00

21

在MATLAB R2012a,新order flag加入:

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