asi*_*sim 6 wolfram-mathematica
我有兴趣使用Dynamic监控计算的进度.这可以通过以下方式交互式完成:
In[3]:= Dynamic[iter]
In[4]:= Table[{iter, iter^2}, {iter, 1, 500000}];
Run Code Online (Sandbox Code Playgroud)
但是,如果表位于诸如此类的函数内
f[m_] := Module[{iter}, Table[{iter, iter^2}, {iter, 1, m}]];
Run Code Online (Sandbox Code Playgroud)
当我执行函数时,如何跟踪iter的值
f[500000];
Run Code Online (Sandbox Code Playgroud)
?
不确定这是一个好建议,但是:
f[m_] :=
Module[{iter}, getIter[] := iter;
Table[{iter, iter^2}, {iter, 1, m}]];
Run Code Online (Sandbox Code Playgroud)
进而:
Dynamic[getIter[]]
f[500000];
Run Code Online (Sandbox Code Playgroud)
编辑
这会更好,但有些晦涩:
ClearAll[f];
SetAttributes[f, HoldRest];
f[m_, monitorSymbol_: monitor] :=
Block[{monitorSymbol},
Module[{iter},
monitorSymbol := iter;
Table[{iter, iter^2}, {iter, 1, m}]]
];
Run Code Online (Sandbox Code Playgroud)
在这里,您指定一个特定的符号来监视本地化变量的状态。通过使用Block,您可以确保您的符号在最后不会获得任何全局值(更准确地说,它的全局值在最后不会改变 - 如果您愿意,您也可以使用具有某些全局值的符号) 。默认符号是monitor,但您可以更改它。以下是使用方法:
Dynamic[monitor]
f[500000];
Run Code Online (Sandbox Code Playgroud)
这是比第一个更简单的建议更好的建议,因为通过使用Block可以保证在函数完成后不会发生全局状态修改。