如何提取连续数字的向量?

时间:2016-02-08 08:49:22

标签: matlab

假设我有一个定义为Q = [1 2 3 4 5 8 9 10 15];的Q向量,我想找到一种方法来提取连续数字的不同向量,并为其余元素提供向量。所以我的结果就像:

q1 = [1 2 3 4 5];
q2 = [8 9 10 ];
q3 = [15];

1 个答案:

答案 0 :(得分:3)

您可以使用diffcumsumaccumarray:

执行此操作
q = accumarray(cumsum([1, diff(Q)~=1])', Q', [], @(x){x})

返回:

{[1,2,3,4,5];
 [8,9,10];
 [15]}

即。 q{1}为您提供[1,2,3,4,5]等,这是一个更清晰的解决方案,具有单独命名的向量。但是,如果你真的想拥有它们,而且你确切知道你将获得多少组,你可以按如下方式进行:

[q1,q2,q3] = q{:};

说明:

accumarray将根据另一个向量(第一个输入)中指定的分组对向量(第二个输入)的元素应用聚合函数(第4个输入)。

使用文档中的表示法:

sub = cumsum([1, diff(Q)~=1])';
val = Q';
fun = @(x){x};

请注意,sub需要从1开始。我们的想法是使用diff来查找使用Q(i+1) - Q(i) == 1函数进行矢量化的连续元素(即diff)。通过指定diff(Q)~=1,我们可以找到连续数字组之间的中断(在开头连接1以在开始时强制中断)。 cumsum然后只需将这些中断转换为sub的正确形式的向量,即

sub = [1 1 1 1 1 2 2 2 3]

我们指定的聚合函数只是单元串联。