您可以使用我在What is in your Mathematica tool bag? 中发布的CacheIndex 的定义。使用此函数的一个好处是,您可以缓存值或部分代码,而无需定义新函数(尽管我们在此与示例保持一致)。
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].
我调整了我的 Cache 和 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}]
]