给定数组(例如行向量)A和B,我如何找到数组C,使B和C合并将得到A?
例如,给定
A = [2, 4, 6, 4, 3, 3, 1, 5, 5, 5];
B = [2, 3, 5, 5];
然后
C = multiset_diff(A, B) % Should be [4, 6, 4, 3, 1, 5]
(结果的顺序在这里无关紧要)。
对于相同的A,如果为
B = [2, 4, 5]
,则结果应为[6, 4, 3, 3, 1, 5, 5]
。(由于A中有两个
4
,B中有一个4
,结果C中应该有2-1 = 1 4
。其他值类似。)PS:请注意,
setdiff
将删除2、3和5的所有实例,而在这里,无论它们出现在B中的多少次,都需要将其删除。性能:我在本地运行了一些快速N基准测试,以下是结果供以后引用:
A
而言,它的性能提高了3倍,对于中等尺寸(N = 50)的A
而言,其性能提高了1.5倍。histc
的方法。当A的大小N开始大于100时,这是表现最好的一种。例如,当N = 200时,此方法比上述嵌套循环方法好3倍。@matt的for + find方法的效果与小N的histc方法相当,但对于大N的性能却迅速下降(这是有道理的,因为整个
C == B(x)
比较都会在每次迭代时运行)。(在编写本文时,其他方法可能会慢几倍或无效。)
最佳答案
还有一种使用histc
函数的方法:
A = [2, 4, 6, 4, 3, 3, 1, 5, 5, 5];
B = [2, 3, 5, 5];
uA = unique(A);
hca = histc(A,uA);
hcb = histc(B,uA);
res = repelem(uA,hca-hcb)
我们只需根据向量A的唯一值来计算每个向量的重复元素数,然后使用repelem来创建结果。
此解决方案不保留初始顺序,但对您来说似乎不是问题。
我使用
histc
来实现Octave兼容性,但是不建议使用此功能,因此您也可以使用histcounts