MATLAB匿名函数中变量的力估计
MATLAB存储变量和匿名函数。下面是一个示例,说明了如何从 表达式中的变量: 函数句柄不仅可以存储表达式,还可以存储变量 表达式求值所需的 例如,创建匿名函数的函数句柄 需要系数a、b和cMATLAB匿名函数中变量的力估计,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.
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会话中保存的函数句柄,以下情况可能会导致意外行为:
- 定义函数的任何文件都已移动,因此不再存在于句柄中存储的路径上
- 将函数句柄加载到与保存它的环境不同的环境中。例如,函数的源不存在或位于与保存句柄的系统不同的文件夹中
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