我有两个数组:
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
应保留在最终产品中{{ 1}})。此函数应类似于C
,区别在于它应该处理数组元素的多个实例。这个类比可以成立,因为我的setdiff
只包含B
中的元素。
答案 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)
这是使用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];
中的值的情况。 1}}(如A
)。
注意:由于B
和A = [0 0 pi pi 2*pi 2*pi 2*pi];
B = [0 2*pi];
包含整数,因此上述工作正常。如果它们包含浮点值,则可以先使用unique
和ismember
将唯一值映射到整数。我们假设我们有以下样本数据:
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"
}