Вы можете использовать определение CacheIndex Я разместил в Что находится в вашей сумке с инструментами Mathematica? .Хорошая особенность использования этой функции заключается в том, что вы можете кэшировать значения или части кода, не определяя новую функцию (хотя мы здесь делаем это в соответствии с примером).
G[x_,a_] :=
CacheIndex[a,
Pause[3];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x];
Я добавил Pause[3] просто чтобы прояснить, что определение Интерполяции кэшируется для каждого a после того, как оно было вычислено один раз.
Затем вы можете удалить кэшированные значения Интерполяции в CacheIndex, используя
DeleteCachedValues[CacheIndex] (*or*)
DeleteCachedValues[CacheIndex,1].
Я адаптировал свои функции Cache и 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}]
]