Podría usar la definición de CacheIndex Publicada en What is in your Mathematica tool bag?. Una cosa buena acerca del uso de esta función es que puede almacenar valores en caché o porciones de código sin tener que definir una nueva función (aunque lo hacemos aquí para estar en línea con el ejemplo).
G[x_,a_] :=
CacheIndex[a,
Pause[3];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x];
que añade Pausa [3] sólo para que quede claro que la definición de interpolación se almacena en caché para cada una vez que se ha calculado una vez.
entonces se podría eliminar los valores de interpolación en caché en CacheIndex usando
DeleteCachedValues[CacheIndex] (*or*)
DeleteCachedValues[CacheIndex,1].
adapté mis funciones de caché y CacheIndex para hacerlos compatibles con la idea de WReach de utilizar un símbolo definido por separado en un bloque. Una cosa que no es práctica aquí es que tiene que definir los atributos de retención para el símbolo utilizado como caché, pero la idea sigue siendo interesante.
Aquí es la definición de CacheSymbol
SetAttributes[CacheSymbol,HoldAll];
CacheSymbol[cacheSymbol_,expr_]:=cacheSymbol[expr]/.(_cacheSymbol:>(cacheSymbol[expr]=expr));
Puede probar esta aplicación utilizando las siguientes instrucciones, en un ejemplo real de caché se definiría en un bloque.
ClearAll[cache]
SetAttributes[cache,HoldFirst]
CacheSymbol[cache,Pause[3];2+2]
?cache
CacheSymbol[cache,Pause[3];2+2]
Aquí es la definición de CacheSymbolIndex
SetAttributes[CacheIndexSymbol,HoldAll];
CacheIndexSymbol[cacheSymbol_,index_,expr_]:=cacheSymbol[index,expr]/.(_cacheSymbol:>(cacheSymbol[index,expr]=expr));
Puede probar esta aplicación utilizando las siguientes instrucciones, en un ejemplo real de caché se definiría en un bloque.
ClearAll[cache]
SetAttributes[cache,HoldRest]
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
?cache
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
y de manera similar al ejemplo de WReach tendríamos
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}]
]
Este enfoque parece ser el enfoque más simple sobre los otros proporcionados. Tal vez hay un inconveniente en este esquema sobre el almacenamiento en caché explícito como se describe en las otras respuestas. Pero no soy lo suficientemente experto como para saber la diferencia. – mark
Las otras respuestas tratan sobre cómo liberar memoria almacenada en el símbolo de caché cuando crece demasiado. La idea de almacenamiento en caché de estos es la misma que en esta respuesta. Si tu código no consume mucha memoria, está bien que no te importe liberar la memoria de la sesión actual, pero puede ser útil si haces grandes cálculos. – faysou
@Faysal Aberkane ... Gracias – mark