MemoizedFunction

Вызовите функцию memoized и результаты кэша

Описание

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

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

The 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 свойства управляют поведением запоминаемой функции. Вы можете получить доступ или изменить свойства запоминаемой функции. Используйте запись через точку для ссылки на конкретный объект и свойство:

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'}

Результаты вызова запоминаемой функции с '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

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

mf = memoize(@memoizeSquareExample);

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

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

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

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