你可以使用我在
“你的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 中删除已缓存的 Interpolation 值:
DeleteCachedValues[CacheIndex] (*or*)
DeleteCachedValues[CacheIndex,1].
我已经修改了我的Cache和CacheIndex函数,使它们与WReach的想法兼容,即使用在Block中定义的单独符号。这里有一个不太实用的问题,就是你必须为用作缓存的符号定义Hold属性,但这个想法仍然很有趣。
下面是CacheSymbol的定义:
SetAttributes[CacheSymbol,HoldAll];
CacheSymbol[cacheSymbol_,expr_]:=cacheSymbol[expr]/.(_cacheSymbol:>(cacheSymbol[expr]=expr));
您可以按照以下说明测试此实现,在真实示例中,cache将在块中定义。
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}]
]