我有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)
与其余元素的值不同,因此被视为已切换/更改了成员资格。应用相同的原理,第2组没有开关(即V1(6,1)
和V2(6,1)
),第3组没有开关,第4组没有开关。总共有3个开关。
起初我认为这将是一个简单的计算,没有。 of switches = 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)。
旁注:这实际上是一个网络问题: V1 和 V2 是分区,我正在尝试计算节点切换成员资格的时间。
答案 0 :(得分:2)
以下是使用unique
和accumarray
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)