2011-03-16 120 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