matlab函数句柄介绍
問:f=@(x)acos(x)表示什么意思?其中@代表什么?
答:表示f為函數(shù)句柄,@是定義句柄的運(yùn)算符。f=@(x)acos(x)?相當(dāng)于建立了一個(gè)函數(shù)文件:
% f.m
function??y=f(x)
y=acos(x);
若有下列語句:xsqual=@(x)1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);
則相當(dāng)于建立了一個(gè)函數(shù)文件:
% xsqual.m
function y=xsqual(x)
y=1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);
詳細(xì)說明:
1、函數(shù)句柄/function_handle(@):是一種間接調(diào)用函數(shù)的方式。
2、語法:handle=@functionname??or?handle=@(arglist)anonymous_function
3、描述:函數(shù)句柄(function handle)是一種能夠提供函數(shù)間接調(diào)用的matlab value。你可以通過傳遞句柄來調(diào)用各種其他功能。你也可以將句柄存儲(chǔ)到數(shù)據(jù)結(jié)構(gòu)中備用(例如Handle Graphic?回調(diào))。句柄是matlab的標(biāo)準(zhǔn)數(shù)據(jù)類型之一。
??????當(dāng)創(chuàng)建句柄時(shí),你所指定的函數(shù)必須在matlab搜索路徑之中,并且必須在創(chuàng)建語句的scope之中。例如,只要在定義子函數(shù)的文件之中,你句可以為這個(gè)子函數(shù)創(chuàng)建句柄。這些條件不適用于evaluate函數(shù)句柄。例如,你可以在一個(gè)單獨(dú)(out-scope)通過句柄執(zhí)行一個(gè)子函數(shù),這要求句柄是在in-scope創(chuàng)建的。
???????handle=@(arglist)anonymous_function用來創(chuàng)建匿名函數(shù)(anonymous function)并返回該匿名函數(shù)的句柄。括號(hào)右邊的函數(shù)體是單個(gè)的matlab語句(statement)或者matlab命令。arglist是一個(gè)用逗號(hào)“,”分隔的輸入變量列表。該函數(shù)通過句柄handle執(zhí)行。
備注:函數(shù)句柄是標(biāo)準(zhǔn)的matlab數(shù)據(jù)類型。因此,你可以像matlab其他數(shù)據(jù)類型一樣進(jìn)行操作。
4、函數(shù)句柄的好處
???????①提高運(yùn)行速度。因?yàn)?/span>matlab對(duì)函數(shù)的調(diào)用每次都是要搜索所有的路徑,從set path中我們可以看到,路徑是非常的多的,所以如果一個(gè)函數(shù)在你的程序中需要經(jīng)常用到的話,使用函數(shù)句柄,對(duì)你的速度會(huì)有提高的。
???????②使用可以與變量一樣方便。比如說,我再這個(gè)目錄運(yùn)行后,創(chuàng)建了本目錄的一個(gè)函數(shù)句柄,當(dāng)我轉(zhuǎn)到其他的目錄下的時(shí)候,創(chuàng)建的函數(shù)句柄還是可以直接調(diào)用的,而不需要把那個(gè)函數(shù)文件拷貝過來。因?yàn)槟銊?chuàng)建的function handles中,已經(jīng)包含了路徑,
?
?
MATLAB函數(shù)句柄
函數(shù)句柄(Function handle)是MATLAB的一種數(shù)據(jù)類型。
包含了函數(shù)的路徑、函數(shù)名、類型以及可能存在的重載方法;
引入函數(shù)句柄是為了使feval及借助于它的泛函指令工作更可靠;使“函數(shù)調(diào)用”像“變量調(diào)用”一樣方便靈活;提高函數(shù)調(diào)用速度,特別在反復(fù)調(diào)用情況下更顯效率;提高軟件重用性,擴(kuò)大子函數(shù)和私用函數(shù)的可調(diào)用范圍;迅速獲得同名重載函數(shù)的位置、類型信息。
--------------------------------------
可以與變量一樣方便地使用:比如說,在現(xiàn)在這個(gè)目錄運(yùn)行時(shí),創(chuàng)建了本目錄一個(gè)函數(shù)的句柄,當(dāng)轉(zhuǎn)到其他目錄時(shí),可以通過函數(shù)句柄直接調(diào)用上一個(gè)目錄的函數(shù),而不需要把那個(gè)函數(shù)文件復(fù)制過來,因?yàn)閯?chuàng)建的函數(shù)句柄中已經(jīng)包含了路徑信息;
提高函數(shù)調(diào)用速度:因?yàn)?span style="word-wrap:normal; word-break:normal; line-height:21px">matlab對(duì)函數(shù)的調(diào)用每次都是要搜索所有的路徑,從set path中可以看到,路徑是非常的多的,所以如果一個(gè)函數(shù)在程序中需要經(jīng)常用到的話,使用函數(shù)句柄,對(duì)速度會(huì)有提高的;
--------------------------------------
MATLAB中函數(shù)句柄的使用使得函數(shù)也可以成為輸入變量,并且能很方便的調(diào)用,提高函數(shù)的可用性和獨(dú)立性。
函數(shù)句柄實(shí)際上提供了一種間接調(diào)用函數(shù)的方法。
創(chuàng)建函數(shù)句柄需要用到操作符@
創(chuàng)建函數(shù)句柄的語法:
fhandle = @function_filename
調(diào)用函數(shù)時(shí)就可以調(diào)用該句柄,可以實(shí)現(xiàn)同樣的功能。
例如fhandle = @sin就創(chuàng)建了sin的句柄,輸入fhandle(x)其實(shí)就是sin(x)的功能。
如
% % ------------------------------------------------
fhandle=@sin
fhandle(pi)
sin(pi)
% % ------------------------------------------------
例如:
新建M文件f1.m
function y=f1(X)
x1=X(1);x2=X(2);
y=x1^2+x1*x2;
新建M文件ftest.m
function Y=ftest(f,X)
syms x1 x2;
F=f([x1,x2]);
v=[x1,x2];
grad=jacobian(F,v);
Y=subs(grad,v,X);
在MATLAB命令窗口輸入Y=ftest(@f1,[2,1]),得到結(jié)果:
Y =
????5????2
此處@f1即為函數(shù)f1的句柄,可以用class(@f1)判斷變量的類型,得到ans = function_handle即函數(shù)句柄。函數(shù)ftest是求一個(gè)二維函數(shù)在指定點(diǎn)的梯度值。我們可以替換目標(biāo)函數(shù)為f2或其他函數(shù)同樣可以求得梯度。這樣函數(shù)ftest就可以適用于任何二維函數(shù)而不必做改動(dòng)了。
?
feval函數(shù)如何理解
feval函數(shù)的最通常的應(yīng)用是以下形式:
feval_r('functionname',parameter),舉個(gè)簡單的例子:
比如要計(jì)算sin(2),當(dāng)然可以直接用命令y=sin(2);利用feval,還可以這樣來做:
y=feval_r('sin',2);另外這里的函數(shù)名字還可以是一個(gè)函數(shù)句柄,即h=@sin;
y=feval_r(h,2);或者直接寫成y=feval_r(@sin,2);
?
內(nèi)聯(lián)函數(shù)(inline function)
inline函數(shù)不是函數(shù)句柄,?是另外一種類型,?它也可以用變量來表示函數(shù),?用法也和一般函數(shù),?函數(shù)句柄是一樣的.內(nèi)聯(lián)函數(shù)和普通的函數(shù)句柄,準(zhǔn)確說跟匿名函數(shù)比較類似,可以通過一個(gè)函數(shù)表達(dá)式近而得到該函數(shù)。
在matlab中創(chuàng)建局部函數(shù)時(shí),可用inline。優(yōu)點(diǎn)是不必將其儲(chǔ)存為一個(gè)單獨(dú)文件。在運(yùn)用中有幾點(diǎn)限制:不能調(diào)用另一個(gè)inline函數(shù),只能由一個(gè)matlab表達(dá)式組成,并且只能返回一個(gè)變量---顯然不允許[u,v]這種形式。因而,任何要求邏輯運(yùn)算或乘法運(yùn)算以求得最終結(jié)果的場合,都不能應(yīng)用inline。
語法格式如下:
1?變量名=inline(表達(dá)式);
2?變量名=inline('函數(shù)表達(dá)式', '變量名1','變量名2', ... ,'變量名n');(推薦)
例如:
a='x+y';
f=inline(a);
f(2,3)
ans =
????5
或者:
f=inline('x+y','x','y');
f(2,3)
ans =
????5
inline函數(shù)可以對(duì)某個(gè)變量調(diào)用數(shù)組,如:
Fofx=inline(‘x .^2*cos(a*x)-b’ , ‘x’,’a’,’b’);
g= Fofx([pi/3 pi/3.5],4,1)
系統(tǒng)輸出為:g=-1.5483 -1.7259
總結(jié)
以上是生活随笔為你收集整理的matlab函数句柄介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web前端小故事(浏览器大战)
- 下一篇: matlab人脸追踪,求大神帮助我这个菜