分别扰动匿名函数的每个参数

Perturbing each argument of an anonymous function individually

如果我有一个带有 2 个参数的函数,例如:

formula

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

formula

我可以这样做:

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 个参数的函数使用匿名函数来做到这一点?例如,如果我的函数是:

formula

编辑

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