首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB匿名函数中变量的力评估

MATLAB匿名函数中变量的力评估
EN

Stack Overflow用户
提问于 2014-11-07 19:30:27
回答 3查看 765关注 0票数 4

MATLAB存储变量和匿名函数。下面是文献资料中的一个示例,说明这是如何工作的。

表达式变量: 函数句柄不仅可以存储表达式,还可以存储表达式计算所需的变量。 例如,为一个要求系数a、b和c的匿名函数创建一个函数句柄。 A= 1.3;b= .2;c= 30;抛物线a= @(x) a*x.^2 + b*x + c; 因为在创建抛物线时,a、b和c是可用的,所以函数句柄包含这些值。即使您清除了变量,这些值仍然存在于函数句柄中: 清除a b c x= 1;y=抛物线(X)y= 31.5000

据推测,b和c的值与函数一起存储,即使从mat文件中保存和重新加载。在实践中,我发现这些值不持久,特别是如果最初创建函数的代码是编辑的话。

是否有方法根据变量的数值定义函数句柄?我想要某种形式的东西

代码语言:javascript
复制
>> 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))。(我已将mfile的名称更改为mfilename)

对于这类问题,我通常的解决方案是使用func2str()来删除文件依赖项,但这也去掉了包括参数值在内的工作区信息。所以我想强迫所有的参数在函数定义中接受它们的数值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-07 21:06:07

这些值存储在函数中。正如我以前在不同的答案中所演示的,您可以使用functions命令检查这一点:

代码语言:javascript
复制
>> 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

即使在将句柄保存到磁盘时:

代码语言:javascript
复制
>> 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

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

代码语言:javascript
复制
function p = makeParabola(a,b,c)

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

end

某些注意事项

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

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2014-11-07 22:24:39

匿名函数俘获表达式中涉及的所有变量的值。如果您希望看到捕获的环境工作区,请使用functions,正如@chappjc在他的回答中所显示的那样。

现在,您必须小心匿名函数中使用的变量类型(比如值类型与句柄类型)。

所有原生类型 (数字、逻辑、结构、单元格等)都被捕获了按价值而非参照。示例:

代码语言:javascript
复制
x = magic(4);
f = @() x;    % captures matrix x

x(1) = 1      % modify x
xx = f()      % change not reflected here

将其与使用手柄类类型(例如containers.Map)进行比较:

代码语言:javascript
复制
x = containers.Map('KeyType','char', 'ValueType','double');
f = @() x;        % captures handle-class object x

x('1') = 1;       % modify map
keys(x)           % changed
keys(f())         % also changed!

f() == x          % compare handle equality, evaluates to true
票数 3
EN

Stack Overflow用户

发布于 2014-11-07 19:49:19

代码语言:javascript
复制
a = 1.3, b = 0.2, c = 30;
parabola = eval(['@(x) ', num2str(a), '*x^2 + ', num2str(b), '*x + ', num2str(c)]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26808668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档