主要内容

memoize的

向函数句柄添加记忆语义

描述

记忆有关是一种优化技术,用于缓存昂贵的函数调用的结果,并在使用相同的输入调用程序时返回缓存的结果,从而提高程序的速度。

考虑记住一个函数调用,如果下列条件都是真的:

  • 性能是很重要的。

  • 该功能非常耗时。

  • 该函数的返回值完全由输入值决定,并且没有副作用。

  • 系统内存足以存储唯一的输入和输出组合。

例子

memoizedFcn = memoize的(跳频向输入函数句柄添加记忆语义,并返回MemoizedFunction对象。调用memoizedFcn就像你会调用跳频.然而,memoizedFcn不是函数句柄。

MemoizedFunction对象维护输入和相应输出的缓存。当调用它时,MATLAB®如果下列条件为真,则返回相关的缓存输出值。

  1. 输入参数在数值上等于缓存的输入。当比较输入值时,MATLAB处理年代,是平等的。

  2. 请求的输出参数的数量与与输入相关联的缓存输出的数量相匹配。

函数的记忆与输入函数有关,而与函数无关MemoizedFunction对象。因此,请记住以下几点。

  • 建设一个新MemoizedFunction对象创建对相同数据的另一个引用。记忆同一函数的两个变量共享一个缓存和对象属性值,例如缓存大小。在下面的例子中,变量一个b共享一个缓存并具有相同的缓存大小值。

    一个= memoize (@svd);b = memoize (@svd);
    类似地,清除缓存bb.clearCache)也清除缓存一个,和其他变量的记忆圣言会函数。clearCache是一个MemoizedFunction对象的功能。

  • 分配一个MemoizedFunction对象的新变量将创建对相同数据的另一个引用。在下面的例子中,变量cd共享数据。

    c = memoize (@svd);d = c;

  • 清除变量并不清除与输入函数关联的缓存。为。清除缓存MemoizedFunction对象不再存在于工作区中时,创建一个新的MemoizedFunction对象,并使用clearCache函数的新对象。或者,您可以清除所有缓存MemoizedFunction对象的使用clearAllMemoizedCaches函数。

谨慎

一个MemoizedFunction对象不知道对底层函数的更新。如果修改了与该记忆函数关联的函数,请使用clearCache对象的功能。

例子

全部折叠

当您可以在相同的输入上多次操作时,为了加快执行奇异值分解,请记住圣言会函数。

跳频= @svd;memoizedFcn = memoize(跳频);

创建一个矩阵并缓存奇异值分解的结果。计算函数调用的时间。

X =魔法(1234);抽搐(U, V) = memoizedFcn (X);preCachedTime = toc
preCachedTime = 0.8326

使用相同的输入再次调用已记忆的函数。为了观察使用缓存结果的速度改善,再次计时函数调用。

抽搐(U, V) = memoizedFcn (X);postCachedTime = toc
postCachedTime = 0.0070

在当前工作文件夹中,创建一个文件computeNumberCombinations.m包含以下函数来计算组合的个数n项目采取k在一个时间。

类型computeNumberCombinations.m
c =事实(n)/(事实(n-k)*事实(k));End函数f = fact(n) f = 1;对于m = 2:n f = f*m;结束结束

清除任何缓存MemoizedFunction对象。

clearAllMemoizedCaches

Memoize的computeNumberCombinations函数用于加速重复输入值的计算。

跳频= @computeNumberCombinations;memoizedFcn = memoize(跳频);

调用已记忆的函数并计时调用函数。这个函数调用缓存指定输入的结果。

tic c = memoizedFcn(42e5137);preCachedTime = toc
preCachedTime = 0.0354

调用已记忆的函数并再次计时调用函数。这个函数调用使用缓存的结果,而不执行函数。

tic c = memoizedFcn(42e5137);postCachedTime = toc
postCachedTime = 0.0071

输入参数

全部折叠

要记忆的函数,指定为函数句柄。

例子:memoizedEigs = memoize (@eigs)

数据类型:function_handle

提示

  • 多个电话memoize的用相同的函数句柄返回相同的MemoizedFunction对象。例如:

    x = memoize (@plus);y = memoize (@plus);x = = y
    逻辑1
  • 您不应该记忆具有副作用的函数,例如设置某些全局状态或执行I/O操作。对具有相同输入的已记忆函数的后续调用不会重复出现副作用。例如,如果你记住兰迪函数,当调用具有相同输入参数的函数时,记忆的函数总是返回相同的值。

    跳频= @randi;memoized_fh = memoize(跳频);Fh_result = [fh(100) fh(100) fh(100)] memoized_result = [memoized_fh(100) memoized_fh(100)]
    Fh_result = 18 71 4 memoized_result = 28 28 28

另请参阅

功能

对象

介绍了R2017a