为数字运行分配顺序计数

J..*_*..S 5 arrays matlab sequences

我想为二进制向量中的顺序运行分配累积数值.我拥有的是什么

x = [0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0],
Run Code Online (Sandbox Code Playgroud)

我想要的是什么

y = [1 2 3 1 2 1 1 2 3 1 1 1 2 3 4 5 6].
Run Code Online (Sandbox Code Playgroud)

使用sum/cumsum/unique/find范围的函数的解决方案使我不知所措.任何帮助将不胜感激.

Dan*_*Dan 6

这是一种方式:

a = arrayfun(@(x)(1:x), diff(find([1,diff(x),1])), 'uni', 0);
[a{:}]
Run Code Online (Sandbox Code Playgroud)

我们的想法是生成一个"运行长度"列表,即[3,2,1,3,1,1,6]在您的情况下,然后只连接一组计数到该列表中每个值的向量,即cat(2, 1:3, 1:2, 1:1, 1:3....我将其arrayfun用作重新应用:运算符的快捷方式,然后使用逗号分隔列表{:}作为连接的快捷方式返回.


Ben*_*y13 6

(不是单行,唉...):

F = find(diff(x))+1;
y = ones(size(x));
y(F) = y(F)-diff([1,F]);
y = cumsum(y);
Run Code Online (Sandbox Code Playgroud)

首先,查找x有变化的所有位置; 然后构建一个1的向量,在其中减去每个连续段的长度.最后,拿出它的痕迹.