您可以使用的定義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