为什么即使仅使用一种规则和一种表达式,Replace 和 ReplaceAll 也会给出不同的结果?

2024-03-28

也许有人可以向我解释为什么Replace给出了不同的答案ReplaceAll,即使我使用一条规则,并且我认为我有一种表达方式。

根据文档:

ReplaceAll looks at each part of expr, tries all the rules on it, and then goes on to 
the next part of expr. The first rule that applies to a particular part is used; no 
further rules are tried on that part, or on any of its subparts

和替换

A list of rules can be given. The rules are tried in order. The result of the first 
one that applies is returned. If none of the rules apply, the original expr is 
returned.

我有这样的表达:

z/(0.5 -1.4 z+z^2)

这一条规则

z -> Exp[I*w]

以下输入

Clear[z]
hz = z/(0.5 - 1.4 z + z^2);
Replace[hz, z -> Exp[I*w]]
ReplaceAll[hz, z -> Exp[I*w]]

产生这个结果:

z/(0.5 -1.4 z+z^2)                    (*from Replace*)
E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w))  (*from ReplaceAll*)

So, ReplaceAll做了我期望的工作,但没有Replace。我认为我在这里唯一缺少的就是表达式的 Parts 的组成部分。那么也许 hz 不是“一”表达式?好的,很好,但是它应该能够至少将规则应用到其中的一部分。但它没有在任何地方进行任何替换

FullForm[hz]
Times[z,Power[Plus[0.5`,Times[-1.4`,z],Power[z,2]],-1]]

hz 不是一种表达方式吗?如果不是的话,它有多少个零件?是生成的图末尾的叶子数吗TreeForm[hz]?如果是这样,那么我会在那里看到 3 个“z”,并且Replace[]那么应该更换其中之一

我一直用/.不假思索,这与ReplaceAll,但现在我用了Replace[]想法是一样的/.,我发现了这个并注意到了不同的功能。 (需要学习的功能太多,时间却很少:)


实际上,Replace and ReplaceAll are not相同。你可以想到Replace作为更精确的版本,因为Replace您可以在表达式中指定要进行替换的级别。这里的区别有点类似于Map and MapAll,除了微妙之处ReplaceAll不支持深度优先(见下文)。另一个差异也相当微妙,那就是Replace采取Heads选项,同时ReplaceAll不,这使得Replace但比ReplaceAll.

默认情况下,Replace works only在级别 0,即整个表达式。你的z然而更深层次的是:

In[220]:= Clear[z]
hz = z/(0.5 - 1.4 z + z^2);


Position[hz, z]

Out[222]= {{1}, {2, 1, 2, 2}, {2, 1, 3, 1}}

如果您使用级别规范Replace,您可以获得类似于但并不总是相同的效果ReplaceAll:

In[223]:= Replace[hz,z->Exp[I*w],{0,Infinity}]

Out[223]= E^(I w)/(0.5\[VeryThinSpace]-1.4 E^(I w)+E^(2 I w))

和...之间的不同Replace与 lev.spec{0,Infinity} and ReplaceAll前者在表达式之前执行深度优先、子表达式的操作,而后者则从较大的表达式到其部分进行操作。对此进行了更详细的讨论,例如here http://www.mathprogramming-intro.org/book/node218.html。利用这种差异为自己谋取优势的一个例子可以在this https://stackoverflow.com/questions/6562902/efficient-way-to-remove-empty-lists-from-lists/6563973#6563973 post.

回到默认行为Replace,它对整个表达式进行操作:当您只想转换整个表达式而不转换其任何部分(可能会意外地与规则中的模式匹配)时,它非常有用。这种应用的一个例子Replace is here https://stackoverflow.com/questions/6234701/how-to-block-symbols-without-evaluating-them/6236264#6236264.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么即使仅使用一种规则和一种表达式,Replace 和 ReplaceAll 也会给出不同的结果? 的相关文章

  • 如何用权重标记图边

    Warning 当 Mathematica v 8 0 是最酷的孩子时 我发布了这个问题 该bug已于9 0 1版本解决 The help for EdgeLabels http reference wolfram com mathemat
  • 从包内加载mathematica包

    我或多或少有以下设置 在 path to my packages我有两个包裹package1 m and package2 m 每个包的概要如下 BeginPackage package1 Unprotect Names package1
  • 模式匹配不等式

    我想从不平等的实例中提取论据 以下不起作用 知道为什么以及如何解决它吗 Inequality 1 Less x Less 2 Inequality a c e gt a c e Inequality 1 Less x Less 2 Hold
  • 如何使用 Mathematica 查找 Waldo?

    这周末困扰着我 有什么好方法来解决这些问题沃尔多在哪里 https en wikipedia org wiki Where 27s Wally 3F Wally 北美以外 谜题 使用 Mathematica 图像处理和其他功能 这是我到目前
  • 在 Mathematica 中写入文件时格式化数字

    这是一个延续this https stackoverflow com q 4943706 181759关于数字格式的问题 与我之前的相关question https stackoverflow com q 1687705 181759关于获
  • Mathematica 中的空值和非空值测试

    在 Mathematica 中测试某个值是否为 Null 的最佳 最干净 建议的方法是什么 并且不为空 例如 a Null b 0 f n If n Null 1 2 f a f b 结果是 1 If 0 Null 1 2 我本来期望 f
  • 可以使用其他编程语言(python/C#)中的 Mathematica 吗?

    是否可以使用其他语言的 Mathematica 计算能力 我需要执行一些复杂的操作 顺便说一句 不一定是符号操作 如果能够直接从我的 python c 程序调用 Mathematica 的函数或运行 Mathematica 的代码 那就太好
  • 简化 Mathematica 中的正则表达式

    我最近发现克莱尼代数 http en wikipedia org wiki Kleene algebra用于操作和简化正则表达式 我想知道这是否已内置到 Mathematica 等任何计算软件程序中 如果有一个计算工具来进行大型表达式的并集
  • C# 中的复杂计算

    最好的 最有效的 工具是什么 NET C 用于计算 积分 偏导数 其他不平凡的数学 人们能否对 Mathematica 和 Matlab 及其集成发表评论C Math NET http www mathdotnet com是一个用 C 编写
  • 了解内核-前端通信——为什么我的前端冻结?

    EDIT 只需确认您是否可以重现此内容就会很有用 只需一台计算机即可尝试此操作 无需远程连接 Update似乎其他人无法在 Mac 或 Win7 上重现此问题 因此它要么是 WinXP 特定的 要么是我的机器特定的 此时我要放弃了 最好有一
  • 用于出版质量图的 Python Pylab pcolor 选项

    我正在尝试使用 DFT 离散傅立叶变换 图pcolor在Python中 我之前一直使用 Mathematica 8 0 来执行此操作 但我发现 Mathematica 8 0 中的颜色条与我尝试表示的数据具有不良的一对一相关性 例如 这是我
  • 有没有办法自动将Matlab 中的结果或数据导入到Mathematica 中?

    有没有办法将结果或数据 例如矩阵 从Matlab导入到Mathematica自动地 或者有什么方法可以先运行Matlab程序 然后运行Mathematica程序自动地 感谢您提供任何有用的答案 至少有三种方法可以解决这个问题 通过 Java
  • Mathematica 8 中函数声明的问题

    这是一个奇怪的结果 在此示例中函数定义为 functionB 有人可以解释一下吗 我想绘制functionB x and functionB Sqrt x 它们一定是不同的 但是这段代码表明functionB x functionB Sqr
  • 从 Mathematica 中的 Web 设置用户代理导入

    当我使用 Mathematica 连接到我的网站时 Import mysite Data 并查看我的 Apache 日志 我看到 99 XXX XXX XXX 22 May 2011 19 36 28 0200 GET HTTP 1 1 2
  • 如何以编程方式访问 Mathematica 8 中有关“Graph”对象的信息?

    我正在尝试访问某个范围内的信息GraphMathematica 8 中的对象 出于某种原因 Part命令似乎不起作用 myGraph是我想要访问的对象 下面的第一行显示 myGraph 其他人的作用是检查它 myGraph myGraph
  • 如何在 Mathematica 8 中并行集成

    有人知道如何使用所有核心来计算积分吗 我需要使用并行化或并行表 但如何使用 f r Sum 1 n 2 r 2 n 7 2 n n r 2 n 1 x r 2 n 1 n 0 r 2 Nw Transpose Table f j i 1 j
  • 在 Mathematica 中使用图形进行渐变填充

    我如何使用以下内容创建Rectangle in Graphics Using Polygon 你可以 Graphics EdgeForm Black Polygon 0 0 3 0 3 1 0 1 VertexColors gt White
  • 可以在 Mathematica 中扩展 PDF、CDF、FindDistributionParameters 等功能吗?

    我开始使用新的 Mathematica 统计和数据分析功能进行越来越多的工作 我周二参加了 Mathematica 统计与数据分析 在线研讨会 非常棒的演讲 我强烈推荐 但我遇到了一些问题 我希望这个论坛上的人可以花点时间考虑一下 我创建了
  • Mathematica 的模式匹配优化不佳?

    我最近询问了为什么PatternTest引起了大量不必要的评估 PatternTest 未优化 https stackoverflow com questions 8484299 patterntest not optimized列昂尼德回
  • 在 Mathematica 中使用 f@expr 和 expr // f 得到不同的结果

    我正在玩Prefix and Postfix运算符 and 分别 我遇到了以下问题 给定以下代码 它们以完全相同的方式进行评估 Hold MatrixPlot Sort data FullForm Hold MatrixPlot Sort

随机推荐