分别扰动匿名函数的每个参数
Perturbing each argument of an anonymous function individually
如果我有一个带有 2 个参数的函数,例如:

我想创建一个函数向量,其中第 i
个元素包含 f
,并对第 i
个参数进行扰动:

我可以这样做:
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)', zeros(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
的对角矩阵,对于每一行,您可以 return 一个接受 x
作为输入和 returns [=23] 的函数句柄=].
f = @(x) x(1) + x(2)^2 ;
k = 2; % k = numel(x)
Eps = 1e-10;
g = cell (1, k);
d = diag(repmat(Eps,1,k));
for ii = 1 : k
g{ii} = @(x)f(d(ii,:)+x);
end
全部在一行中:
g = cellfun(@(y){@(x)f(y+x)},num2cell(diag(repmat(Eps,1,k)),2));
如果我有一个带有 2 个参数的函数,例如:
我想创建一个函数向量,其中第 i
个元素包含 f
,并对第 i
个参数进行扰动:
我可以这样做:
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)', zeros(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
的对角矩阵,对于每一行,您可以 return 一个接受 x
作为输入和 returns [=23] 的函数句柄=].
f = @(x) x(1) + x(2)^2 ;
k = 2; % k = numel(x)
Eps = 1e-10;
g = cell (1, k);
d = diag(repmat(Eps,1,k));
for ii = 1 : k
g{ii} = @(x)f(d(ii,:)+x);
end
全部在一行中:
g = cellfun(@(y){@(x)f(y+x)},num2cell(diag(repmat(Eps,1,k)),2));