【发布时间】:2013-04-01 22:05:57
【问题描述】:
我正在为 Matlab 中的多元 t 分布的 pdf 编写自己的代码。 有一段代码包含了 gamma 函数。
gamma((nu+D)/2) / gamma(nu/2)
问题是 nu=1000,所以我从 gamma 函数中得到 Inf。 看来我将不得不使用伽玛的一些数学属性 函数以不同的方式重写它。
感谢您的任何建议
【问题讨论】:
标签: matlab
我正在为 Matlab 中的多元 t 分布的 pdf 编写自己的代码。 有一段代码包含了 gamma 函数。
gamma((nu+D)/2) / gamma(nu/2)
问题是 nu=1000,所以我从 gamma 函数中得到 Inf。 看来我将不得不使用伽玛的一些数学属性 函数以不同的方式重写它。
感谢您的任何建议
【问题讨论】:
标签: matlab
您可以使用函数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 将是您想要的结果。
【讨论】:
sum1 = sum1*(nu/2 + i-1); 甚至对D 也是正确的(但我们甚至不知道D 是一个整数),但@Ray 有正确的方法。跨度>