Mathematica ツール バッグの中身は?に投稿したCacheIndexの定義を使用できます。. この関数を使用する利点の 1 つは、新しい関数を定義しなくても、値またはコードの一部をキャッシュできることです (ただし、ここでは、例に合わせるためです)。
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 の考え方と互換性を持たせました。ここで実用的でないことの 1 つは、キャッシュとして使用されるシンボルに 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}]
]