2014-03-06 37 views
4

我試圖定義:如何在匿名函數中使用變量?

f = @(x) d*x 

其中d是預先定義的變量,比如D = 2。我的目標是使其返回:

@(x) 2*x 

然而,MATLAB返回:

@(x) d*x 

我這樣做的原因是在for循環中定義了一系列函數句柄,例如

q = cell(n, 1); 
for i = 1:n 
    q{i} = @(y) sum(y(1:i)); 
end 

是否可以定義使用匿名函數定義中的索引的函數句柄數組?

+0

究竟你沒有嘗試過嗎?在這之後你怎麼嘗試並使用'q'? – Dan

回答

3

當你定義一個anonymous function,所需要的完整定義功能are stored變量:

通過使用匿名函數,也可以捕捉某些變量以及來自函數工作空間的值以及將它們存儲在句柄中。這些數據值在構建時存儲在句柄中,並且只要存在就包含在句柄中。每當你然後調用它的手柄裝置的功能,MATLAB在函數調用的參數列表中指定的所有變量輸入提供的功能

您可以在您創建的句柄functions命令來驗證這一點:

>> n=3; 
>> for i = 1:n, q{i} = @(y) sum(y(1:i)); end 
>> f1 = functions(q{1}) 
f1 = 
    function: '@(y)sum(y(1:i))' 
     type: 'anonymous' 
     file: '' 
    workspace: {[1x1 struct]} 

functions命令給出關於函數句柄的一般信息,以及包含所有本地範圍的運行功能所需的變量的完整工作區:

>> f1.workspace{1} 
ans = 
    i: 1 

如預期的那樣,i在第一個句柄q{1}中爲1。現在,第二把手:

>> f2 = functions(q{2}); 
>> f2.workspace{1} 
ans = 
    i: 2 

而第三種:

>> f3 = functions(q{3}); 
>> f3.workspace{1} 
ans = 
    i: 3 

每個手柄店i的價值,因爲它是手柄創建時。

4

它是正確的。當你定義f = @(x) d*x時,matlab將在本地範圍內尋找d。由於d在功能定義時爲2,您的功能f將實際上爲。即使你以後改變了d的值,例如d=10,'f'功能仍將使用2

下面是一個例子:

d = 2; 

f = @(x) d*x;  

f(2) % gives 4; 

d = 10; 

f(2) % gives 4 again. matlab will 'remember' that d was 2 at the time of 
    % f function definition