Использование Dynamic для мониторинга прогресса в функциях - PullRequest
6 голосов
/ 08 января 2012

Я заинтересован в наблюдении за ходом вычислений с использованием 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 ]

4 голосов
/ 08 января 2012

Не уверен, что это хороший совет, но:

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, вы гарантируете, что после завершения функции не произойдет никаких изменений глобального состояния.

2 голосов
/ 08 января 2012

Для отслеживания выражения вы можете попытаться использовать 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}]
]
2 голосов
/ 08 января 2012

Если вы хотите использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...