2013-04-22 117 views
4

我有两个数组:如何从一个阵列中删除一个阵列的元素?

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

是否有可以删除它们包含在BA元素的任何功能?

结果应该是

C=[1 2 2 3 3]; 

的顺序并不重要,但如果有喜欢的1A两次更具体的因素,那么我只需要尽可能多的这些操作,消除(从A)特定元素是在B(在这种情况下,只有一个的13之一;这意味着其他13应留在最终产品中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

感谢。我必须记住这一点。但是,find中的'A'必须是'C',否则你会删除错误的元素。试着用'A = [1 1 2 2 4 4];''例如,如果在找到内部有一个'A',最终删除一个'4'而不是'3' – Dan 2013-04-22 11:36:24

1

下面是使用accumarrayrepelem矢量化的解决方案:

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 

这甚至会为那里并没有在A(如B = [1 4];)或B值比AB一个给定值(如B = [1 1 1];)情况下工作。

注:以上作品自AB包含整数。如果它们包含浮点值,则可以首先使用uniqueismember将唯一值映射到整数。比方说,我们有下面的示例数据:

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] 
相关问题