Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 关于将纯函数传递给模块_Wolfram Mathematica - Fatal编程技术网

Wolfram mathematica 关于将纯函数传递给模块

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,

只是想检查执行以下操作是否安全:

假设我有一个函数“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,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}]可能会更好。