如何在Matlab中计算一个大的组合函数?

时间:2014-07-17 18:08:14

标签: matlab combinatorics

我想在Matlab中找到以下简单的组合公式

(nchoosek(n,j) * nchoosek(j,k) * nchoose(n-j,i-k)) / (nchoose(n,i)*nchoose(n,j))

但是由于我的参数很大,Matlab会返回Inf作为结果。有人知道可以为我计算这个公式的函数或工具吗?

1 个答案:

答案 0 :(得分:1)

对于每个组合数,请说

nchoosek(n,j)

请改用以下内容:

exp( gammaln(n+1)-gammaln(j+1)-gammaln(n-j+1) )

这个想法是使用对数来避免溢出,并在最后采用指数。这取决于可以通过gammaln 直接计算因子的对数这一事实。

由于您的表达式涉及多个术语,因此最好尽可能长时间地保留在对数域中,并且最后只使用exp一次。例如,

nchoosek(n,j) * nchoosek(j,k)

会变成

exp( gammaln(n+1)-gammaln(j+1)-gammaln(n-j+1) ...
   + gammaln(j+1)-gammaln(k+1)-gammaln(j-k+1) )

作为旁注,在您的具体情况下,您可以应用一些简化。例如,nchoosek(n,j)同时出现在分子和分母中。