Существует ли кэш функций в Matlab?

В Python у нас есть lru_cache в качестве оболочки функций. Добавьте его в свою функцию, и функция будет оцениваться только один раз для каждого входного аргумента.

Пример (из документов Python):

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

Интересно, существует ли подобное в Matlab? На данный момент я использую файлы кеша, вот так:

function result = fib(n):
% FIB example like the Python example. Don't implement it like that!
cachefile = ['fib_', n, '.mat'];
try
    load(cachefile);
catch e
    if n < 2
        result = n;
    else
        result = fib(n-1) + fib(n-2);
    end
    save(cachefile, 'result');
end
end

Проблема, с которой я сталкиваюсь, заключается в том, что если я изменяю свою функцию, мне нужно удалить кеш-файл.

Есть ли способ сделать это с Matlab, понимая, когда я изменил функцию, и кэш стал недействительным?

1 ответ

Решение

Я создал что-то подобное для личного использования: класс CACHE. (Хотя я еще не документировал код.) Он выглядит более гибким, чем Python lru_cache (Я не знал об этом, спасибо), потому что у него есть несколько методов для точной настройки того, что кэшируется (для экономии памяти) и как производится сравнение. Он все еще может использовать некоторые уточнения (предложение Даниэля использовать containers.Map класс хороший - хотя это ограничит совместимость со старыми версиями Matlab). Код находится на GitHub, так что вы можете раскошелиться и улучшить его.

Вот базовый пример того, как его можно использовать:

function Output1 = CacheDemo(Input1,Input2)

persistent DEMO_CACHE

if isempty(DEMO_CACHE)
    % Initialize cache object on first run
    CACHE_SIZE = 10; % Number of input/output patterns to cache
    DEMO_CACHE = CACHE(CACHE_SIZE,Input1,Input2);
    CACHE_IDX = 1;
else
    % Check if input pattern corresponds something stored in cache
    % If not, return next available CACHE_IDX
    CACHE_IDX = DEMO_CACHE.IN([],Input1,Input2);
    if ~isempty(CACHE_IDX) && DEMO_CACHE.OUT(CACHE_IDX) > 0
        [~,Output1] = DEMO_CACHE.OUT(CACHE_IDX);
        return;
    end
end

% Perform computation
Output1 = rand(Input1,Input2);

% Save output to cache CACHE_IDX
DEMO_CACHE.OUT(CACHE_IDX,Output1);

Я создал этот класс для кеширования результатов длительных стохастических симуляций и с тех пор использовал его для хорошего эффекта в нескольких других местах. Если есть интерес, я мог бы потратить некоторое время на документирование кода раньше, чем позже. Было бы неплохо, если бы существовал способ ограничить использование памяти (большое соображение в моих собственных приложениях), но получить размер произвольных типов данных Matlab нетривиально. Мне нравится ваша идея кэширования в файл, который может быть хорошей идеей для больших данных. Кроме того, было бы неплохо создать "облегченную" версию, которая делает то, что делает Python lru_cache делает.

Начиная с Matlab 2017 это доступно:https://nl.mathworks.com/help/matlab/ref/memoizedfunction.html

a = memoized(@sin)
Другие вопросы по тегам