如何计算矩阵列中值的运行长度?

时间:2013-08-16 21:34:36

标签: matlab

我有一个由列向量组成的矩阵,其值为0或1.我希望实现的是某种形式的自动化过程,创建一个简洁的结构来显示结果。也就是说,该过程将创建结果向量v1,v2,v3,v4,v5,它们对应于每个列变量的每个序列中连续1的数量。

例如d =

 0 1 1 1 1 
 1 1 0 0 0
 1 1 1 0 1
 0 0 0 0 0
 1 1 0 1 1

我们得到了     V1 = [2,1]     V2 = [3,1]     V3 = [1,1]     V4 = [1,1]     V5 = [1,1,1]

2 个答案:

答案 0 :(得分:2)

这没有循环。

代码应该是不言自明的,否则问我。结果变量是一个单元格数组,因为每个d列的结果都有不同的大小。

nrows = size(d,1);
d_neg_cell = num2cell(~d,[nrows 1]);
zeros_d = cellfun(@find, d_neg_cell, 'UniformOutput', 0);
find_runs = @(v) nonzeros( diff([0; v; nrows+1])-1 ).';
sol = cellfun(find_runs, zeros_d, 'UniformOutput', 0);

对于您的d矩阵,这会给出:

>> sol{:}
ans =
     2     1
ans =
     3     1
ans =
     1     1
ans =
     1     1
ans =
     1     1     1

答案 1 :(得分:1)

迭代列,在开始和结束时添加零以获得正确的边缘选择,采用差异并使用正值和负值来查找上升沿和下降沿的位置。这些位置的不同给出了序列的长度。这是代码

v = {};
for e = d,
    f = diff([0 e' 0]);
    v{end+1} = find(f<0) - find(f>0);
end

返回

>> v{:}
ans =
     2     1
ans =
     3     1
ans =
     1     1
ans =
     1     1
ans =
     1     1     1

编辑回复OP的评论

如果列包含NaN并且您想忽略它们,请更改使用diff的行并传递不带NaN值的数组:

v = {};
for e = d,
    f = diff([0 e(~isnan(e))' 0]);
    v{end+1} = find(f<0) - find(f>0);
end