为数字运行分配顺序计数

时间:2015-01-13 10:33:05

标签: arrays matlab sequences

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

x = [0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0],

我想要的是

y = [1 2 3 1 2 1 1 2 3 1 1 1 2 3 4 5 6].

使用sum / cumsum / unique / find范围的函数的解决方案使我无法理解。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:6)

这是一种方式:

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

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

答案 1 :(得分:6)

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

F = find(diff(x))+1;
y = ones(size(x));
y(F) = y(F)-diff([1,F]);
y = cumsum(y);

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

答案 2 :(得分:1)

创建一个sparse矩阵,使每次运行位于不同的列上,然后执行累计求和:

t = sparse(1:numel(x), cumsum([1 diff(x)~=0]), 1);
y = nonzeros(cumsum(t).*t).';

使用accumarray和自定义函数在不同的单元格中生成每个增量模式,然后连接所有单元格:

y = accumarray(cumsum([1 diff(x)~=0]).', 1, [], @(x) {1:numel(x).'});
y = [y{:}];