我正在为 Matlab 中的多元 t 分布的 pdf 编写自己的代码。有一段代码包含 gamma 函数。
gamma((nu+D)/2) / gamma(nu/2)
问题是 nu=1000,所以我从 gamma 函数中得到 Inf。看来我将不得不使用伽玛函数的一些数学属性来以不同的方式重写它。
感谢您的任何建议
我正在为 Matlab 中的多元 t 分布的 pdf 编写自己的代码。有一段代码包含 gamma 函数。
gamma((nu+D)/2) / gamma(nu/2)
问题是 nu=1000,所以我从 gamma 函数中得到 Inf。看来我将不得不使用伽玛函数的一些数学属性来以不同的方式重写它。
感谢您的任何建议
您可以使用 function gammaln(x)
,它相当于log(gamma(x))
但避免了溢出问题。你写的函数相当于:
exp(gammaln((nu+D)/2) - gammaln(nu/2))
该数字gamma(1000/2)
大于 MATLAB 支持的最大数量。因此它显示'inf'。要查看 MATLAB 中的最大数量,请检查realmax
. 对于您的情况,如果 D 不是很大,您将不得不重写您的公式。让我们假设在您的情况下,“D”是偶数。那么你的公式将是:nu/2 * (nu/2 -1) * ....* (nu/2 - D/2 + 1)。
sum1 = 1
for i = 1:D/2
sum1 = sum1*(nu/2 - i+1);
end
然后sum1
就会得到你想要的结果。