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