一塊兒來學matlab-matlab學習筆記13函數
13_2 匿名函數
以爲有用的話,歡迎一塊兒討論相互學習~Follow Me
參考文獻
https://ww2.mathworks.cn/help/matlab/matlab_prog/anonymous-functions.html?searchHighlight=%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0&s_tid=doc_srchtitlehtml
什麼是匿名函數
- 匿名函數是不存儲在程序文件中、但與數據類型是 function_handle 的變量相關的函數。匿名函數能夠接受輸入並返回輸出,就像標準函數同樣。可是,它們可能只包含一個可執行語句。
- 例如,建立用於計算平方數的匿名函數的句柄:
sqr = @(x) x.^2;
- 變量 sqr 是一個函數句柄。@ 運算符建立句柄,@ 運算符後面的圓括號 () 包括函數的輸入參數。該匿名函數接受單個輸入 x,並顯式返回單個輸出,即大小與包含平方值的 x 相同的數組。
- 經過將特定值 (5) 傳遞到函數句柄來計算該值的平方,與您將輸入參數傳遞到標準函數同樣。
a = sqr(5)
a =
25
- 許多 MATLAB® 函數接受將函數句柄用做輸入,這樣能夠在特定值範圍內計算函數。能夠爲匿名函數或程序文件中的函數建立句柄。使用匿名函數的好處是 沒必要爲僅須要簡短定義的函數編輯和維護文件。
- 經過將函數句柄傳遞到 integral 函數,計算 sqr 函數從 0 到 1 範圍內的積分:
q = integral(sqr,0,1);
- 無需在工做區中建立變量以存儲匿名函數。能夠在表達式內建立臨時函數句柄,例如此次對 integral 函數的調用:
q = integral(@(x) x.^2,0,1);
表達式中的變量
- 函數句柄不只能夠存儲表達式,還能存儲表達式進行計算須要的變量。
- 例如,爲須要係數 a、b 和 c 的匿名函數建立函數句柄。
a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;
- 因爲 a、b 和 c 在您建立 parabola 時可用,該函數句柄包含這些值。即便您清除變量,這些值仍持久保留在函數句柄內:
clear a b c
x = 1;
y = parabola(x)
y =
31.5000
a = -3.9;
b = 52;
c = 0;
parabola = @(x) a*x.^2 + b*x + c;
x = 1;
y = parabola(1)
y =
48.1000
- 能夠將函數句柄及其相關值存儲在 MAT 文件中,而後使用 save 和 load 函數在後續的 MATLAB 會話中加載它們.
save myfile.mat parabola
注意:在構造匿名函數時僅使用顯式變量。若是匿名函數訪問未在參數列表或主體中顯式引用的任何變量或嵌套函數,則 MATLAB 會在您調用該函數時引起錯誤。隱式變量和函數調用一般會在 eval、evalin、assignin 和 load 等函數中遇到。請避免在匿名函數主體中使用這些函數
多個匿名函數
- 匿名函數中的表達式能夠包含其餘匿名函數。這可用於將不一樣的參數傳遞到在某一值範圍內計算的函數。例如,能夠針對不一樣的c值求解如下方程,方法是合併使用兩個匿名函數:

g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
- 將被積函數編寫爲匿名函數,
@(x) (x.^2 + c*x + 1)
- 經過將函數句柄傳遞到 integral 在從 0 到 1 的範圍內計算函數,
integral(@(x) (x.^2 + c*x + 1),0,1)
- 經過爲整個方程構造匿名函數以提供 c 的值,
g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
- 最終的函數能夠針對任何 c 值來求解方程。例如:
g(2)
ans =
2.3333
不帶輸入的函數
- 若是函數不須要任何輸入,在匿名函數定義和調用時輸入空的圓括號
t = @() datestr(now);
d = t()
d =
26-Jan-2012 15:11:47
- 可是不加上括號是一種錯誤的寫法,這會建立另外一個函數句柄,而且不執行函數
d = t
d =
@() datestr(now)
不帶輸入的函數
- 匿名函數的多個輸入須要顯式的指定,用逗號分隔開多個輸入。
myfunction = @(x,y) (x^2 + y^2 + x*y);
x = 1;
y = 10;
z = myfunction(x,y)
z = 111
- 可是不用在建立匿名函數時顯式的定義輸出參數,若是函數中的表達式返回多個輸出,能夠在調用該函數時請求它們。將多個輸出變量括在方括號中。
c = 10;
mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
[x,y] = mygrid(pi,2*pi);
匿名函數的數組
- 雖然大多數的 MATLAB 基本數據類型支持多維數組,但函數句柄必須是標()(單個元素)。可是能夠使用 元胞數組或結構體數組 存儲多個函數句柄。最多見的方式是使用元胞數組,例如
f = {@(x)x.^2;
@(y)y+10;
@(x,y)x.^2+y+10};
- 建立元胞數組時,記住 MATLAB 將空格解釋爲列分隔符。如上面的代碼所示,省略表達式中的空格,或將表達式括在圓括號中,例如
- 注意空格和括號
f = {@(x) (x.^2); @(y) (y + 10); @(x,y) (x.^2 + y + 10)};
- 使用花括號訪問元胞內容。例如,f{1} 返回第一個函數句柄。要執行該函數,請在花括號以後的圓括號中傳遞輸入值
x = 1;
y = 10;
f{1}(x)
f{2}(y)
f{3}(x,y)
ans =
1
ans =
20
ans =
21