我有一些数字a_i(对于i = 1到10000)。 我需要使用matlab计算exp(a_i)/ sum(exp(a_j))。
当然,不可能马上计算。我找到了一些技巧,最有趣being:
“假设我们想要找到exp(7.0873e002)。这确实是一个很大的数字,但仍然只是在matlab的直接计算能力范围内。但是,我们可以找到单独的指数和尾数,而不需要调用'exp'作为如下:
a = 7.0873e2;
x = a/log(10);
D = floor(x); % D will be an integer
F = 10^(x-D); % F will lie in 1 <= F < 10
Then D will be the power of ten and F the mantissa
F = 6.27376373225551 % The mantissa
D = 307 % The exponent (power of ten)
Compare that with the direct answer:
exp(a) = 6.273763732256170e+307"
我尝试了类似的东西,但结果可能是Inf:
a = 7.0873e5;
x = a/log(10);
D = floor(x);
F = 10^(x-D);
exp(a) = Inf
有人有想法吗?
答案 0 :(得分:3)
您的答案位于F
和D
。由于您的a
远远大于示例a
(即e5
vs e2
),他们声明的范围几乎不在Matlab的范围内,因此您的inf
必须远远超出范围因此成为D
。但这并不重要,因为F
和exp(a)
保留了您的答案,您不应该针对exp(a)
进行检查,该示例仅计算exp
以进行演示概念证明。但是这段代码的重点是为您提供一种查找巨型数字D =
307797
的方法。
在你的情况下,你得到
F =
3.374110424643062 % Use format long
和
3.374110424643062e+307797
因此您的答案是{{1}}