Wolfram mathematica 内存解释中的备份文件

Wolfram mathematica 内存解释中的备份文件,wolfram-mathematica,Wolfram Mathematica,在另一个线程中,描述了如何将函数返回到文件中: $runningLogFile = "/some/directory/runningLog.txt"; flog[x_, y_] := flog[x, y] = f[x, y] /. v_ :> (PutAppend[Unevaluated[flog[x, y] = v;], $runningLogFile]; v) 我觉得我理解了这里的大部分成分,却不知道它是如何工作的。有没有可能有人能告诉我这是如何评估的?让我们一步一步地了解一下对fl

在另一个线程中,描述了如何将函数返回到文件中:

$runningLogFile = "/some/directory/runningLog.txt";
flog[x_, y_] := flog[x, y] = f[x, y] /.
v_ :> (PutAppend[Unevaluated[flog[x, y] = v;], $runningLogFile]; v)

我觉得我理解了这里的大部分成分,却不知道它是如何工作的。有没有可能有人能告诉我这是如何评估的?

让我们一步一步地了解一下对flog[1,2]的评估

flog[1,2]

当计算此表达式时,Mathematica将在问题中给出的
flog
定义中用
1
代替
x
,用
2
代替
y
。这将产生我们旅程的下一步:

flog[1,2]= f[1,2]/。v_uz:>(putpappend[Unevaluated[flog[1,2]=v;],$runningLogFile]; v)

请注意,此处的赋值,
flog[1,2]=…
,是
flog
本身定义的一部分

/。
是一个中缀运算符,是函数的另一种表示形式
ReplaceAll
将对第一个参数的值应用替换规则。等一下,我们会再谈的。第一个参数是
flog[1,2]=f[1,2]
。此表达式将计算
f[1,2]
,然后将结果分配给
flog[1,2]
。为了便于讨论,我们假设
f[1,2]
返回
345
。因此,将在
flog
中添加一个新的定义,即
flog[1,2]=345
。分配后,我们可以检查
flog
的定义:

注意,where
flog
最初只有一个定义,但现在它有两个——新添加的
flog[1,2]
定义缓存了该调用的结果。这通常被称为“记忆化”

flog[1,2]=345
可能会产生为
flog
建立新定义的副作用,但与Mathematica中的每个表达式一样,它也会产生一个值。该值为
345
,经过多次修改后,它将成为
ReplaceAll
的第一个参数

ReplaceAll
的第二个参数是调用
:>
运算符,这是函数的中缀表达式。为了使这篇文章的规模保持在可管理的范围内,我们只需注意,在这种情况下,规则会自行计算

现在我们有了一个表达式,它包含了
/。
来计算

345/。v_uz:>(putpappend[Unevaluated[flog[1,2]=v;],$runningLogFile];v

替换表达式将其第一个参数(
345
)与替换规则的模式组件(
v_
)匹配。
v_
匹配
345
(或其他相关内容)并给出
345
名称
v
,以便于替换。
ReplaceAll
然后用
345
替换规则右侧出现的每个
v
。结果是要计算的下一个表达式

(putpappend[Unevaluated[flog[1,2]=345;],$runningLogFile];345)

这里我们有两个用分号分隔的表达式。顺便说一句,
是一个扩展到的中缀运算符。第一个表达式涉及将其第一个参数的值写入名为第二个参数的值的文件中。但是,请注意,第一个参数是包装的。这会抑制对第一个参数,以便将其完全按原样写入文件:
flog[1,2]=345;
。如果当前Mathematica会话结束,可以将写入的表达式读入未来的Mathematica会话中,以重新建立
flog[1,2]
的记忆结果

CompoundExpression
丢弃除最后一个参数以外的所有参数的值。这里,最后一个参数是
345
。因为我们已经结束了表达式,这将是原始调用的最终返回值。也就是说,
flog[1,2]
返回
345
——尽管我们看到有副作用将此结果保存到内存和磁盘以供将来参考

未来对
flog[1,2]


现在,如果再次调用
flog[1,2]
,Mathematica将发现新定义
flog[1,2]=345
345
将直接返回,不会出现我们上面讨论的任何复杂情况。特别是,它甚至不会调用
f[1,2]
再次强调。这当然是这个例子的全部动机。假设
f
的计算成本非常高,证明所有这些体操都可以将计算次数减到最少。

谢谢你的精彩解释。不过,还有一个问题:为什么你需要在“;”后面加上“v”括号。为什么不只是:putpappend[Unevaluated[flog[x,y]=v;],$runningLogFile];是这样flog的值被打印到屏幕和文件中吗?是的,最后一个
v
提供了整个表达式的最终值。实际上,
flog
可能会在执行需要该结果的更大计算过程中被多次调用(或者所有这些复杂性都是不合理的)。