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
包含整数。如果它们要包含浮点值,您可以首先使用unique
and将唯一值映射到整数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]