exponenta event banner

MemoizedFunction

Вызов мемуизированной функции и результатов кэширования

Описание

A MemoizedFunction объект поддерживает семантику мемуации дескриптора функции и кэш результатов вызова функции. Он имеет тот же синтаксис вызова, что и дескриптор функции, указанный в Function собственность. Тем не менее, MemoizedFunction объект не является дескриптором функции.

При первом вызове функции memoized с определенным набором входных значений MATLAB ® выполняет функцию, указанную Function свойство и кэширует результаты. При последующих вызовах функции memoized с тем же набором входов MATLAB возвращает кэшированные результаты вместо повторного выполнения функции.

MemoizedFunction объект поддерживает кэш входов и соответствующих выходов. При вызове MATLAB возвращает соответствующие кэшированные выходные значения, если выполняются следующие условия.

  1. Входные аргументы численно равны кэшированным входам. При сравнении входных значений MATLAB обрабатывает NaNs как равные.

  2. Число запрошенных выходных аргументов соответствует количеству кэшированных выходных данных, связанных с входными данными.

Внимание

A MemoizedFunction объект не знает об обновлениях базовой функции. При изменении функции, связанной с памятной функцией, очистите кэш с помощью clearCache объектная функция.

Создание

Создание MemoizedFunction объект, вызовите memoize функция.

Мемоизация функции связана с функцией ввода, а не с функцией MemoizedFunction объект. Поэтому имейте в виду следующее.

  • Построение нового MemoizedFunction объект той же функции создает другую ссылку на те же данные. Две переменные, запоминающие одну и ту же функцию, совместно используют значения свойств кэша и объекта, например размер кэша. В следующем примере переменные a и b совместно использовать кэш и иметь одинаковое значение размера кэша.

    a = memoize(@svd);
    b = memoize(@svd);
    Аналогично, очистка кэша для b (b.clearCache) также очищает кэш для aи любые другие переменные, которые мемуарируют svd функция. clearCache является MemoizedFunction объектная функция.

  • Назначение MemoizedFunction объект для новой переменной создает другую ссылку на те же данные. В следующем примере переменные c и d совместно использовать данные.

    c = memoize(@svd);
    d = c;

  • Очистка переменной не очищает кэш, связанный с функцией ввода. Очистка кэша для MemoizedFunction объект, который больше не существует в рабочей области, создайте новый MemoizedFunction объект к той же функции и используйте clearCache на новом объекте. Кроме того, можно очистить кэш для всех MemoizedFunction с использованием clearAllMemoizedCaches функция.

Свойства

развернуть все

MemoizedFunction свойства управляют поведением функции memoized. Можно получить доступ к свойствам функции memoized или изменить их. Используйте точечную нотацию для ссылки на определенный объект и свойство:

m = memoize(@ones);
m.CacheSize = 25;

Функция с примененной семантикой мемуации, возвращаемая как дескриптор функции. Это свойство доступно только для чтения.

Типы данных: function_handle

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

Типы данных: double

Состояние кэширования, указанное как true или false. Указание MATLAB вызвать функцию, заданную Function независимо от того, кэшируются ли результаты, а не кэшируются, установите для этого свойства значение false.

Типы данных: logical

Функции объекта

clearCacheОчистить кэш для MemoizedFunction объект
statsВозврат кэшированных значений и статистики для MemoizedFunction объект

Примеры

свернуть все

Создать MemoizedFunction объект путем запоминания datetime функция.

mf = memoize(@datetime)
mf = 
  MemoizedFunction with properties:

     Function: @datetime
      Enabled: 1
    CacheSize: 10

Изменение максимального количества кэшированных комбинаций ввода и вывода.

mf.CacheSize = 2
mf = 
  MemoizedFunction with properties:

     Function: @datetime
      Enabled: 1
    CacheSize: 2

Вызовите функцию memoized с тремя различными входными значениями.

a = mf('today');
b = mf('yesterday');
c = mf('tomorrow');

Позвоните в stats для исследования кэшированных результатов.

s = stats(mf);
s.Cache.Inputs{:}
ans = 1x1 cell array
    {'yesterday'}

ans = 1x1 cell array
    {'tomorrow'}

Результаты вызова функции memoized с помощью 'today' не кэшированы, поскольку CacheSize равно 2.

В текущей рабочей папке создайте следующий файл memoizeSquareExample.m содержит функцию для вычисления квадрата числа. При вызове функции, если MATLAB возвращает кэшированные результаты, msg не отображается.

type memoizeSquareExample.m
function m = memoizeSquareExample(n)

m = n^2;
msg = "The square of " + string(n) + " is " + string(m) +".";
disp(msg)

end

Запишите функцию. По умолчанию memoization включен.

mf = memoize(@memoizeSquareExample);

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

a = mf(42);
The square of 42 is 1764.
b = mf(42);

Отключите memoization и вызовите функцию memoized с повторяющимся входным значением. Хотя результаты для входа 42 кэшируются, msg отображается, так как memoization отключен.

mf.Enabled = false;
c = mf(42);
The square of 42 is 1764.

Вызовите функцию memoized с другим набором входных данных.

d = mf(13);
The square of 13 is 169.

Позвоните в stats для исследования кэшированных результатов. MATLAB не возвращает кэшированные результаты, пока memoization отключен или собирает статистику, он продолжает сохранять входные и выходные значения.

s = mf.stats();
s.Cache.Inputs{:}
ans = 1x1 cell array
    {[42]}

Представлен в R2017a