这是一个使用
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];
)。
注意:上述方法适用于 A
和 B
都包含整数的情况。如果它们包含浮点数值,你可以首先使用 unique
和 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]
A
必须是一个C
,否则你会删除错误的元素。例如,尝试使用A=[1 1 2 2 3 4 4];
,如果在查找中有一个A
,你最终会删除一个4
而不是一个3
。 - Dan