避免重复调用Interpolation
我想在mathematica中插入一个函数。
函数依赖于参数a
,实际上它是函数F
的反函数,也取决于a
,所以我建立了如下的近似值,
approx = Interpolation[Table[{F[0.1 n, a], 0.1 n}, {n, -100, 100}]]
现在我可以简单地调用approx[x]
来评估一个点的反函数。
相反,我想这样做:定义一个函数,它需要一个参数,
G[x_,a_] = "construct the interpolating function,
and return the value of the function at x"
然后写G [x,a]来评估函数。 否则,我将不得不重复所有我感兴趣的参数的插值,并且存在很多变量。 我已经尝试在模块内插入Interpolation []函数,但每次我调用G [x,a]时都会构造插值! 我将如何避免这种情况?
谢谢阅读。
尝试一下这些方面的内容:
G[a_]:=G[a]=Interpolation[Table[{F[0.1 n, a], 0.1 n}, {n, -100, 100}]]
G[0.2] (* particular value of G[a] *)
G[0.2][0.3] (* the value you want *)
你只会评估G
第一次调用它的每个特定值a
。
第一步是用a
来approx
参数化:
approx[a_] := Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
通过这个定义, G
可以被定义如下:
G[x_, a_] := approx[a][x]
但是,正如在问题中所观察到的,每次调用G
都会重新构造插值。 为了避免这种情况的一个方法是重新定义approx
使用记忆化:
m: approx[a_] := m = Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
现在, approx
将为任何给定的a
保存插值函数,避免在随后的调用中重构相同的a
。 当然,如果有大量的不同值的这种使用内存a
则内存可以运行短。 有可能通过定位使用的高速缓存approx
由保存的值与另一个符号(关联cache
在这种情况下):
approx[a_] := cache[a] /.
_cache :> (cache[a] = Interpolation[Table[{F[0.1` n,a],0.1` n},{n,-100,100}]])
对于这个版本的approx
cache
可以使用Block
cache
进行本地化,例如:
Block[{cache}
, Table[G[x, a], {x, 0, 5}, {a, 0, 1, 0.1}]
]
插值功能依然暂时存储的每个不同的值a
,但现在这些后保存的定义被释放Block
退出。
有关Mathematica中内存函数的更多信息,请参阅SO问题:
用内存构造函数的最佳方法
Mathematica中的动态编程:如何自动定位和/或清除memoized函数的定义
你可以使用我发布在Mathematica工具包中的什么是CacheIndex的定义。 使用这个函数的一个好处是你可以缓存值或部分代码,而不必定义一个新的函数(尽管我们在这里要与示例一致)。
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}]
]
链接地址: http://www.djcxy.com/p/35515.html
上一篇: Avoid repeated calls to Interpolation
下一篇: How to export graphics in "Working" style environment rather than "Printout"?