2014-07-22 32 views
1

我在我的代碼中使用匿名函數。例如:由matlab中的循環定義的匿名函數

G = @(x) [norm(A*x-b);A'*(A*x-b)]; 

norm(Ax-b)是目標函數,A'*(Ax-b)是梯度。 然後,

Algo(G,varagin); 

我想這樣做是爲了將f用一個循環:

n = 9; 
k = 2; 
t = 1 - x.^k; 
f = 0; 
for i=1:n 
    f = f + x(i,1)*prod(t(1:i-1)); 
end 
grad_f = zeros(n,1); 
for i0=1:n 
    s = t; 
    s(i0) = []; 
    for i=i0+1:n 
     grad_f(i0) = grad_f(i0) + x(i)*prod(s(1:i0-1)); 
    end 
    grad_f(i0) = -k*x(i0)^(k-1)*grad_f(i0); 
    grad_f(i0) = grad_f(i0) + prod(t(1:i0-1)); 
end 

然後,我想這樣做:

" G = @(x) [f,grad_f] " 

非常感謝您的幫助!

+1

匿名函數已經是「閉包」了。這意味着您可以像通常那樣定義匿名函數,參考表達式中的'grad_f'和'f',函數對象將存儲定義時的值。如果這不是你的問題,請更清楚你想要發生什麼,哪些不起作用。 – Peter

+0

G = @(x)[f,grad_f]; 然後循環不起作用,因爲x在循環中沒有意義。 你能舉個例子說明你的解釋嗎? 謝謝! – user3819570

+0

對不起,我不知道你在問什麼。我不知道你是在試圖在函數內部定義一個循環,還是在循環內定義函數。我認爲你問題中的問題是從這裏開始的:「那麼我想做一些事情:」。用更清楚的描述你的意圖來替換該語言。 – Peter

回答

1

找到了答案: 分別在matlab計算f和grad_f中創建F(x)和GRAD_F(x)作爲函數。 Then:

G = @(x) [F(x);GRAD_F(x)]; 
Algo(G,varargin);