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”来创建介于 0 和 100 之间的所有可能数字,间隔为 5。但是,这个矩阵太大了,这意味着 Matlab 不会创建它。我在想,如果我有那个矩阵,我可以使用条件来减少它,但这是不可能的,因为我从来没有得到矩阵。因此,问题是我如何使用相同代码中的条件修改 allcomb 的代码,或者更好的是,另一种创建我想要的矩阵的方法。

4

1 回答 1

1

请注意,即使结果矩阵非常大 - 准确地说,它有 10,015,005 行和 10 列,并且(如果存储为双精度)占用大约 1GB 的空间。在我的机器上计算大约需要十分钟。然而,它是可计算的,下面的函数会计算它。

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 回答