删除重复项 - **仅当重复项按顺序发生时

时间:2011-03-16 23:35:24

标签: matlab vector duplicates sequence

我想做类似以下的事情,除了我只想删除'g'和'g',因为它们是一个接一个发生的重复。我也想保持序列相同。

任何帮助将不胜感激!!!

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

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


ans =

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

3 个答案:

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

答案 1 :(得分: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]);

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