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