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]