2016-01-14 115 views
2

我想傳遞一個帶有參數的函數給另一個函數,該函數將函數處理程序(指針)作爲參數,但函數的一些參數處理程序需要修復。在MATLAB中如何做到這一點?如何在MATLAB中傳遞一個帶有固定參數的函數作爲參數

具體而言,我想使用fminsearch(fun,x0)最小化函數h(eta)。一個顯而易見的問題是,如果我通過x0中的所有參數,它將使所有參數最小化,但這不是我想要做的。我真正想要做的是不是:

enter image description here

我曾嘗試以下,似乎爲我測試了它的工作至今:

function [ h ] = function_returner(x) 
% 
t = -10000; 
h = @(eta)-10*x + t + eta^2; 
end 

和腳本來測試它:

h = function_returner(0); 
h(3) %-9991 
[x,fval,exitflag] = fminsearch(h,[10]) %returns [0, -10000, 1] 

返回正確的最小值和獲得最小值的x的正確值。我想確保的是,在返回函數處理函數後,固定的變量h確實保持不變。即如果傳遞h,那麼如何確保變量不會因爲進入與函數處理程序具有相同變量名稱的環境而更改值?

我還寫道:

x = inf; 
t = inf; 
eta = inf; 
h = function_returner(0); 
h(3) %-9991 
[x,fval,exitflag] = fminsearch(h,[10]) %returns [0, -10000, 1] 

,似乎去不受影響(即它的作品,因爲我希望它的工作)。但爲了安全起見,我希望沒有一個奇怪的邊緣條件,這是行不通的。

回答

3

你是不必要地擔心。 :-)問題是,當你創建一個匿名函數時,所有用於定義的外部變量都是frozen,所以你不必擔心函數會通過修改後的參數改變背後的行爲。要測試這個,試試這個腳本:

a = 1; 
b = 2; 

f = @(u,v) u*a + v*b; 
x = f(1,1); %// x is 3 = 1*1 + 1*2 

a = 2; 
b = 3; 

g = @(w) f(w,a) 
y = g(1); %// y is 5 = f(1,2) = 1*1 + 2*2 
相關問題