Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Matlab 如何将参数传递给函数句柄,但仅在调用时对其进行解释?_Matlab_Anonymous Function_Function Handle - Fatal编程技术网

Matlab 如何将参数传递给函数句柄,但仅在调用时对其进行解释?

Matlab 如何将参数传递给函数句柄,但仅在调用时对其进行解释?,matlab,anonymous-function,function-handle,Matlab,Anonymous Function,Function Handle,我想做的是: a = 5 foo = @(x) x+a a = 3 foo(1) % recieve 4 相反,我只得到6分!在我运行的其他几个测试中,我发现a在foo为时进行评估,而不是在调用foo时进行评估 由于种种原因,我不能和你一起工作 foo = @(x,a) x+a 当您在Matlab中创建匿名函数时,它会存储它所需且不属于其输入的任何变量的当前值 因此,当您创建如下foo时: a = 5 foo = @(x) x+a 它存储了与此等效的内容: foo = @(x) x+5

我想做的是:

a = 5 
foo = @(x) x+a
a = 3
foo(1) % recieve 4
相反,我只得到6分!在我运行的其他几个测试中,我发现
a
foo
为时进行评估,而不是在调用
foo
时进行评估

由于种种原因,我不能和你一起工作

foo = @(x,a) x+a

当您在Matlab中创建匿名函数时,它会存储它所需且不属于其输入的任何变量的当前值

因此,当您创建如下
foo
时:

a = 5
foo = @(x) x+a
它存储了与此等效的内容:

foo = @(x) x+5
即使以后更改
a
的值,存储在
foo
中的常量值也不会更改

另一方面,如果您想更改
a
的值,则必须接受
a
作为函数的参数


来源:

您可以使用
函数
命令检查存储数据的值:

>> a = 5 
foo = @(x) x+a
a =
     5
foo = 
    @(x)x+a
>> handleInfo = functions(foo)
handleInfo = 
     function: '@(x)x+a'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}
>> handleInfo.workspace{1}
ans = 
    a: 5

不推荐您要求执行的操作。这将很难调试

也就是说,可以使用
evalin
功能来获取
a
的当前值

a=5; 
foo = @(x)evalin('caller','a')+x; 
foo(1)  %Returns 6

a=3; 
foo(1)  %Returns 5
更好(更好!)的方法是将
a
的定义推入适当的数据结构或对象中,并创建一个函数
getCurrentValueOfA()
。然后您可以将
foo
定义为

foo = @(x) getCurrentValueOfA() + x;

抱歉,需要澄清一下:您是说您希望值为4,但得到6?或者你期望它是6,你得到4。我得到6,但期望4.getCurrentValueOfA显然是一个更好的可调试选项,只是它有可读性的缺点。无论如何,两者都能解决问题。谢谢“('caller')”参数表示我们正在计算调用时间?否。“caller”参数表示计算调用函数命名空间中的表达式。另一个选项是“base”,它告诉它使用顶级名称空间。