单独扰动匿名函数的每个参数

时间:2017-10-21 21:31:40

标签: matlab anonymous-function

如果我有一个带有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)]

1 个答案:

答案 0 :(得分:2)

在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+row)

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