从现有矩阵中提取矩阵

nou*_*fal 5 matlab matrix

我编写了一个代码来生成一个包含四列的矩阵,以获得总和等于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
Run Code Online (Sandbox Code Playgroud)

现在我想过滤数组没有零,一个零,两个零,三个零.喜欢,三零情况

0 0 0 9
Run Code Online (Sandbox Code Playgroud)

两个零的情况

0 0 1 8
0 0 2 7
.
.
0 0 8 1
Run Code Online (Sandbox Code Playgroud)

一个零例

0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
Run Code Online (Sandbox Code Playgroud)

并且没有零情况

1 1 1 6
1 1 2 5
.
.
6 1 1 1
Run Code Online (Sandbox Code Playgroud)

等等..

有任何建议或任何替代方法吗?
更新:

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
Run Code Online (Sandbox Code Playgroud)

是否有以m上述顺序获得矩阵的建议?

Hig*_*ark 7

这是我现在能做的最好的,我没有在你的整个输入矩阵上测试它

m(sum(m == 0, 2) == N, :)
Run Code Online (Sandbox Code Playgroud)

应该返回m包含N0 的行.

编辑:在您的更新后,这里是完整代码的建议:

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
Run Code Online (Sandbox Code Playgroud)


sho*_*zer 5

要按行中前导零的数量排序,您只需要sortrows(m).

要按行中的零总数排序,请使用高性能标记的答案.


3le*_*gos 3

您可以使用以下函数获取矩阵中所有A包含n零的行:

function rows = nzrows(A, n)
  s = sum(A == 0, 2);
  rows = A(s == n, :);
end
Run Code Online (Sandbox Code Playgroud)