代码之家  ›  专栏  ›  技术社区  ›  Ben Schwehn

matlab:exp(x)给出inf,即使exp(max(x))没有

  •  3
  • Ben Schwehn  · 技术社区  · 14 年前

    [编辑:整个问题有一个非常简单的解决方案:矩阵使用单一数据类型而不是默认的双精度类型]

    我刚刚注意到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))?

    1 回复  |  直到 11 年前
        1
  •  3
  •   Ben Schwehn    14 年前

    好的,我发现了错误:我的矩阵是single类型的,但是当我复制一个新变量的值时,这个新变量是一个double,当然最大值不同。我自己在这里回答这个问题,这样问题就不会一直悬而未决了。感谢您的提示,我在尝试建立repro案例时找到了原因:)