我编写了一个代码来生成一个包含四列的矩阵,以获得总和等于9的所有数字组合,每个数字从0到9不等。
m = zeros(220, 4);
pd = 9;
i = 1;
for p = 0:1:pd
for q = 0:1:pd-p
for a = 0:1:pd-q-p
m(i,:) = [p, q, a, pd-a-q-p];
i = i+1;
end
end
end
m
现在我想过滤没有零,一个零,两个零,三个零的数组。喜欢, 三零情况
0 0 0 9
两个零案例
0 0 1 8
0 0 2 7
.
.
0 0 8 1
一个零案例
0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
并且没有零情况
1 1 1 6
1 1 2 5
.
.
6 1 1 1
依旧......
有任何建议或其他方法吗?
的更新
0 0 0 9
0 0 1 8
0 0 2 7
.
.
0 0 8 1
0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
1 1 1 6
1 1 2 5
.
.
6 1 1 1
以上述顺序获取矩阵m
的任何建议?
答案 0 :(得分:7)
这是我现在能做的最好的,我还没有在你的整个输入矩阵上测试它
m(sum(m == 0, 2) == N, :)
应返回包含m
0的N
行。
编辑:在您的更新后,这里有完整代码的建议:
A = zeros(size(m));
k = 1;
for N = (size(m, 2) - 1):-1:0
rows = (sum(m == 0, 2) == N);
idx = k:k + sum(rows) - 1;
A(idx, :) = m(rows, :);
k = idx(end) + 1;
end
答案 1 :(得分:5)
要按行中前导零的数量排序,您只需要sortrows(m)
。
要按行中的零总数排序,请使用High Performance Mark's answer。
答案 2 :(得分:3)
您可以使用以下函数获取具有A
零的矩阵n
的所有行:
function rows = nzrows(A, n)
s = sum(A == 0, 2);
rows = A(s == n, :);
end
答案 3 :(得分:2)
这就是我提出的:
zero_index =[];
one_index =[];
two_index =[];
three_index =[];
for i=1:size(m,1)
if(sum(m(i,:)==0)==0)
zero_index = [zero_index i];
end
if(sum(m(i,:)==0)==1)
one_index = [one_index i];
end
if(sum(m(i,:)==0)==2)
two_index= [two_index i];
end
if(sum(m(i,:)==0)==3)
three_index = [three_index i];
end
end
m(zero_index,:)
m(one_index,:)
m(two_index,:)
m(three_index,:)
希望它有所帮助。