[编辑:整个问题有一个非常简单的解决方案:矩阵使用单一数据类型而不是默认的双精度类型]
我刚刚注意到Matlab中的一个(我认为)异常行为,想知道是什么导致了它。我有一个10000x500矩阵m,其值范围为
min(min(M)) = -226.9723 to
max(max(M)) = 92.8173
和
exp(-227) = 2.6011e-99
exp(93) = 2.4512e+40
但是如果我将整个矩阵展开,这个矩阵有inf值:
ii = isinf(exp(M));
sum(sum(ii))
ans =
2
Matlab如何将这些值存储在矩阵中,以便对单个元素的操作可以产生与对矩阵本身执行相同操作时不同的结果?
即。
expM = exp(M);
exp(M(1)) == expM(1) ; %can be false, which I find surprising
我知道无论如何我必须改变算法,因为高指数会给出不精确的结果,即使我可以避免inf值。它发生在人工神经网络计算公式中,如:
sum(log(1+exp(ones(numcases,1)*b_h + data*w_vh)),2);
所以我的计划是把它分成两种情况,第一种情况是指数很小,我按照上面的方法计算,对于高值,我估计
log(1+exp(ones(numcases,1)*b_h + data*w_vh)
具有
ones(numcases,1)*b_h + data*w_vh
听起来合理吗?我的理由当然是
log(1+exp(x)) â log(exp(x)) â x, for large x
顺便问一句:有没有更好的方法来获得矩阵的最大元素,而不是做max的两倍(max(m))?