0

0 から 100 までの 10 個の数字のすべての可能な組み合わせを含む行列を作成したいと思います。間隔は 5 で、その合計は 100 になります。つまり、次のようなものです。

(0 0 0 0 0 0 0 0 0 10 90; 10 10 10 10 10 10 10 10 20 0;...)

「allcomb.m」を使用して、5 間隔で 0 から 100 までのすべての可能な数値のようなものを作成します。ただし、この行列は非常に大きいため、Matlab では作成されません。そのマトリックスがあれば、条件を使用してそれを減らすことができると考えていましたが、マトリックスを取得できないため、これは不可能です。したがって、問題は、同じコード内の条件で allcomb のコードを変更する方法、または目的のマトリックスを作成する別の方法である可能性があります。

4

1 に答える 1

1

結果の行列でさえ非常に大きいことに注意してください。正確には、10,015,005 行と 10 列があり、(double として格納されている場合) 約 1GB のスペースを占有します。私のマシンでは、計算に約 10 分かかります。それにもかかわらず、それは計算可能であり、次の関数はそれを計算します。

function w = allconstrainedcombinations(n,k)
    if n == 1
        w = k;
    else
        t = nchoosek(n+k-1,k);  # Total number of rows
        w = zeros(t,n);         # Pre-allocate
        r = 1;                  # Current row
        for v = 0:k
            u = allconstrainedcombinations(n-1,k-v);
            m = size(u,1);
            w(r:r+m-1,1) = v;
            w(r:r+m-1,2:end) = u;
            r = r + m;
        end
    end
end

必要な結果を得るには、呼び出す必要があります

>> x = allconstrainedcombinations(10,20) * 5;

小さな例の結果は次のとおりです。

>> allconstrainedcombinations(3,2)
ans =
     0     0     2
     0     1     1
     0     2     0
     1     0     1
     1     1     0
     2     0     0
于 2013-04-19T07:44:53.827 に答える