Wolfram mathematica 关于将纯函数传递给模块
只是想检查执行以下操作是否安全: 假设我有一个函数“f(x)”,它也依赖于其他参数。例如,函数Wolfram mathematica 关于将纯函数传递给模块,wolfram-mathematica,Wolfram Mathematica,只是想检查执行以下操作是否安全: 假设我有一个函数“f(x)”,它也依赖于其他参数。例如,函数a*Exp[(x-x0)^2/(2*std^2)] 我从UI中读取参数a和x0和std的用户输入值(通过滑块),然后制作一个纯函数变量 f=Function[{x,a,x0,std}, a*Exp[ (x-x0)^2/(2*std^2)] 上述操作是在相同的上下文中完成的(在操纵控制区域),当我读取用户输入时,当用户点击按钮运行程序时,我调用另一个较低级别的函数来处理该输入,如下所示 foo[f,
a*Exp[(x-x0)^2/(2*std^2)]
我从UI中读取参数a
和x0
和std
的用户输入值(通过滑块),然后制作一个纯函数变量
f=Function[{x,a,x0,std}, a*Exp[ (x-x0)^2/(2*std^2)]
上述操作是在相同的上下文中完成的(在操纵控制区域),当我读取用户输入时,当用户点击按钮运行程序时,我调用另一个较低级别的函数来处理该输入,如下所示
foo[f,a,x0,std]
foo[f_,a_,x0,std_]:=Module[{x1,x2...},
.....
f[x1,a,x0,std];
f[x2,a,x0,std];
f[x3,a,x0,std]; etc...
....
]
foo[f]
然后在foo内部,它通过如下调用在一些网格点(x1、x2等)上计算f
foo[f,a,x0,std]
foo[f_,a_,x0,std_]:=Module[{x1,x2...},
.....
f[x1,a,x0,std];
f[x2,a,x0,std];
f[x3,a,x0,std]; etc...
....
]
foo[f]
请注意,在foo内部,只使用了pure函数的x
参数,其余的都只是为了好玩
但是由于它们没有在foo中使用,我考虑不传递所有其他参数a,x0,std
因此,我将纯函数改为
f=Function[{x}, a*Exp[ (x-x0)^2/(2*std^2)];
然后像这样叫福
foo[f,a,x0,std]
foo[f_,a_,x0,std_]:=Module[{x1,x2...},
.....
f[x1,a,x0,std];
f[x2,a,x0,std];
f[x3,a,x0,std]; etc...
....
]
foo[f]
然后在福里面,我知道
foo[f_]:=Module[{},
.....
f[x1];
f[x2];
f[x3]; etc...
....
]
我测试了这个,它是有效的。(起初我认为,由于模块foo中的上下文不同,我必须将a,x0,std
与f一起传递。但我没有这样做。似乎纯函数中的a
,x0
和stdx
值保存为全局值并传递到纯函数体中
我的问题:你认为上面的第二种方法有什么问题吗?我忽略了这一点?在我所做的测试中,到目前为止,它工作得很好。这将使它更简单,因为现在我只需要传递纯函数本身,而不需要传递用于构建的所有其他参数,因为它们在foo中不需要
换句话说,我试图在这两种设置之间做出选择:
只是想检查一下
谢谢以下几点怎么样:
mkf[a_, x0_, std_] :=
Function[{x}, Evaluate[a*Exp[(x - x0)^2/(2*std^2)]]]
foo[f_] := Module[{x},
x = 1;
f[x]
]
foo[mkf[1, 1, 1]]
在向前传递函数之前,先生成要使用的函数。沿着以下几行进行操作如何:
mkf[a_, x0_, std_] :=
Function[{x}, Evaluate[a*Exp[(x - x0)^2/(2*std^2)]]]
foo[f_] := Module[{x},
x = 1;
f[x]
]
foo[mkf[1, 1, 1]]
在继续传递函数之前,先生成要使用的函数。好主意。因此,基本上用数字替换了参数,x除外,这样当传递纯函数时,只有x是其中的自由变量。应该更安全。在这种情况下,如果我使用With来构建f呢?如我在编辑(1)中所示.与您的想法相同。似乎有相同的结果。thanksWith也很好;在某些情况下,您可以使用Evaluate尽可能简化事情。重点是生成一个独立于其他变量的新函数。+1-我也会这样做(生成一个嵌入常量的闭包)但是有一件事:由于您使用了
Evaluate
(这在这里不是严格需要的),只有x
重命名为x$
,由SetDelayed/RuleDelayed
完成,才能避免函数体中的x
与x
的可能全局值发生意外冲突。(例如在这里:x=1;函数[{x},求值[a*Exp[(x-x0)^2/(2*std^2)]]
)。我不知道在这种情况下我们是否总能指望重命名方案,但一个简单的保护措施是将mkf
的r.h.s.包装到块[{x},…]
@Nasser您可以使用这里建议的方法,也可以在您的参数事先未知的情况下使用,或者您发现事先生成函数是不方便的:只需生成模块中已有的函数,然后应用它。我使用Evaluate[]是为了证明这个方法实际上有一个优点,就是在这个阶段函数体已经可以被操作(优化);你可以生成一个编译过的函数如果您使用全局变量,可能会很好。好主意。因此您基本上用数字替换了参数,除了x,这样当传递纯函数时,只有x是其中的自由变量。应该更安全。在这种情况下,如果我使用With来构建f呢?如我在编辑(1)中所示.与您的想法相同。似乎有相同的结果。thanksWith也很好;在某些情况下,您可以使用Evaluate尽可能简化事情。重点是生成一个独立于其他变量的新函数。+1-我也会这样做(生成一个嵌入常量的闭包)但是有一件事:由于您使用了Evaluate
(这在这里不是严格需要的),只有x
重命名为x$
,由SetDelayed/RuleDelayed
完成,才能避免函数体中的x
与x
的可能全局值发生意外冲突。(例如在这里:x=1;函数[{x},求值[a*Exp[(x-x0)^2/(2*std^2)]]
)。我不知道在这种情况下我们是否总能指望重命名方案,但一个简单的保护措施是将mkf
的r.h.s.包装到块[{x},…]
@Nasser您可以使用这里建议的方法,也可以在您的参数事先未知的情况下使用,或者您发现事先生成函数是不方便的:只需生成模块中已有的函数,然后应用它。我使用Evaluate[]是为了证明这个方法实际上有一个优点,即在这个阶段函数体已经可以被操作(优化);你可以生成一个编译过的函数。如果你使用全局变量,添加一个块[{x}]可能会更好。