2013-04-22 4 views
4

У меня есть два массива:Как удалить элементы одного массива из другого?

A=[1 1 2 2 3 3 3]; 
B=[1 3]; 

Есть ли функция, которая может удалять элементы, которые содержатся в B от A?

Результат должен быть

C=[1 2 2 3 3]; 

Порядок не важно, но если есть более конкретные элементы, как два раза 1 в A, то мне нужна операция, которая удаляет (от A) только как многие из них конкретные элементы находятся в B (в этом случае только один из 1 и один из 3, что означает, что другие 1 и 3 должны оставаться в конечном продукте C). Эта функция должна быть аналогична setdiff, с той разницей, что она должна заботиться о нескольких экземплярах элементов массива. Эта аналогия может сохраняться, потому что мой B содержит только элементы, которые находятся в A.

ответ

4

Для решения петли:

C = A;  
for ii = 1:length(B)  
    C(find(C == B(ii), 1,'first')) = []; 
end 

Результата

C = 

    1  2  2  3  3 
+0

Спасибо. Я должен помнить об этом. Но что 'A' внутри find должно быть' C', или вы удалите неправильные элементы. Попробуйте с помощью 'A = [1 1 2 2 3 4 4];' например, если в поиске есть 'A', вы в конечном итоге удаляете' 4' вместо '3' – Dan

1

Вот Векторизованное решение с использованием accumarray и repelem:

maxValue = max([A B]); 
counts = accumarray(A(:), 1, [maxValue 1])-accumarray(B(:), 1, [maxValue 1]); 
C = repelem(1:maxValue, max(counts, 0)); 

И результат для выборки данных A = [1 1 2 2 3 3 3]; B = [1 3];:

C = 

    1  2  2  3  3 

Это будет работать даже в тех случаях, когда имеются значения в B не в A (как B = [1 4];) или больше заданного значения в B, чем в A (как B = [1 1 1];).

Примечание: Вышеуказанные работы начиная с A и B содержат целые числа. Если они должны содержать значения с плавающей запятой, вы можете сначала сопоставить уникальные значения с целыми числами, используя unique и ismember. Скажем, мы имели следующий образец данных:

A = [0 0 pi pi 2*pi 2*pi 2*pi]; 
B = [0 2*pi]; 

Вот вариант приведенного выше кода, который может справиться с этим:

uniqueValues = unique([A B]); 
[~, A] = ismember(A, uniqueValues); 
[~, B] = ismember(B, uniqueValues); 
maxValue = max([A B]); 
counts = accumarray(A(:), 1, [maxValue 1])-accumarray(B(:), 1, [maxValue 1]); 
C = uniqueValues(repelem(1:maxValue, max(counts, 0))); 

И результаты:

C = 

     0 3.1416 3.1416 6.2832 6.2832 % [0 pi pi 2*pi 2*pi] 
Смежные вопросы