您可以使用的定义CacheIndex我发布在What is in your Mathematica tool bag?。使用这个函数的一个好处是你可以缓存值或部分代码,而不必定义一个新的函数(尽管我们在这里要与示例一致)。
G[x_,a_] :=
CacheIndex[a,
Pause[3];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x];
我添加了Pause [3],以便明确说明Interpolation的定义在每个a被计算一次之后被缓存。
你可以在CacheIndex使用
DeleteCachedValues[CacheIndex] (*or*)
DeleteCachedValues[CacheIndex,1].
我适应我的缓存和CacheIndex功能,以使它们与WReach的使用在一个块中定义一个单独的符号的理念一致,然后删除缓存的插值结果。这里不实际的一点是你必须将Hold属性定义为用作缓存的符号,但这个想法仍然很有趣。
这里是定义CacheSymbol
SetAttributes[CacheSymbol,HoldAll];
CacheSymbol[cacheSymbol_,expr_]:=cacheSymbol[expr]/.(_cacheSymbol:>(cacheSymbol[expr]=expr));
您可以测试使用下面的指令在此执行,在一个真实的例子高速缓存将在一个块定义。
ClearAll[cache]
SetAttributes[cache,HoldFirst]
CacheSymbol[cache,Pause[3];2+2]
?cache
CacheSymbol[cache,Pause[3];2+2]
这里是CacheSymbolIndex的定义
SetAttributes[CacheIndexSymbol,HoldAll];
CacheIndexSymbol[cacheSymbol_,index_,expr_]:=cacheSymbol[index,expr]/.(_cacheSymbol:>(cacheSymbol[index,expr]=expr));
您可以按以下说明测试这个实现,在一个真实的例子高速缓存将在一个块定义。
ClearAll[cache]
SetAttributes[cache,HoldRest]
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
?cache
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
和类似WReach的例子中,我们将有
G[x_,a_] :=
CacheIndexSymbol[cache,a,
Print["Caching"];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x]
Block[{cache},
SetAttributes[cache,HoldRest];
Table[G[x, a], {x, 0, 5}, {a, 0, 1, 0.1}]
]
这种方法似乎是其他方法提供的最简单的方法。如其他答案中所述,也许在这个方案上隐藏了显式缓存。但我不够专业知道这种差异。 – mark
其他答案处理如何释放存储在缓存符号中的内存,当它变得太大时。这些缓存的想法与这个答案中的一样。如果你的代码不是太内存密集型的,可以不关心释放当前会话的内存,但是如果你做大的计算,它会很有用。 – faysou
@Faysal Aberkane ......谢谢 – mark