What is in your Mathematica tool bag? numaralı belgede tanımladığım CacheIndex tanımını kullanabilirsiniz. Bu işlevi kullanmanın iyi bir yanı, yeni bir işlev tanımlamak zorunda kalmadan, değerleri veya kod bölümlerini önbelleğe alabilmenizdir (buradaki örnekle aynı hizada olmasına rağmen).
G[x_,a_] :=
CacheIndex[a,
Pause[3];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x];
duraklatırsam [3], sadece bir kez hesaplanır sonra İnterpolasyon tanımı, her bir a için önbelleğe bir şekilde ortaya koymaktadır ilave edildi.
Ardından
DeleteCachedValues[CacheIndex] (*or*)
DeleteCachedValues[CacheIndex,1].
Bir Blok tanımlanan ayrı sembol kullanma WReach fikri ile uyumlu hale getirmek için benim Önbellek ve CacheIndex işlevlerini adapte kullanarak CacheIndex önbelleğe İnterpolasyon değerlerini silebilir. Burada pratik olmayan bir şey, Hold niteliklerini önbellek olarak kullanılan sembolle tanımlamanız gerektiğidir, ancak fikir hala ilginçtir. İşte
CacheSymbol
SetAttributes[CacheSymbol,HoldAll];
CacheSymbol[cacheSymbol_,expr_]:=cacheSymbol[expr]/.(_cacheSymbol:>(cacheSymbol[expr]=expr));
Bir Blok tanımlanabilir olacak bir gerçek örnek önbelleğinde aşağıdaki yönergeleri kullanarak bu uygulama, test edebilirsiniz tanımıdır. İşte
ClearAll[cache] SetAttributes[cache,HoldFirst] CacheSymbol[cache,Pause[3];2+2] ?cache CacheSymbol[cache,Pause[3];2+2]
Bir Blok tanımlanabilir olacak bir gerçek örnek önbelleğinde aşağıdaki yönergeleri kullanarak bu uygulamayı test edebilirsiniz
SetAttributes[CacheIndexSymbol,HoldAll];
CacheIndexSymbol[cacheSymbol_,index_,expr_]:=cacheSymbol[index,expr]/.(_cacheSymbol:>(cacheSymbol[index,expr]=expr));
CacheSymbolIndex tanımıdır.
ClearAll[cache]
SetAttributes[cache,HoldRest]
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
?cache
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
ve benzer WReach örneğine biz
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}]
]
Bu yaklaşım, sağlanan diğerlerine göre en basit yaklaşım gibi görünüyor. Belki de diğer cevaplarda açıklandığı gibi önbelleğe alma üzerinde bu şemaya bir geri çekilme vardır. Ama farkı bilecek kadar uzman değilim. – mark
Diğer cevaplar, çok büyük büyüdüğünde önbellek sembolünde saklanan belleğin nasıl bırakılacağıyla ilgilidir. Bunların önbellekleme fikri, bu cevaptaki ile aynıdır. Eğer kodunuz çok hafızada değilse, o anki seansın hafızasını kaybetmemek gerçekten de önemli değildir, ancak büyük hesaplamalar yaparsanız yararlı olabilir. – faysou
@Faysal Aberkane ... Teşekkürler – mark