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范围的函数的解决方案使我不知所措.任何帮助将不胜感激.
这是一种方式:
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用作重新应用:运算符的快捷方式,然后使用逗号分隔列表{:}作为连接的快捷方式返回.
(不是单行,唉...):
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的向量,在其中减去每个连续段的长度.最后,拿出它的痕迹.