计算多个向量中成员变化的数量

Count the number of membership changes across multiple vectors

我有 2 个向量,其中具有相似值的元素被认为属于同一组,如下所示:

V1    V2

1     7
1     8
1     8
1     8
1     9
2     10
3     11
3     11
3     11
3     12
4     12
4     12

在此示例中,V1 有 4 个组,第 1 组有前 5 个元素,第 2 组有后 1 个元素,第 3 组有后 4 个元素,然后组4 有最后 2 个元素。 V2 有 5 个组,第 1 组有第一个元素,第 2 组有接下来的 3 个元素,等等

现在,我想统计一个元素切换组的次数,以V1为参考。让我们考虑 V1 中的第 1 组。前 5 个元素在同一组中。在 V2 中,情况不再如此,因为 V2(1,1)V2(5,1) 与其余元素的值不同,因此被认为具有 [=47= 】 会员资格。同理,第2组没有开关(即V1(6,1)V2(6,1)),第3组有一个开关,第4组没有开关。总共有3个开关。

起初我以为这是一个没有的简单计算。开关 = numel(unique(V1)) - numel(unique(V2))。但是,如您所见,这低估了开关的数量。有人对此有解决方案吗?

我也欢迎一个更简单的问题的解决方案,其中 V1 只包含一个组,如下所示:

    V1    V2

    2     7
    2     8
    2     8
    2     8
    2     8
    2     8
    2     8
    2     9
    2     8
    2     10
    2     10
    2     8

在第二种情况下,计数是切换的 4 个节点:V2(1,1)、V2(8,1)、V2(10,1)、V2(11,1)。

旁注:这实际上是一个网络问题:V1V2 是分区,我正在尝试计算节点切换成员资格的时间。

这是使用 uniqueaccumarray

的解决方案
    u = unique([V1 V2],'rows');
    switches  = accumarray(u(:,1) , 1, [],@numel)-1;
    total_switches = sum(switches)

或者您可以使用 histcounts

    u = unique([V1 V2],'rows');
    switches  = histcounts(u(:,1) , [unique(u(:,1)); u(end,1)])-1;
    total_switches = sum(switches)