在MATLAB匿名函数中强制评估变量

Mar*_*arc 3 matlab anonymous-function function-handle

MATLAB存储变量以及匿名函数.以下是文档中如何工作的示例.

表达式中的变量:

函数句柄不仅可以存储表达式,还可以存储表达式需要用于评估的变量.

例如,为需要系数a,b和c的匿名函数创建函数句柄.

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;
Run Code Online (Sandbox Code Playgroud)

因为a,b和c在您创建抛物线时可用,所以函数句柄包含这些值.即使清除变量,值仍会保留在函数句柄中:

clear a b c
x = 1;
y = parabola(x)
y =
   31.5000
Run Code Online (Sandbox Code Playgroud)

据推测,ab和c的值即使在保存并从mat文件重新加载时也与函数一起存储.在实践中,我发现这些值不会持久存在,尤其是在编辑最初创建函数的代码时.

有没有办法根据变量的数值定义函数句柄?我想要一些形式

>> a = 1.3;
>> b = .2;
>> c = 30;
>> parabola = @(x) a*x.^2 + b*x + c

parabola = @(x) a*x.^2+b*x+c

>> parabola2 = forceEval(parabola)

parabola2 = @(x) 1.3*x.^2+.2x+30
Run Code Online (Sandbox Code Playgroud)

编辑:也许我的问题是与文件关联,但当我编辑我最初定义匿名函数的文件时,我得到一个错误,看起来像:

无法在C:中找到函数@(ydata)nr /(na*dt)*normpdf(ydata,mu(j),s(j))./ normpdf(ydata,mu_a(j),s_a(j)). ..\mfilename.m.(我将mfile的名称更改为mfilename)

我对这类东西的通常解决方案是使用func2str()来删除文件依赖项,但这也会删除包含参数值的工作空间信息.所以我想强制所有参数在函数定义中采用它们的数值.

cha*_*pjc 6

值存储在函数中.正如我之前在不同的答案中演示的那样,您可以使用以下functions命令进行检查:

>> a = 1.3; b = .2; c = 30;
>> parabola = @(x) a*x.^2 + b*x + c;
>> x = 1;
>> y = parabola(x)
y =
         31.5
>> clear a b c
>> y = parabola(x)
y =
         31.5
>> fi = functions(parabola)
fi = 
     function: '@(x)a*x.^2+b*x+c'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}
>> fi.workspace{1}
ans = 
    a: 1.3
    b: 0.2
    c: 30
Run Code Online (Sandbox Code Playgroud)

即使将句柄保存到磁盘:

>> save parabolaFun.mat parabola
>> clear parabola a b c
>> load parabolaFun.mat parabola
>> y = parabola(x)
y =
         31.5
>> fi = functions(parabola)
fi = 
     function: '@(x)a*x.^2+b*x+c'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}
>> fi.workspace{1}
ans = 
    a: 1.3
    b: 0.2
    c: 30
Run Code Online (Sandbox Code Playgroud)

你可以简化这样的抛物线手柄的创建:

function p = makeParabola(a,b,c)

p = @(x) a*x.^2 + b*x + c;

end
Run Code Online (Sandbox Code Playgroud)

一些警告:

您可以使用MATLAB®保存和加载功能在MAT文件中保存和加载函数句柄.如果加载在早期MATLAB会话中保存的函数句柄,则以下条件可能会导致意外行为:

  • 定义该函数的任何文件都已移动,因此不再存在于句柄中存储的路径中.
  • 您将函数句柄加载到与保存它不同的环境中.例如,函数的源不存在,或者位于与保存句柄的系统不同的文件夹中.

在这两种情况下,函数句柄现在都是无效的,因为它不再与任何现有的函数代码相关联.虽然句柄无效,但MATLAB仍然可以成功执行加载而不显示警告.但是,尝试调用句柄会导致错误.

因此,如果您从文件支持的函数(不是脚本,那没关系)创建句柄,然后修改或删除该文件,句柄将变为无效.