memoize

Добавьте memoization семантику в указатель на функцию

Синтаксис

Описание

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

Считайте memoizing вызовом функции, если все следующее верно:

  • Эффективность важна.

  • Функция является трудоемкой.

  • Функция имеет возвращаемые значения, которые определяются полностью входными значениями, и не имеет никаких побочных эффектов.

  • Системная память соответствует, чтобы сохранить уникальные комбинации ввода и вывода.

пример

memoizedFcn = memoize(fh) добавляет memoization семантика к указателю функции ввода и возвращает MemoizedFunction объект. Вызовите memoizedFcn когда вы вызвали бы fh. Однако memoizedFcn не указатель на функцию.

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

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

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

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

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

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

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

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

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

Внимание

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

Примеры

свернуть все

Ускорять выполнение сингулярного разложения, когда вы могли работать с теми же входными параметрами многократно, memoize svd функция.

fh = @svd;
memoizedFcn = memoize(fh);

Создайте матрицу и кэшируйте результаты сингулярного разложения. Время вызов функции.

X = magic(1234);
tic
[U,S,V]= memoizedFcn(X);
preCachedTime = toc
preCachedTime = 2.4344

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

tic
[U,S,V]= memoizedFcn(X);
postCachedTime = toc
postCachedTime = 0.0119

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

type computeNumberCombinations.m
function c = computeNumberCombinations(n,k)
% Calculate number of combinations of n items taken k at a time
c = fact(n)/(fact(n-k)*fact(k));
end

function f = fact(n)
f = 1;
for m = 2:n
    f = f*m;   
end
end

Очистите кэш для любого MemoizedFunction объекты в вашей рабочей области.

clearAllMemoizedCaches

Memoize computeNumberCombinations функция, чтобы ускорить расчет для повторных входных значений.

fh = @computeNumberCombinations;
memoizedFcn = memoize(fh);

Вызовите мемоизованную функцию и время вызов функции. Этот вызов функции кэширует результаты для заданных входных параметров.

tic
c = memoizedFcn(42e5,137);
preCachedTime = toc
preCachedTime = 0.0406

Вызовите мемоизованную функцию и время вызов функции снова. Этот вызов функции использует кэшируемые результаты и не выполняет функцию.

tic
c = memoizedFcn(42e5,137);
postCachedTime = toc
postCachedTime = 0.0142

Входные параметры

свернуть все

Функция к memoize в виде указателя на функцию.

Пример: memoizedEigs = memoize(@eigs)

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

Советы

  • Множественные вызовы memoize с тем же указателем на функцию возвращают тот же MemoizedFunction объект. Например:

    x = memoize(@plus);
    y = memoize(@plus);
    x == y
    ans =
    
      logical
    
       1
  • Вы не должны memoize функция с побочными эффектами, такими как установка некоторого глобального состояния или выполнение операций I/O. Побочные эффекты не повторяются на последующих вызовах мемоизованной функции с теми же входными параметрами. Например, если вы memoize randi функция, мемоизованная функция всегда возвращает то же значение, когда названо тем же входным параметром.

    fh = @randi;
    memoized_fh = memoize(fh);
    
    fh_result = [fh(100) fh(100) fh(100)]
    memoized_result = [memoized_fh(100) memoized_fh(100) memoized_fh(100)]
    fh_result =
    
        18    71     4
    
    
    memoized_result =
    
        28    28    28

Смотрите также

Функции

Объекты

Введенный в R2017a