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

马克

MATLAB将变量与匿名函数一起存储。这是文档中如何工作的示例

表达式中的变量

函数句柄不仅可以存储表达式,还可以存储表达式用于求值的变量。

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

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

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

clear a b c
x = 1;
y = parabola(x)
y =
   31.5000

据说,即使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

编辑:也许我的问题与文件关联,但是当我编辑最初定义匿名函数的文件时,出现如下错误:

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

对于此类问题,我通常的解决方案是使用func2str()删除文件依赖关系,但这也会去除工作空间信息,包括参数值。因此,我想强制所有参数在函数定义中采用其数值。

查普

值存储在函数中。正如我之前在其他答案中所展示的那样,您可以使用以下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

即使将句柄保存到磁盘上:

>> 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

您可以简化抛物线形手柄的创建,如下所示:

function p = makeParabola(a,b,c)

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

end

一些警告

您可以使用MATLAB®保存和加载函数将函数句柄保存和加载到MAT文件中。如果加载在较早的MATLAB会话中保存的函数句柄,则以下情况可能会导致意外行为:

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

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

因此,如果您通过文件支持的函数(不是脚本,则可以)创建句柄,然后修改或删除文件,则该句柄将变为无效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MATLAB中评估常量匿名函数

来自分类Dev

Matlab匿名函数中的大行

来自分类Dev

Matlab中符号函数的元素明智评估

来自分类Dev

如何在Matlab中评估数学函数?

来自分类Dev

无法在MATLAB中接受匿名函数的输入

来自分类Dev

由Matlab中的循环定义的匿名函数

来自分类Dev

无法在MATLAB中接受匿名函数的输入

来自分类Dev

无法在Matlab中绘制匿名函数

来自分类Dev

在匿名函数中更改/获取变量

来自分类Dev

从匿名javascript函数中获取变量

来自分类Dev

Javascript:如何更改匿名函数中的变量

来自分类Dev

如何在匿名函数中访问变量?

来自分类Dev

Matlab评估函数

来自分类Dev

多重匿名函数MATLAB

来自分类Dev

如何在匿名函数中访问函数变量

来自分类Dev

如何在jQuery中的匿名函数中获取变量?

来自分类Dev

如何在jQuery中的匿名函数中获取变量?

来自分类Dev

MATLAB中函数数组的矢量化或单行评估

来自分类Dev

Matlab中的匿名函数出现问题

来自分类Dev

将句柄发送到Matlab中的匿名函数?

来自分类Dev

自调用匿名函数与匿名函数中变量状态的范围和维护

来自分类Dev

C中的强制宏评估

来自分类Dev

Python何时评估函数定义中的变量

来自分类Dev

Javascript:为什么if语句不评估函数中的提升变量

来自分类Dev

来自封闭块的变量在匿名函数中变为空

来自分类Dev

我可以访问用户脚本中的匿名函数变量吗?

来自分类Dev

javascript匿名函数,可访问创建者中的变量

来自分类Dev

从__construct将匿名函数存储在类变量中

来自分类Dev

不增加匿名回调函数中的变量