[编辑:整个事情有一个非常简单的解决方案:矩阵使用单一数据类型而不是默认的双重]
我刚刚注意到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))的最大值两倍?
答案 0 :(得分:3)
好的,我发现了错误:我的矩阵是单一类型,但是当我将值复制到一个新的变量时,当然会有一个不同的最大值。我自己在这里回答这个问题,所以这个问题不会得不到答案。感谢您的提示,我在尝试构建一个repro-case时找到了原因:)