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