5

合計が 9 で、各数値が 0 から 9 まで変化する数値のすべての組み合わせを取得するために、4 列の行列を生成するコードを作成しました。

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

ここで、ゼロなし、ゼロ 1 つ、ゼロ 2 つ、ゼロ 3 つを含む配列をフィルター処理します。いいね、スリーゼロケース

0 0 0 9

2つのゼロケース

0 0 1 8
0 0 2 7
.
.
0 0 8 1

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上記の順序でマトリックスを取得するための提案はありますか?

4

4 に答える 4

7

これは私が今できる最善のことであり、入力マトリックス全体でテストしたことはありません。

m(sum(m == 0, 2) == N, :)

0mを含む行を返す必要があります。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
于 2013-01-17T13:20:29.700 に答える
5

行の先頭のゼロの数で並べ替えるには、必要なのはsortrows(m).

行内のゼロの合計数で並べ替えるには、ハイ パフォーマンス マークの回答を使用します。

于 2013-01-17T13:48:18.423 に答える
3

次の関数を使用しAて、nゼロを含む行列のすべての行を取得できます。

function rows = nzrows(A, n)
  s = sum(A == 0, 2);
  rows = A(s == n, :);
end
于 2013-01-17T13:20:22.007 に答える
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,:)

それが役に立てば幸い。

于 2013-01-17T13:54:04.933 に答える