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

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

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

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

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

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

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

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 является большим, вычисляя nth номер Лукаса может быть очень медленным. Количество необходимых вызовов процедуры экспоненциально. Часто, вызовы процедуры самостоятельно с теми же аргументами, и это переоценивает результат в каждом вызове:

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.