【问题标题】:Mathematica: Redefine multiplication so that 0*(-Inf) = 0Mathematica:重新定义乘法,使 0*(-Inf) = 0
【发布时间】:2012-10-05 11:06:26
【问题描述】:

在我的 Mathematica 程序中,我做了一些熵计算,我想使用这个约定:Log[0]*0 = 0. 有没有一种干净的方法可以做到这一点,或者我必须编写自己的函数?

http://tinyurl.com/9d8r4rt 启发,我尝试过这样的事情:

Unprotect[Times];
Times[0,  -Infinity] := 0;
Protect[Times];

但它似乎不适用于我的情况。有没有优雅的方法来做到这一点?

【问题讨论】:

  • 我认为,目前对您没有帮助的观点是,如果您不了解如何颠覆 Mathematica 的评估过程,那么您几乎肯定不应该这样做。例如,如果您(部分)重新定义乘法或Log[],或者为0 提供Up/Down/Own 值,您将希望非常确定在使用 Mathematica 时对其他所有运算的影响不洁的状态。为您的熵计算定义自己的函数并在其范围内实现所需的简化,这要更安全、更直接。

标签: wolfram-mathematica undefined logarithm infinity entropy


【解决方案1】:

我支持 High Performance Mark 的上述声明。然而,这是一个有趣的问题,因为答案很重要。

你需要:

Unprotect[DirectedInfinity];

DirectedInfinity /: Log[0] 0 := 0

你需要DirectedInfinity,因为:

Log[0] // FullForm
DirectedInfinity[-1]

并且您需要使用 TagSet 生成的 UpValue 来覆盖对 -∞ * 0 的默认反应,因为在其他定义之前尝试了 UpValues。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 2021-05-11
    • 2017-04-13
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多