удаление дубликатов - ** только тогда, когда дубликаты встречаются последовательно - PullRequest
3 голосов
/ 17 марта 2011

Я хотел бы сделать что-то похожее на следующее, за исключением того, что я хотел бы удалить только «g» и «g», потому что они являются дубликатами, которые встречаются один за другим.Я также хотел бы сохранить последовательность такой же.

Любая помощь будет оценена !!!

У меня есть этот массив ячеек в MATLAB:

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


ans =

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

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Произошла ошибка в моем первом ответе (ниже) при использовании нескольких дубликатов (спасибо 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'

СТАРЫЙ ОТВЕТ

Если ваш «вектор ячейки» всегда содержит только односимвольные элементы, вы можете сделать следующее:

>> 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 голос
/ 17 марта 2011

Посмотрите на это так: вы хотите сохранить элемент тогда и только тогда, когда либо (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 голосов
/ 17 марта 2011

Это должно работать:

 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'
...