2017-10-21 70 views
1

如果我有以2個參數的函數,例如:擾動匿名函數的每個參數單獨地

formula

和我想創建的功能的載體,其中i個元素保存f與擾動

formula

我能做到這一點,如下所示:

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參數使用函數?例如,如果我的功能均:

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

回答

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

感謝您的答覆,但我沒有爲'X'任何固定值。最終,我需要將'g'饋入解算器以找出'x'的最優值 - 即fminunc(@(x)g(x)* eye(k)* g(x)',零,k))'。我將編輯我的問題。 – greyBag

+0

@greyBag答覆已更新。 – rahnema1