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