创建一个向量,该向量包含基于条件具有非零值的所有列的索引

时间:2014-10-02 04:54:51

标签: matlab matrix indexing

我有一个填充了0和1的矩阵,我需要计算每行中的数量。然后我需要知道哪一行的计数超过或等于特定限制(任何数字,例如3)。在这些行中的foreach行之后,我需要创建一个向量,该向量包含所有列的索引,该列在该行中以及在其上方及其下方的所有行中具有非零值,直到它到达具有零计数的行。 / p>

实施例: 数据包含以下数据:

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

输出应该是限制为3:

Row 3: col 4 5 2 5 7 
Row 6: col 2 2 3 4 3 

我已经阅读了数据,我计算了以下代码中的数据:

load('data');
mat(isnan(mat)) = 0;
[rows,cols,vals]  = find(mat~= 0);
unqRows=unique(rows);
countElinRows=histc(rows,unqRows);

根据评论员的要求编辑以澄清:

如果给定样本输入数组的第三行变为[0 1 0 0 0 0 1],那么我们必须只有这个输出 -

Row 6: col 2 2 3 4 3

2 个答案:

答案 0 :(得分:1)

为奇怪的代码道歉,但这是我能想到的最好的代码

[I1,~]=find(sum(mat,2)>=3)
[I2,~]=find(sum(mat,2)==0)
[~,CM]=find(diff(mod(sum(bsxfun(@le,I1,I2.')),2))~=0)
[I,J]=arrayfun(@(t)find(mat(I2(CM(t)):I2(CM(t)+1),:)>0),1:length(CM),'UniformOutput',false)
[~,w]=cellfun(@sort,I,'UniformOutput',false);
J=arrayfun(@(t) J{t}(w{t}).',1:length(J),'UniformOutput',false)
celldisp(J)

此代码确实感觉过于复杂。

我已经在一些案例中进行了测试,看起来很好,但很难确定。

答案 1 :(得分:1)

假设A为输入数组,看看这是否适合你 -

[sc1,sr1] = find(A') %//'# row and col indices for sorted rows
s_a1 = sum(A,2) %// sum input array along cols
bounds = find(s_a1==0) %// find bounds/gropus delimited by all zero rows
bounds = unique([1 ; bounds ; size(A,1)]) %// account for non all zero 
                                         %// starting and ending rows

cumsum1 = cumsum(s_a1==0) + double(sum(A(1,:))~=0) %// label groups

valid_groups = accumarray(cumsum1, s_a1, [], @max)>=3 %// valid groups

out = arrayfun(@(k1) sc1(sr1>=bounds(k1) & sr1<=bounds(k1+1)),...
    1:numel(bounds)-1,'un',0) %// find all indices within each group
out = out(valid_groups) %// select only the valid groups for the final output

使用celldisp(out)可视化输出。