如何从另一个数组中删除一个数组的元素?

时间:2013-04-22 11:16:25

标签: arrays matlab

我有两个数组:

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中的一个;意味着其他13应保留在最终产品中{{ 1}})。此函数应类似于C,区别在于它应该处理数组元素的多个实例。这个类比可以成立,因为我的setdiff只包含B中的元素。

2 个答案:

答案 0 :(得分:4)

For loop solution:

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

结果

C =

     1     2     2     3     3

答案 1 :(得分: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

这甚至适用于B中的值不在A中的值B = [1 4];(或B)或A中的给定值或B = [1 1 1];中的值的情况。 1}}(如A)。

注意:由于BA = [0 0 pi pi 2*pi 2*pi 2*pi]; B = [0 2*pi]; 包含整数,因此上述工作正常。如果它们包含浮点值,则可以先使用uniqueismember将唯一值映射到整数。我们假设我们有以下样本数据:

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]

结果:

  var signedRequest={
  "headers": {
    "Content-Type": "pplication/json; charset=utf-8",
    "Accept": "application/json",
    "x-amz-date": "20170918T134411Z",
    "Authorization": "Calculated sig4 auth",
    "x-amz-security-token": "AgoGb3JpZ2luEKn////////xxxG1iKJBHjjvZH0DxcSqE889Wb3Mv+8PwMqrRe/O5dFFmP+9bQj+fSwVIUvmBplKkQB62x/xTelGHoCEOPXpBWLjT2OAUaBXOti7UZyfyMNgg56/Z58yxk4o2/37xPLbhXfODaL8kydFV8IaPJjdbJIX+a0kXycPLBnVIBdukUp9cMVD27mWN41u3w0VP5J8YiMPzrDnwKtb0U37naoIaknMBqNBDkMGQyHal/TBJ3wjJvJWVntrJvex0QKD8rDLHjaoiIYjBd+a04m2pKsBQJ9WQl02TTCPgRp0bb1oARF2hz0Xpi45Ba6a6E9SAL07UcRShTwX6rmxi0dZ38mkSbBMjI45Xg8r/VaRZx6/OyCq3u+nq4bgLCOMKqb/80F"
  },
  "data": "{\"data\":{\"func\":\"checkIfFacebookSignupComplete\",\"data\":{}}}",
  "method": "POST",
  "url": "https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/user/user"
}