Удалить строки в массиве ячеек в MATLAB

fullSeq='ABCDEFG'
Inputcell= {'ABC', 'BDEG','DEFG','ABCDEFG','CDEG','BCDF','ABCDEFG'}

У меня есть 2 строки 'ABCDEFG' в приведенном выше Inputcell. Как я могу удалить эти 2 строки? Ожидаемый результат должен быть:

Outputcell= {'ABC', 'BDEG','DEFG','CDEG','BCDF'}

person kgk    schedule 14.10.2015    source источник


Ответы (3)


Вы можете использовать логическое индексирование вместе с strcmp:

OutputCell = Inputcell(~strcmp(Inputcell,fullSeq))

OutputCell = 

    'ABC'    'BDEG'    'DEFG'    'CDEG'    'BCDF'

ура!

person Benoit_11    schedule 14.10.2015
comment
Наверное намного проще. ismember, вероятно, является излишним для этого конкретного приложения. +1. - person rayryeng; 14.10.2015

Простой вызов ismember сделает свое дело в сочетании с логическим индексированием:

fullSeq='ABCDEFG';
Inputcell= {'ABC', 'BDEG','DEFG','ABCDEFG','CDEG','BCDF','ABCDEFG'};
Outputcell = Inputcell(~ismember(Inputcell, fullSeq));

Мы получаем:

>> Outputcell
Outputcell = 
    'ABC'    'BDEG'    'DEFG'    'CDEG'    'BCDF'
person rayryeng    schedule 14.10.2015
comment
отлично сработано! Интересно, что быстрее между strcmp и ismember :) - person Benoit_11; 14.10.2015

Если по какой-то причине вы хотите автоматически удалить каждый элемент, который появляется как минимум дважды (вместо того, чтобы запускать приведенные выше ответы с различными значениями fullSeq), вы также можете сделать это:

iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}(); %define inline 'if'
Inputcell={'ABC', 'BDEG','DEFG','ABCDEFG','CDEG','BCDF','ABCDEFG'};
Tempcell=cellfun(@(x)iif(sum(strcmp(x,Inputcell))>1,[],true,x),Inputcell,...
                 'uniformoutput',false);
Outputcell=Tempcell(~cellfun('isempty',Tempcell))

Результат:

Outputcell = 

    'ABC'    'BDEG'    'DEFG'    'CDEG'    'BCDF'
person Andras Deak    schedule 14.10.2015