MATLAB匿名函数中变量的力估计

MATLAB匿名函数中变量的力估计,matlab,anonymous-function,function-handle,Matlab,Anonymous Function,Function Handle,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.

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
据推测,b和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
编辑:可能我的问题在于文件关联,但当我编辑最初在其中定义匿名函数的文件时,我会得到一个错误,如下所示:

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


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

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

a = 1.3, b = 0.2, c = 30;
parabola = eval(['@(x) ', num2str(a), '*x^2 + ', num2str(b), '*x + ', num2str(c)]);
>> 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仍然成功地执行加载,并且没有显示警告。但是,尝试调用句柄会导致错误

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

匿名函数将删除表达式中涉及的所有变量的值。如果您想看到捕获的环境工作区,请按照他的回答使用

现在,您必须注意匿名函数中使用的变量类型(想想值类型和句柄类型)

所有(数字、逻辑、结构、单元格等)都被捕获。例如:

x = magic(4);
f = @() x;    % captures matrix x

x(1) = 1      % modify x
xx = f()      % change not reflected here
将其与使用类型进行比较(例如:


抱歉,我不是在问如何动态更改匿名函数中的参数值。我在问如何在函数的定义中存储参数的显式数值。恐怕我不理解这个问题。对不起,这肯定会有用的,但它超级笨重,我希望避免(但对工作投赞成票)哦,这是在我做了一个不笨重的编辑之后。相信我,即使我头上有枪,我也不会使用eval()什么是
forceval
?@horchler-这是我想写的函数,它使匿名函数定义中的a、b、c隐式值显式化。或者,我想用某种方法来定义匿名函数,这样就不用隐式存储a、b、c的值,而是显式存储为1.30.230。您使用的是什么版本的matlab?您想要的行为似乎已经在2014b版中实现了。@MadPhysician 2012a-我将检查当fi.file不为空(即函数在m文件中定义)并且mfile稍后被编辑时2014bI是否遇到问题。因此,我想把函数写成一种可以用“str2func”写出的形式,并保留值——也就是说,我想(在你的例子中)str2func(使抛物线(1,2,3))给出'@(x)'.^2+2*x+3'而不是'@(x)ax.^2+bx+c',我不知道
函数
。酷+1@Marc:使用chappjc建议的最后一种模式(factory模式,使用函数创建匿名函数)。这样,您就不必担心编辑原始文件。@Marc是的,如果您在文件备份函数中创建句柄,然后删除或修改该文件,则句柄将无效。我只是记下了一些关于函数句柄的注意事项。如果希望它们是防弹的,则必须在基本工作区中定义它们。
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