Wolfram Mathematica 中的 Evaluate 函数究竟是如何工作的。它如何在下面的两个图中产生差异
How exactly works Evaluate function in Wolfram Mathematica. How does it make a difference in two plots below
我正在尝试了解 Evaluate 功能的具体工作原理。这里我有两个例子,它们之间的唯一区别是函数 Evaluate。
第一个带 Evaluate 的图。
ReliefPlot[
Table[Evaluate[Sum[Sin[RandomReal[9, 2].{x, y}], {20}]], {x, 1, 2, .02},
{y, 1, 2, .02}],
ColorFunction ->
(Blend[{Darker[Green, .8], Lighter[Brown, .2],White}, #] &),
Frame -> False, Background -> None, PlotLegends -> Automatic]
https://imgur.com/itBRYEv.png "plot1"
没有评估的第二个情节。
ReliefPlot[
Table[Sum[Sin[RandomReal[9, 2].{x, y}], {20}], {x, 1, 2, .02},
{y, 1,2, .02}],
ColorFunction ->
(Blend[{Darker[Green, .8], Lighter[Brown, .2], White}, #] &),
Frame -> False, Background -> None,
PlotLegends -> Automatic]
https://i.imgur.com/fvdiSCm.png "plot2"
请在此处解释评估如何产生影响。
Table
具有 HoldAll
属性
Attributes[Table]
(* {HoldAll, Protected} *)
比较这个
count=0;
ReliefPlot[Table[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}],{x,1,2,.02},{y,1,2,.02}]]
count
应该显示你的图,然后是 52020=51*51*20 因为你有一个 51*51 Table 并且每个条目需要评估你的 Sum
的 20 次迭代
有了这个
count=0;
ReliefPlot[Table[Evaluate[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}]],{x,1,2,.02},{y,1,2,.02}]]
count
这应该显示您的绘图,然后显示 20,因为评估只需要对您的 Sum 进行 20 次迭代,即使您确实在屏幕上看到 51*51 个不同颜色的块。
如果您从其中的每一个中删除 ReliefPlot,您将获得相同的显示计数,但没有图形,这似乎表明它不是 ReliefPlot 负责计算 RandomReal 的次数, 就是 Table.
因此 Evaluate 正在将您的 Table 条目的外部文本翻译成内部表格并告诉 Table 这已经完成并且不需要在每次迭代中重复Table.
你放在屏幕上看到的是Mathematica的前端。隐藏在它后面的是完成大部分实际计算的后端。在你输入、计算、输出、显示的过程中,前后端相互通信。
但这仍然没有回答为什么这两个图看起来如此不同的问题。我猜想当您不使用 Evaluate 并且因此不将 Table 的结果标记为完整和完成时,ReliefPlot 将重复探测您的 Table 中的该表达式并且该表达式将由于 RandomReal,每次都不同,这就是显示更平滑的高分辨率显示图形的原因。但是当您确实使用 Evaluate 并且因此 Table 被标记为完成并完成并且不需要进一步评估时,ReliefPlot 仅使用 51 * 51 值而不重新计算或探测并且您得到较低分辨率的 ReliefPlot.
与几乎所有的 Mathematica 一样,无法获得用于数千种不同函数中每一种的算法的详细信息。有时,给定功能的帮助页面中的“选项”和“详细信息”选项卡可以为您提供一些附加信息。实验有时可以帮助您猜测代码背后发生的事情。有时其他非常聪明的人已经弄清楚了部分行为并张贴了描述。但这可能就是全部了。
我正在尝试了解 Evaluate 功能的具体工作原理。这里我有两个例子,它们之间的唯一区别是函数 Evaluate。
第一个带 Evaluate 的图。
ReliefPlot[
Table[Evaluate[Sum[Sin[RandomReal[9, 2].{x, y}], {20}]], {x, 1, 2, .02},
{y, 1, 2, .02}],
ColorFunction ->
(Blend[{Darker[Green, .8], Lighter[Brown, .2],White}, #] &),
Frame -> False, Background -> None, PlotLegends -> Automatic]
https://imgur.com/itBRYEv.png "plot1"
没有评估的第二个情节。
ReliefPlot[
Table[Sum[Sin[RandomReal[9, 2].{x, y}], {20}], {x, 1, 2, .02},
{y, 1,2, .02}],
ColorFunction ->
(Blend[{Darker[Green, .8], Lighter[Brown, .2], White}, #] &),
Frame -> False, Background -> None,
PlotLegends -> Automatic]
https://i.imgur.com/fvdiSCm.png "plot2"
请在此处解释评估如何产生影响。
Table
具有 HoldAll
属性
Attributes[Table]
(* {HoldAll, Protected} *)
比较这个
count=0;
ReliefPlot[Table[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}],{x,1,2,.02},{y,1,2,.02}]]
count
应该显示你的图,然后是 52020=51*51*20 因为你有一个 51*51 Table 并且每个条目需要评估你的 Sum
的 20 次迭代有了这个
count=0;
ReliefPlot[Table[Evaluate[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}]],{x,1,2,.02},{y,1,2,.02}]]
count
这应该显示您的绘图,然后显示 20,因为评估只需要对您的 Sum 进行 20 次迭代,即使您确实在屏幕上看到 51*51 个不同颜色的块。
如果您从其中的每一个中删除 ReliefPlot,您将获得相同的显示计数,但没有图形,这似乎表明它不是 ReliefPlot 负责计算 RandomReal 的次数, 就是 Table.
因此 Evaluate 正在将您的 Table 条目的外部文本翻译成内部表格并告诉 Table 这已经完成并且不需要在每次迭代中重复Table.
你放在屏幕上看到的是Mathematica的前端。隐藏在它后面的是完成大部分实际计算的后端。在你输入、计算、输出、显示的过程中,前后端相互通信。
但这仍然没有回答为什么这两个图看起来如此不同的问题。我猜想当您不使用 Evaluate 并且因此不将 Table 的结果标记为完整和完成时,ReliefPlot 将重复探测您的 Table 中的该表达式并且该表达式将由于 RandomReal,每次都不同,这就是显示更平滑的高分辨率显示图形的原因。但是当您确实使用 Evaluate 并且因此 Table 被标记为完成并完成并且不需要进一步评估时,ReliefPlot 仅使用 51 * 51 值而不重新计算或探测并且您得到较低分辨率的 ReliefPlot.
与几乎所有的 Mathematica 一样,无法获得用于数千种不同函数中每一种的算法的详细信息。有时,给定功能的帮助页面中的“选项”和“详细信息”选项卡可以为您提供一些附加信息。实验有时可以帮助您猜测代码背后发生的事情。有时其他非常聪明的人已经弄清楚了部分行为并张贴了描述。但这可能就是全部了。