为数值运行分配顺序计数
Assign sequential count for numerical runs
我想为二进制向量中的连续运行分配一个累积数值。我有的是
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 函数范围的解决方案暗示了我。任何帮助将不胜感激。
这里有一个方法:
a = arrayfun(@(x)(1:x), diff(find([1,diff(x),1])), 'uni', 0);
[a{:}]
我们的想法是生成 'run lengths' 的列表,即在您的情况下为 [3,2,1,3,1,1,6]
,然后只需连接一堆计算到该列表中每个值的向量,即 cat(2, 1:3, 1:2, 1:1, 1:3...
.我使用 arrayfun
作为重新应用 :
运算符的快捷方式,然后使用逗号分隔列表 {:}
returns 作为连接的快捷方式。
(不是一行,唉...):
F = find(diff(x))+1;
y = ones(size(x));
y(F) = y(F)-diff([1,F]);
y = cumsum(y);
首先,找到x
中所有有变化的位置;然后构建一个 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{:}];
我想为二进制向量中的连续运行分配一个累积数值。我有的是
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 函数范围的解决方案暗示了我。任何帮助将不胜感激。
这里有一个方法:
a = arrayfun(@(x)(1:x), diff(find([1,diff(x),1])), 'uni', 0);
[a{:}]
我们的想法是生成 'run lengths' 的列表,即在您的情况下为 [3,2,1,3,1,1,6]
,然后只需连接一堆计算到该列表中每个值的向量,即 cat(2, 1:3, 1:2, 1:1, 1:3...
.我使用 arrayfun
作为重新应用 :
运算符的快捷方式,然后使用逗号分隔列表 {:}
returns 作为连接的快捷方式。
(不是一行,唉...):
F = find(diff(x))+1;
y = ones(size(x));
y(F) = y(F)-diff([1,F]);
y = cumsum(y);
首先,找到x
中所有有变化的位置;然后构建一个 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{:}];