matlab中關於函數句柄、feval函數以及inline函數的解析 (轉)


http://blog.sina.com.cn/s/blog_7bff755b010180l3.html

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM