2016-05-03 2 views
1

В Октава, у меня есть массив ячеек: y = { 'hello' 'world' 'a' 'world' 'g' 'I' 'w' 'hi'};Октава - удаление вхождений элемента в массиве ячеек

Мне нужно, чтобы иметь возможность удалить дубликаты элемента. Так, например, я хочу, чтобы удалить дубликаты из 'world', это должно быть на выходе:

ans = 
{ 
    [1,1] = hello 
    [1,2] = a 
    [1,3] = g 
    [1,4] = I 
    [1,5] = w 
    [1,6] = hi 
} 

Помимо обычного цикла до п раза, есть функция в октаве, что делает это?

Я искал способы сделать это, но ничего не нашел. Из того, что я видел, unique не делает этого, поскольку он удаляет все дубликаты.

+0

Вы удалили * все * вхождения 'world' - это то, что вы хотели? – Suever

+0

@ CH123: Является ли порядок результата важным? И вы хотите удалить несколько дубликатов? Например, 'y = {" foo "," hello "," bar "," baz "," hello "," world "," foo "}' следует удалить привет и foo? – Andy

+0

@Suever, да, я хочу удалить все экземпляры 'world'. @ Andy, порядок не важен (так что это нормально, если он возвращает массив с восходящим порядком, как 'unique'). И множественные дубликаты также прекрасны, но совсем не нужны. – CH123

ответ

1

Если вы хотите удалить все вхождения строки из массива ячеек, как показано в вашем примере, вы можете просто использовать strcmp.

x = y(~strcmp(y, 'world')); 

%// { 
%//  [1,1] = hello 
%//  [1,2] = a 
%//  [1,3] = g 
%//  [1,4] = I 
%//  [1,5] = w 
%//  [1,6] = hi 
%// } 

И это легко может быть адаптирована, если вы хотите, чтобы удалить несколько пар дубликатов сразу можно использовать ismember.

y = {'a', 'a', 'b', 'b', 'c', 'c'}; 
x = y(~ismember(y, {'a', 'b'}); 

Если вы хотите удалить все, кроме первого вхождения строки, вы можете сделать что-то вроде следующего.

toremove = find(strcmp(y, 'world')); 
x = y; 
x(toremove(2:end)) = []; 

%// x = 
%// { 
%//  [1,1] = hello 
%//  [1,2] = world 
%//  [1,3] = a 
%//  [1,4] = g 
%//  [1,5] = I 
%//  [1,6] = w 
%//  [1,7] = hi 
%// } 
+0

Ох. Я не знал, что 'strcmp' может это сделать. Это то, что мне нужно. Спасибо! – CH123

+0

Вопрос только в том, что '' 'для' x = y (~ strcmp (y, 'world')); '? – CH123

+1

@ CH123 Поскольку вы хотите сохранить все значения, которые * не являются * этой строкой. '~' Отменяет логический массив, возвращаемый 'strcmp'. – Suever

1

Если вы хотите, чтобы автоматически удалять элементы с более чем происходит один раз использовать это:

y = { 'hello' 'world' 'a' 'world' 'g' 'I' 'w' 'hi'}; 
[Y, ~, J] = unique (y); 
cnt = accumarray (J(:), 1); 
Y(cnt == 1) 

ans = 
{ 
    [1,1] = I 
    [1,2] = a 
    [1,3] = g 
    [1,4] = hello 
    [1,5] = hi 
    [1,6] = w 
} 

CNT считает вхождение каждой строки так, Y (CNT == 1) включает в себя только строки, которые точно больше появляться один раз.

Смежные вопросы