我有一个由列向量组成的矩阵,其值为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]
答案 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