2011-03-16 51 views
3

我想要做類似於以下的操作,除了我只想刪除'g'和'g',因爲它們是每個之後發生的重複項其他。我也想保持序列相同。刪除重複項 - **僅當重複項按順序發生時

任何幫助將不勝感激!

我在MATLAB這個單元陣列:

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


ans = 

'd' 'f' 'a' 'w' 'a' 'h' 
+1

歡迎StackOverflow上。如果沒有「matlab」標籤,標籤「vector」,「duplicates」和「sequence」是毫無價值的。你不是在尋找一名專家。你正在尋找一個matlab專家。 – 2011-03-16 23:39:41

回答

3

有我的第一個答案多重複(感謝grantnz)一起使用時(下圖)的錯誤。這裏有一個更新的版本:

 
>> y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h' 'h' 'i' 'i' 'j'}; 
>> i = find(diff(char(y)) == 0); 
>> y([i; i+1]) = [] 

y = 

    'd' 'f' 'a' 'w' 'a' 'j' 

OLD ANSWER

如果你的 「細胞載體」 總是隻包含單個字符元素,你可以做到以下幾點:

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

y = 

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

>> y(find(diff(char(y)) == 0) + [0 1]) = [] 

y = 

    'd' 'f' 'a' 'w' 'a' 'h' 
+0

您是否嘗試過使用多個重複的解決方案?我想你會得到一個'矩陣尺寸必須同意'的錯誤。 – grantnz 2011-03-17 00:23:36

+0

@grantnz - 啊,對。我更新瞭解決此問題的答案。 – 2011-03-17 06:47:42

+0

謝謝!他們似乎都工作得很好。修改這段代碼是否容易修改一式三份?是否有可能使用i,i + 1和i + 2之類的差異? >> y = {'d''f''a''g''g''g''w''a''h''h''i''i''j'}; >> i = find(diff(char(y))== 0); >> y([i; i + 1])= [] – jess 2011-03-17 17:50:38

1

看它是這樣的:當且僅當(1)它是第一個元素或(2)它的前任不同於它時,你想保留一個元素(3)它是最後一個元素或(4)它的後繼者與它不同。所以:

y([true ~strcmp(y(1:(end-1)),y(2:end))] & [~strcmp(y(1:(end-1)),y(2:end)) true]) 

,或者更好,

different = ~strcmp(y(1:(end-1)),y(2:end)); 
result = y([true different] & [different true]); 
+0

該解決方案不太適合問題的要求。在連續重複的情況下,應刪除_Both_元素。 – 2011-03-17 00:03:05

+0

哎呀,你是對的:我誤解了這個問題。現在修正了(所以我擔心你的評論對於沒有閱讀過這篇文章並意識到我編輯了我的答案的人是沒有意義的;對不起)。 – 2011-03-17 00:14:24

+0

@未來所有人:Gareth是對的...不理我的評論! – 2011-03-17 06:29:55

0

這應該工作:

y([ diff([y{:}]) ~= 0 true]) 

或稍多緊湊

y(diff([y{:}]) == 0) = [] 

更正:上面不會刪除這兩個副本

ind = diff([y{:}]) == 0; 
y([ind 0] | [0 ind]) = [] 

順便說一句,這個工程即使有多個重複序列

例如,

y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h' 'h'}; 
ind = diff([y{:}]) == 0; 

y([ind 0] | [0 ind]) = [] 

y = 

    'd' 'f' 'a' 'w' 'a' 
+0

此解決方案不會根據需要刪除兩個副本。 – 2011-03-17 00:04:07

+0

@ b3:好點。我錯過了這個要求。 – grantnz 2011-03-17 00:18:37