您可以使用我在您的 Mathematica 工具包中的内容中发布的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}]
]