下面是使用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
这甚至会为那里并没有在A
(如B = [1 4];
)或B
值比A
更B
一个给定值(如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]
感谢。我必须记住这一点。但是,find中的'A'必须是'C',否则你会删除错误的元素。试着用'A = [1 1 2 2 4 4];''例如,如果在找到内部有一个'A',最终删除一个'4'而不是'3' – Dan 2013-04-22 11:36:24