Разница двухэлементных массивов строк в Matlab - PullRequest
4 голосов
/ 16 января 2012

У меня есть массив ячеек типа

a={'potential'; 'impact'; 'of'; 'stranded'; 'assets'; 'and'; 'other'; 'necessary'; 'regulatory'; 'approvals'; 'assets'}

и я хочу вычесть из него массив вроде b = {'a';'а также';«О»;«Мой»;'#'}.

Использование setdiff (a, b) сортирует мой массив после вычисления разницы.Я хочу исключить из всех элементов, присутствующих в b, без сортировки.Также повторения должны быть сохранены, например, для.'assets' в массиве a должны появляться в двух местах в конечном массиве.

Следующий код, который я использую, выполняет работу:

for i = 1:length(b)
    tf = ~strcmp(b(i),a)
    a = a(tf,:)
end

Но проблема в том, что массив b содержит больше200 строковых элементов, которые значительно замедляют мой код.Есть ли лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 16 января 2012
tf = ismember(a,b);
a = a(~tf)
0 голосов
/ 16 января 2012
EDU>> a

a =     
    'potential'
    'impact'
    'of'
    'stranded'
    'assets'
    'and'
    'other'
    'necessary'
    'regulatory'
    'approvals'
    'assets'

EDU>> b

b = 

    'a'
    'and'
    'of'
    'my'
    '#'

 [I,J]=setdiff(a,b);

Теперь сделайте

EDU>> a(sort(J),:)

ans = 

    'potential'
    'impact'
    'stranded'
    'other'
    'necessary'
    'regulatory'
    'approvals'
    'assets'
...