Помните механизм

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Почему использование помнить механизм

Если ваш код вызывает процедуру с теми же аргументами несколько раз, избегайте ненужных переоценок, и таким образом, улучшайте производительность. Вместо нескольких оценок вызова процедуры с теми же аргументами MuPAD® может сохранить результаты первого вызова процедуры в специальной таблице. Эта таблица называется помнить таблицей. Система хранит аргументы вызова процедуры как индексы помнить записей таблицы и соответствующие результаты как значения этих записей. Когда вы вызываете процедуру с помощью тех же аргументов в качестве в предыдущих вызовах, MuPAD получает доступ к помнить таблице той процедуры. Если помнить таблица содержит запись с обязательными аргументами, MuPAD возвращает значение той записи. В противном случае MuPAD оценивает вызов процедуры и пишет аргументы и соответствующие результаты к помнить таблице процедуры.

Используя помнить механизм в MuPAD может значительно ускорить ваши вычисления, особенно когда вы используете рекурсивные вызовы процедуры. Например, создайте процедуру, которая вычисляет числа Лукаса. Числа Лукаса являются последовательностью целых чисел. Формула рекурсии, которая задает n th номер Лукаса, подобна определению Чисел Фибоначчи:

Рекурсивная процедура выполнения возвращает любой номер Лукаса:

lucas:= proc(n:Type::PosInt)
begin
  if n = 1 then
    1
  elif n = 2 then
    3
  else
    lucas(n - 1) + lucas(n - 2)
  end_if
end_proc:

Однако, если значение, n является большим, вычисляя n th номер Лукаса, может быть очень медленным. Количество необходимых вызовов процедуры экспоненциально. Часто, вызовы процедуры самостоятельно с теми же аргументами, и это переоценивает результат в каждом вызове:

time(lucas(35))

Используя помнить механизм устраняет эти переоценки. Чтобы включить помнить механизм для конкретной процедуры, используйте функцию prog::remember. Эта функция возвращает измененную копию процедуры, которая хранит результаты предыдущих вызовов в помнить таблице:

lucas := prog::remember(lucas):

Когда вы вызываете эту процедуру, MuPAD получает доступ к помнить таблице. Если система находит необходимую запись в помнить таблице, это возвращается сразу, помнил результаты. Теперь, MuPAD вычисляет 35-е и даже 100-й номер Лукаса почти немедленно:

time(lucas(35)), time(lucas(100))

Также можно включить помнить механизм для конкретной процедуры при помощи опции remember для той процедуры. Например, используйте опцию remember, чтобы включить помнить механизм для процедуры lucas:

lucas:= proc(n:Type::PosInt)
  option remember;
begin
  if n = 1 then
    1
  elif n = 2 then
    3
  else
    lucas(n - 1) + lucas(n - 2)
  end_if
end_proc:

Для дальнейших вычислений удалите процедуру lucas:

delete lucas:

Помните результаты без контекста

По умолчанию помнить механизм не рассматривает контекстной информации вызова процедуры. Таким образом помнить механизм игнорирует любые изменения в наборе предположений на аргументах вызова процедуры и количестве цифр, используемых для арифметики с плавающей точкой. По умолчанию помните, что таблицы содержат только аргументы и результаты вызовов процедуры. Они не хранят контекстную информацию. Например, создайте функциональный f, который вычисляет обратную величину номера. Используйте prog::remember, чтобы включить помнить механизм для этой функции:

f := (x)-> 1.0/x:
f := prog::remember(f):

Количество по умолчанию значительных цифр для чисел с плавающей запятой равняется 10. Используйте функциональный f, чтобы вычислить обратную величину 3. Система отображает результат с точностью с 10 цифрами:

f(3)

Теперь увеличьте число цифр к 50. Затем вызовите функциональный f с аргументом 3 снова. По умолчанию MuPAD не понимает, что вы увеличили требуемую точность. Система получает доступ к помнить таблице, находит запись, которая соответствует аргументу 3 и возвращает результат, ранее вычисленный для того аргумента. Поскольку MuPAD должен отобразить вывод с 50 цифрами, последние цифры в отображенном результате являются неправильными:

DIGITS := 50:
f(3)

Для дальнейших вычислений восстановите значение по умолчанию DIGITS и удалите f:

delete DIGITS, f

Помните результаты и контекст

Несмотря на то, что по умолчанию помнить механизм в MuPAD игнорирует всю контекстную информацию, можно расширить вызов функции prog::remember и учесть свойства аргументов и текущую точность арифметики с плавающей точкой. Например, создайте функциональный f, который вычисляет обратную величину номера. Используйте prog::remember, чтобы включить помнить механизм для этой функции. В вызове функции prog::remember задайте функцию зависимости. Функция зависимости является функцией, которая вычисляет текущие свойства входных параметров и значения DIGITS и ORDER. Затем prog::remember сравнивает эту контекстную информацию с контекстной информацией, используемой, чтобы вычислить помнившие значения. Если контекстной информацией является то же самое, prog::remember возвращает помнивший результат. В противном случае MuPAD оценивает текущий вызов процедуры и добавляет новый результат в помнить таблицу.

Примечание

Опция remember не позволяет вам задать функцию зависимости. Если результаты процедуры зависят от контекстной информации, используйте функцию prog::remember для той процедуры.

В этом примере функция зависимости является списком, который проверяет и свойства входных параметров и значение DIGITS:

f := (x)-> 1.0/x:
f := prog::remember(f, () -> [property::depends(args()), DIGITS]):

Количество по умолчанию значительных цифр для чисел с плавающей запятой равняется 10. Используйте функциональный f, чтобы вычислить обратную величину 3. Система отображает результат с точностью с 10 цифрами:

f(3)

Если вы определяете номер цифр к 50, и затем вызываете функциональный f с тем же аргументом 3, prog::remember понимает, что количество цифр изменилось. Вместо того, чтобы возвратить предыдущий результат, сохраненный в помнить таблице, система переоценивает результат и обновляет помнить таблицу:

DIGITS := 50:
f(3)

Для дальнейших вычислений восстановите значение по умолчанию DIGITS и удалите f:

delete DIGITS, f

Ясный помнят таблицы

В некоторых случаях помнить механизм может привести к неправильным результатам. Например, если вложенная процедура использует помнить механизм, и вы переопределяете внутреннюю процедуру, MuPAD не распознает изменений и не переоценивает вызов процедуры.

Создайте следующую процедуру f как обертка для функции MuPAD heaviside. Используйте prog::remember, чтобы включить помнить механизм для процедуры f:

f := proc(x)
begin
  heaviside(x)
end:
f := prog::remember(f):

Теперь вычислите функцию Heaviside для значений-10, 0, и 10. MuPAD использует значение heaviside(0)=1/2:

f(-10), f(0), f(10)

Можно задать различное значение для heaviside(0). Во-первых, используйте функцию unprotect, чтобы смочь перезаписать значение heaviside. Затем присвойте новое значение heaviside(0):

unprotect(heaviside):
heaviside(0):= 0:

Несмотря на новое значение heaviside(0) = 0, процедура обертки f возвращает старое значение 1/2:

f(0)

Результат вызова процедуры, который не изменяет f(0), потому что система не переоценивает этот результат. Это находит результат в помнить таблице процедуры f и возвращает тот результат. Чтобы отобразить содержимое помнить таблицы, вызовите процедуру обертки f с опцией Remember в качестве первого аргумента и опции Print в качестве второго аргумента. Значение 106 во втором столбце является значением MAXEFFORT, используемого во время вычислений.

f(Remember, Print)

Чтобы обеспечить переоценку вызовов процедуры f, очистите помнить таблицу той процедуры. Чтобы очистить помнить таблицу, вызовите f с опцией Remember в качестве первого аргумента и опции Clear в качестве второго аргумента:

f(Remember, Clear):

Теперь f возвращает правильный результат:

f(0)

Если вы используете опцию remember, также можно очистить помнить таблицу и обеспечить переоценку. Например, перепишите процедуру f можно следующим образом:

f := proc(x)
  option remember;
begin
  heaviside(x)
end:
f(0)

Теперь восстановите функцию heaviside к ее определению по умолчанию:

heaviside(0):= 1/2:

Чтобы очистить помнить таблицу, составленную опцией remember, используйте функцию forget:

forget(f):
f(0)

Используйте функцию protect с опцией ProtectLevelError, чтобы предотвратить дальнейшие изменения в heaviside. Кроме того, удалите процедуру f:

protect(heaviside, ProtectLevelError):
delete f

Потенциальные проблемы, связанные с помнить механизмом

Помнить механизм является мощным инструментом для того, чтобы улучшать производительность процедур MuPAD. Тем не менее, можно столкнуться с некоторыми проблемами при использовании этого механизма:

  • Помните, что таблицы эффективны, только если время доступа помнить таблицы является значительно меньше, чем время должно было оценить результат. Если помнить таблица является очень большой, оценка может быть в вычислительном отношении более дешевой, чем доступ к результату, сохраненному в помнить таблице.

  • Большое хранение помнит, что таблицы требуют большого объема памяти. Особенно, помните таблицы, составленные с опцией, remember может стать очень большим, и значительно уменьшать доступную память. Количество записей в помнит, что таблицы, составленные prog::remember, ограничиваются. Когда количество записей в помнить таблице, составленной prog::remember, достигает максимального количества, система удаляет группу более старых записей.

  • Используя prog::remember или опцию remember для непериодических вызовов процедуры может значительно уменьшить производительность кода. Избегайте использования помнить механизма для непериодических вызовов процедуры, особенно если аргументы являются числовыми.

  • Если вы изменяете свойства входных параметров или изменяете переменные DIGITS или ORDER, помнить механизм игнорирует эти изменения по умолчанию. Смотрите Результаты Запоминания Без Контекста.

  • В некоторых случаях необходимо очистить помнить таблицу процедуры, чтобы осуществить переоценку и избежать неправильных результатов. Например, очистка, помнить таблица может быть необходимой, когда процедура заменяет глобальные переменные или если глобальные переменные влияют на результаты процедуры. Смотрите, что Очистка Помнит Таблицы.

  • Многие предопределили функции MuPAD, сохранили специальные значения в их помнить таблицы. Поэтому очистка помнить таблицы предопределенных функций MuPAD не рекомендуется. Обратите внимание на то, что функция forget не делает ошибки, когда вы вызываете его для предопределенной функции MuPAD.