【问题标题】:Does a function cache exist in Matlab?Matlab中是否存在函数缓存?
【发布时间】:2014-01-31 12:59:28
【问题描述】:

在 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 是否有办法做到这一点?

【问题讨论】:

  • 我会使用一个 container.Map 存储在一个持久变量中。
  • 如果您可以将内容写入缓存,那么包含文件最后编辑的日期应该不会太难。一旦你注意到这是不同的,清除它。我想这只会对相当昂贵的功能有价值,否则只需考虑在会话期间将输出存储在网格中。
  • @DennisJaheruddin,这看起来不错,但无法识别函数的变化。
  • @Daniel:container.Map 也不会识别我的功能的变化。 (假设我将 fib 更改为 fib(n) = fib(n-1) + 2*fib(n-2)
  • @Unapiedra:如果更新函数,则清除持久变量。

标签: matlab caching lru


【解决方案1】:

自 matlab 2017 以来可用: https://nl.mathworks.com/help/matlab/ref/memoizedfunction.html

a = memoized(@sin)

【讨论】:

    【解决方案2】:

    我创建了类似的东西供我个人使用:CACHE 类。 (不过我还没有记录代码。)它似乎比 Python 的 lru_cache 更灵活(我不知道,谢谢),因为它有几种方法可以准确调整缓存的内容(以节省内存) 以及如何进行比较。它仍然可以使用一些改进(@Daniel 建议使用containers.Map 类是一个很好的——尽管它会限制与旧的 Matlab 版本的兼容性)。代码在 GitHub 上,欢迎大家 fork 和改进它。

    这是一个如何使用它的基本示例:

    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 所做的工作。

    【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2015-05-26
    • 2012-06-26
    • 2018-12-29
    相关资源
    最近更新 更多