Добавьте семантику воспоминания в указатель на функцию
Memoization - это метод оптимизации, используемый для ускорения программ путем кэширования результатов дорогих вызовов функций и возврата кэшированного результата при вызове программы с теми же входами.
Рассмотрите запоминание вызова функции, если все из следующих значений true:
Эффективность важна.
Функция занимает много времени.
Функция имеет возвращаемые значения, которые полностью определяются входными значениями, и не имеет побочных эффектов.
Системная память достаточна для хранения уникальных входов и выходных комбинаций.
memoizedFcn = memoize(
добавляет семантику воспоминания к указателю на входную функцию и возвращает fh
)MemoizedFunction
объект. Активируйте memoizedFcn
как вы бы активировали fh
. Однако memoizedFcn
не является указателем на функцию.
The MemoizedFunction
объект поддерживает кэш входов и соответствующих выходов. Когда он вызывается, MATLAB® возвращает соответствующие кэшированные выходные значения, если следующие условия равны true.
Входные параметры численно равны кэшированным входам. При сравнении входных значений MATLAB обрабатывает NaN
s как равный.
Количество запрошенных выходных аргументов совпадает с количеством кэшированных выходов, сопоставленных с входами.
Запоминание функции связано с входной функцией, а не с 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
функция.
Внимание
A MemoizedFunction
объекту не известно об обновлениях базовой функции. Если вы измените функцию, связанную с запоминаемой функцией, очистите кэш с clearCache
функция объекта.
Несколько вызовов на memoize
с тем же указателем на функцию возвращает то же MemoizedFunction
объект. Для примера:
x = memoize(@plus); y = memoize(@plus); x == y
ans = logical 1
Вы не должны запоминать функцию с побочными эффектами, такими как установка некоторого глобального состояния или выполнение операций ввода-вывода. Побочные эффекты не повторяются при последующих вызовах запоминаемой функции с теми же входами. Для примера, если вы запоминаете randi
функция memoized всегда возвращает то же значение при вызове с тем же входным параметром.
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