如何在matlab中强制创建矩阵的条件

时间:2013-04-19 05:22:09

标签: matlab matrix combinations

我想创建一个矩阵,其中包含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的代码,或者更好的是,另一种创建我的目的的方法。

1 个答案:

答案 0 :(得分: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