文档

memoize的

为函数句柄添加记忆语义

描述

记忆有关是一种优化技术,通过缓存开销较大的函数调用的结果,并在使用相同的输入调用程序时返回缓存的结果,从而加快程序的速度。

如果满足以下所有条件,可以考虑记住函数调用:

  • 性能很重要。

  • 这个函数很耗时。

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

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

例子

memoizedFcn = memoize(跳频将记忆语义添加到输入函数句柄,并返回一个MemoizedFunction对象。调用memoizedFcn正如你所引用的跳频.然而,memoizedFcn不是函数句柄。

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

  1. 输入参数在数字上等于缓存的输入。当比较输入值时,MATLAB处理S等于。

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

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

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

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

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

    C = memoize(@svd);D = c;

  • 清除变量不会清除与输入函数关联的缓存。清除对象的缓存MemoizedFunction对象,创建一个新的MemoizedFunction对象添加到相同的函数,并使用clearCache函数在新对象上。或者,您可以清除所有缓存MemoizedFunction对象使用clearAllMemoizedCaches函数。

谨慎

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

例子

全部折叠

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

Fh = @svd;memoizedFcn = memoize(fh);

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

X = magic(1234);tic [U,S,V]= memoizedFcn(X);preCachedTime = toc
preCachedTime = 1.0941

再次使用相同的输入调用memoized函数。要观察使用缓存结果的速度改进,请再次计时函数调用。

tic [U,S,V]= memoizedFcn(X);postCachedTime = toc
postCachedTime = 0.0087

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

类型computeNumberCombinations.m
计算一次取k的n个项的组合个数c = fact(n)/(fact(n-k)*fact(k));结束函数f = fact(n) f = 1;对于m = 2:n f = f*m;结束结束

清除缓存MemoizedFunction您工作区中的对象。

clearAllMemoizedCaches

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

fh = @ computenumbercomposites;memoizedFcn = memoize(fh);

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

tic c = memoizedFcn(42e5,137);preCachedTime = toc
preCachedTime = 0.0454

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

tic c = memoizedFcn(42e5,137);postCachedTime = toc
postCachedTime = 0.0097

输入参数

全部折叠

函数来记忆,指定为函数句柄。

例子:memoizedEigs = memoize(@eigs)

数据类型:function_handle

提示

  • 多个呼叫到memoize的使用相同的函数句柄返回相同的结果MemoizedFunction对象。例如:

    X = memoize(@plus);Y = memoize(@plus);X == y
    符合逻辑的1
  • 不应该记住具有副作用的函数,比如设置一些全局状态或执行I/O操作。在使用相同输入对记忆函数的后续调用中,副作用不会重复。例如,如果你记住兰迪函数,memoized函数在使用相同的输入参数调用时总是返回相同的值。

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

另请参阅

功能

对象

在R2017a中介绍