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