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