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