我想在Matlab中找到以下简单的组合公式
(nchoosek(n,j) * nchoosek(j,k) * nchoose(n-j,i-k)) / (nchoose(n,i)*nchoose(n,j))
但是由于我的参数很大,Matlab会返回Inf作为结果。有人知道可以为我计算这个公式的函数或工具吗?
答案 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)
同时出现在分子和分母中。