【问题标题】:How to calculate a large combinatorial function in Matlab? [closed]如何在 Matlab 中计算一个大的组合函数? [关闭]
【发布时间】:2014-07-17 18:08:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: matlab combinatorics


    【解决方案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) 同时出现在分子和分母中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多