给定数组(例如行向量)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基准测试,以下是结果供以后引用:
  • @heigele的嵌套循环方法对于A的小长度(例如最多N = 50个元素)效果最佳。与下一个最佳方法相比,对于较小(N = 20)的A而言,它的性能提高了3倍,对于中等尺寸(N = 50)的A而言,其性能提高了1.5倍。
  • @obchardon的基于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

    10-08 11:30