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