我对使用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];
答案 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]]
]
)
]
答案 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}]
]