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