假设我有一个定义为Q = [1 2 3 4 5 8 9 10 15];
的Q向量,我想找到一种方法来提取连续数字的不同向量,并为其余元素提供向量。所以我的结果就像:
q1 = [1 2 3 4 5];
q2 = [8 9 10 ];
q3 = [15];
答案 0 :(得分:3)
您可以使用diff
,cumsum
和accumarray
:
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]
我们指定的聚合函数只是单元串联。