Добавьте memoization семантику в указатель на функцию
Memoization является методом оптимизации, используемым, чтобы ускорить программы путем кэширования результатов дорогих вызовов функции и возвращения кэшируемого результата, когда программа вызвана теми же входными параметрами.
Считайте memoizing вызовом функции, если все следующее верно:
Эффективность важна.
Функция является трудоемкой.
Функция имеет возвращаемые значения, которые определяются полностью входными значениями, и не имеет никаких побочных эффектов.
Системная память соответствует, чтобы сохранить уникальные комбинации ввода и вывода.
memoizedFcn = memoize(
добавляет memoization семантика к указателю функции ввода и возвращает fh
)MemoizedFunction
объект. Вызовите memoizedFcn
когда вы вызвали бы fh
. Однако memoizedFcn
не указатель на функцию.
MemoizedFunction
объект обеспечивает кэш входных параметров и соответствующих выходных параметров. Когда это вызывается, MATLAB® возвращает связанные кэшируемые выходные значения, если следующие условия верны.
Входные параметры численно равны кэшируемым входным параметрам. При сравнении входных значений MATLAB обрабатывает NaN
s как равный.
Количество требуемых выходных аргументов совпадает с количеством кэшируемых выходных параметров, сопоставленных с входными параметрами.
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
с тем же указателем на функцию возвращают тот же 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