选择多个组合(matlab)

时间:2016-06-06 18:51:25

标签: matlab combinations

我有3组数组,每组包含12个相同类型的元素

a=[1 1 1 1 1 1 1 1 1 1 1];
b=[2 2 2 2 2 2 2 2 2 2 2];
c=[3 3 3 3 3 3 3 3 3 3 3];

如果我需要一次拾取12件物品,我必须找到可以拾取的方式

here, 1 1 2 is same as 2 1 1

我找到了这个链接Generating all combinations with repetition using MATLAB

这可以在合理的时间内在matlab中完成。

是正确的

abc=[a b c];
allcombs=nmultichoosek(abc,12);
combs=unique(allcombs,'rows');

1 个答案:

答案 0 :(得分:0)

如果您只需要找到选择项目的方法数量,那么使用生成函数是一种非常有效地计算它的方法,即使对于相当大的N和k值也是如此。

如果您不熟悉生成函数,可以在此处阅读数学背景:

http://mathworld.wolfram.com/GeneratingFunction.html

在这里:

http://math.arizona.edu/~faris/combinatoricsweb/generate.pdf

解决方案取决于以下事实:从36个中选择k个项目的方式数量,每个项目重复12次,可以从生成函数的乘积中确定:

g(x) = 1 + x + x^2 + x^3 + ... + x^12

自己3次。 12来自于元素重复12次的事实(不是你选择12的事实),并且自身乘以3次是因为有三组不同的元素。选择12个元素的方法的数量就是这个多项式乘积中x ^ 12的幂的系数(如果你想向自己证明它有效,可以尝试使用较小的例子。)

最重要的是MATLAB有一个简单的函数conv用于乘法多项式:

>> g = ones(1,13);  %% array of 13 ones, for a 12th degree polynomial with all `1` coefficents
>> prod = conv(g, conv(g, g));  %% multiply g by itself 3 times, as a polynomial
>> prod(13)
ans = 
     91

所以有91种方法从36的列表中选择12个元素。如果你想选择11个元素,那就是z(12) = 78.如果你想选择13个元素,那就是z(14) = 102.

最后,如果你在集合中有不同数量的元素,比如10 1,12 2和14 3,那么你会有3个相同形式的不同多项式1 + x + x^2 + ...,分别为10,12和14度。再次检查度k项的系数会为您提供从该集合中选择k元素的方法的数量。