4

我有两个数组:

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

是否有任何功能可以删除Bfrom中包含的元素A

结果应该是

C=[1 2 2 3 3];

顺序并不重要,但如果有更具体的元素,比如两次1in A,那么我需要删除 (from A) 的操作,只要这些特定元素中的许多在B( 在这种情况下,只有一个1和一个3; 表示其他13应保留在最终产品中C)。这个函数应该类似于setdiff,不同之处在于它应该处理数组元素的多个实例。这个类比可以成立,因为 myB只包含A.

4

2 回答 2

4

For循环解决方案:

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

结果

C =

     1     2     2     3     3
于 2013-04-22T11:28:33.643 回答
1

accumarray这是使用and的矢量化解决方案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(like B = [1 4];) 中的值或给定值B大于 in A(like B = [1 1 1];) 的情况。

注意:上面的工作因为A并且B包含整数。如果它们要包含浮点值,您可以首先使用uniqueand将唯一值映射到整数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]
于 2017-09-19T14:46:50.787 回答