我有一个填充了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
答案 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)
可视化输出。