Matlab 分别扰动匿名函数的每个参数
如果我的函数有两个参数,例如: 我想创建一个函数向量,其中Matlab 分别扰动匿名函数的每个参数,matlab,anonymous-function,Matlab,Anonymous Function,如果我的函数有两个参数,例如: 我想创建一个函数向量,其中Ith元素通过Ith参数的扰动保持f: 我可以这样做: f = @(x) x(1) + x(2)^2 ; eps = 1e-10; g = @(x) []; for i = 1:2 f_i = @(x) f([x(1) - eps * (i == 1), x(2) - eps * (i == 2)]); g = @(x) [g(x), f_i(x)]; end 对于带有k参数的函数,有没有一种方法可以使用匿名函数
I
th元素通过I
th参数的扰动保持f
:
我可以这样做:
f = @(x) x(1) + x(2)^2 ;
eps = 1e-10;
g = @(x) [];
for i = 1:2
f_i = @(x) f([x(1) - eps * (i == 1), x(2) - eps * (i == 2)]);
g = @(x) [g(x), f_i(x)];
end
对于带有k
参数的函数,有没有一种方法可以使用匿名函数来实现这一点?例如,如果我的函数是:
编辑
(x1,…,xk)
是我需要估计的参数,即x_opt=fminunc(@(x)g(x)*eye(k)*g(x)”,零(k,0))
和未知值
注意:答案应该适用于任何函数形式(例如
f=@(x)x(1)^x(2)
,在这种情况下,我希望g=@(x)[(x(1)-eps)^x(2),x(1)^(x(2)-eps)]
在MATLAB中,您通常不需要创建此类函数。相反,您可以使用向量和矩阵
您可以将(x1,x2,…)
定义为值的向量:
X = [x1 x2 x3 ... xk];
而不是f=[x1^1 x2^2…]
您可以编写:
k = numel(X);
f= X.^(1:k);
对于g
可以创建一个[k*k]
矩阵,每一行表示一个函数:
Eps = 1e-10;
g = repmat(f,k,1);
然后将对角线元素乘以Eps
g(1:k+1:end) = g(1:k+1:end) * Eps;
编辑:
还可以创建函数句柄的单元格数组
您可以创建Eps
的对角矩阵,对于每一行,您可以返回一个函数句柄,该句柄接受x
作为输入,并返回f(x+行)
一网打尽:
g = cellfun(@(y){@(x)f(y+x)},num2cell(diag(repmat(Eps,1,k)),2));
谢谢你的回复,但是我没有任何关于
X
的固定值。最终我需要将g
输入到解算器中,以找到X
的最佳值——即fminunc(@(X)g(X)*眼(k)*g(X)”,零(1,k))
。我将编辑我的问题。
g = cellfun(@(y){@(x)f(y+x)},num2cell(diag(repmat(Eps,1,k)),2));