浅析MATLAB中的内联函数、匿名函数和函数函数
內聯函數
???????內聯(inline)函數是MATLAB 7以前經常使用的一種構造函數對象的方法。在命令窗口、程序或函數中創建局部函數時,通過使用inline構造函數,而不用將其儲存為一個M文件,同時又可以像使用一般函數那樣調用它。
MATLAB中的內聯函數借鑒了C語言中的內聯函數,在C語言中,內聯函數是通過編譯器控制來實現的,它只在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的時間和空間開銷。在MATLAB中也有類似的性質。由于內聯函數是儲存于內存中而不是在M文件中,省去了文件訪問的時間,加快了程序的運行效率。
雖然內聯函數有M文件不具備的一些優勢,但是由于內聯函數的使用,也會受到一些制約。首先,不能在內聯函數中調用另一個inline函數;另外,只能由一個MATLAB表達式組成,并且只能返回一個變量。
創建一個內聯函數非常簡單,就是使用inline方法,例如:
>> f=inline('t^2-3*t-4')
f =
?????Inline function:
?????f(t) = t^2-3*t-4
MATLAB會通過檢查字符串來推斷自變量,例如上面的函數中t就是自變量,如果沒有找到,將會使用x作為缺省的自變量,例如常數函數:
>> g=inline('3')
g =
?????Inline function:
?????g(x) = 3
另外,對于inline也支持多元函數:
>> h=inline('x+y')
h =
?????Inline function:
?????h(x,y) = x+y
這種創建方法等價于以下方法:
>> h=inline('x+y','x','y')
這種方式顯式地指定了參數列表。
使用內聯函數也很簡單,如同手寫一般,以f(t) = t^2-3*t-4為例,分別計算在t=2和t=4時的函數值:
>> f(2)
ans =
????-6
>> f(4)
ans =
?????0
對于多元函數類似。
匿名函數
???????匿名函數(anonymous function)是MATLAB 7.0版提出的一種全新的函數描述形式,和內聯函數類似,可以讓用戶編寫簡單的函數而不需要創建M文件,因此,匿名函數具有inline函數的所有優點,并且效率比inline函數高,同時還具有一些獨有的特點。
???????事實上匿名函數很像C語言中的宏,這個從匿名函數的構造就能夠看得出來,但是它比宏的功能更加強大,就是可以支持變量替換,這將在后面的示例中有所體現。
定義一個匿名函數很簡單,語法是fhandle=@(arglist) expression
其中fhandle就是調用該函數的函數句柄(function handle),相當于C語言中的函數指針,arglist是參數列表,多個參數使用逗號分隔,Expression則是該函數的表達式,例如定義x和y的平方和函數:
>> f=@(x,y) x*x+y*y
f =
????@(x,y)x*x+y*y
一旦定義了匿名函數,使用方式和inline函數類似,例如計算f(3,4):
>> f(3,4)
ans =
????25
前面提到,匿名函數可以使用工作空間的變量,例如創建函數f(x,y)=x^2+y^3:
>> p=2;
>> q=3;
>> f=@(x,y) x^p+y^q
f =
????@(x,y)x^p+y^q
計算f(2,3):
>> f(2,3)
ans =
????31
如果修改p或者q的值,例如將q改為2:
q =
?????2
>> f(2,3)
ans =
????31
計算結果并沒有改變,這是因為,該函數句柄保存的是函數在創建時的快照,而不是動態的訪問其中的變量,如果希望獲取新值,需要重新創建一次該函數,完整的方法應該是這樣的:
>> q=2;
>> f=@(x,y) x^p+y^q
f =
????@(x,y)x^p+y^q
>> f(2,3)
ans =
????13
匿名函數會讓前面的內聯函數逐步退出MATLAB的舞臺,事實上在設計這種類型的函數時就帶有這一目的,但是為了保持程序的向下兼容,使用內聯函數無疑將帶來更好的兼容性。
函數函數
???????函數函數(function function)是對傳入的其他函數進行操作的函數,傳入的函數作為函數函數的輸入參數,傳入到函數函數中的函數稱為傳遞函數(Passed function),事實上MATLAB中就有許多這樣的函數,例如求解常微分方程的函數ode23、ode45、ode113等都是函數函數,他們的第一個參數都是傳遞函數。另外一個常見的函數函數是fplot,用于繪制所提供函數的圖形,語法為fplot(fun,lims)
例如繪制x取值范圍為[-π,π]上f=sin(x)的圖形:
>> fplot(@sin,[-pi,pi])
???????圖形如下:
?和前面兩種函數不同,函數函數是比較復雜的函數了,因此必須要保存在M文件中,例如可以編寫一個計算某個傳遞函數在給定區間上最大值、最小值和平均值的函數函數:
function [maxy,miny,aver]=fstatic(func,a,b,n)
????x=linspace(a,b,n);
????y=func(x);
????maxy=max(y);
????miny=min(y);
????aver=mean(y);
end
保存為M文件后,例如統計正弦函數在[-π,π]上的最大值、最小值和平均值:
>> fstatic(@sin,-pi,pi,100)
ans =
????0.9999
>> [max min aver]=fstatic(@sin,-pi,pi,1000)
max =
????1.0000
min =
???-1.0000
aver =
?-5.9291e-018
總結
以上是生活随笔為你收集整理的浅析MATLAB中的内联函数、匿名函数和函数函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更改matlab默认启动路径
- 下一篇: Matlab元胞数组操作