使用Dynamic监视功能内的进度

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)

Leo*_*rin 4

不确定这是一个好建议,但是:

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可以保证在函数完成后不会发生全局状态修改。