使用Dynamic监视功能内的进度

时间:2012-01-07 22:26:09

标签: wolfram-mathematica

我对使用Dynamic监控计算进度感兴趣。这可以通过以下方式交互式完成:

In[3]:= Dynamic[iter]

In[4]:= Table[{iter, iter^2}, {iter, 1, 500000}];

但是,如果表位于

之类的函数中
f[m_] := Module[{iter}, Table[{iter, iter^2}, {iter, 1, m}]]; 

当我通过

执行功能时,如何跟踪iter的值
f[500000];

3 个答案:

答案 0 :(得分:4)

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

f[m_] := 
Module[{iter}, getIter[] := iter; 
    Table[{iter, iter^2}, {iter, 1, m}]];

然后:

Dynamic[getIter[]]

f[500000];

修改

这会更好,但有点模糊:

ClearAll[f];
SetAttributes[f, HoldRest];
f[m_, monitorSymbol_: monitor] :=
   Block[{monitorSymbol},
     Module[{iter}, 
         monitorSymbol := iter; 
         Table[{iter, iter^2}, {iter, 1, m}]]
   ];

在此,您可以指定某个符号来监控本地化变量的状态。通过使用Block,您可以确保您的符号最终不会获得任何全局值(更准确地说,它的全局值最终不会更改 - 您也可以使用具有某种全局值的符号,如果你愿意的话)。默认符号为monitor,但您可以更改它。以下是您使用它的方式:

Dynamic[monitor]

f[500000];

这是一个比第一个更简单的建议更好的建议,因为通过使用Block,您可以保证在函数完成后不会发生全局状态修改。

答案 1 :(得分:2)

如果您想使用ProgressIndicator,可以执行以下操作:

(*version 1.0*)
Manipulate[

 msg = "busy...";
 result = process[Unevaluated@progressCounter, max];
 msg = "done!";
 result,


 Dynamic@Grid[{
    {ProgressIndicator[progressCounter, {0, 100}, 
      ImageSize -> {105, 23}, ImageMargins -> 0, 
      BaselinePosition -> Bottom],
     Spacer[5],
     progressCounter, " %"},
    {msg}
    }
   ],


 {{max, 100, "maximum"}, 10, 10000, 10, Appearance -> "Labeled", 
  ContinuousAction -> False},

 {{progressCounter, 0}, None},
 {{result, 0}, None},
 SynchronousUpdating -> False,
 TrackedSymbols :> {max},

 Initialization :>
  (

   process[c_, max_] := Module[{i, tbl},
     c = 0.;
     tbl = Table[0, {max}];

     Do[
      tbl[[i]] = {i, i^2};
      Pause[0.00001];
      c = i/max*100.,
      {i, 1, max}
      ];
     c = 0.;
     tbl[[-1]]
     ]
   )
 ]

enter image description here

答案 2 :(得分:2)

要监控表达式,您可以尝试使用Monitor

Monitor[
 t = Table[{i, i^2}, {i, 500000}];
 Last[t]
 ,
 i
]

此外,您可以ProgressIndicator使用范围i

Monitor[
 t = Table[{i, i^2}, {i, 500000}];
 Last[t]
 ,
 ProgressIndicator[i, {1, 500000}]
]