http://blog.csdn.net/kevinhg/article/details/8861774
http://www.ilovematlab.cn/thread-30375-1-1.html
http://blog.sina.com.cn/s/blog_71fb42f70100uyfx.html
----------------------------------------------------------------------------------------------
這個是matlab里邊的匿名函數的標志。匿名函數的標准格式是:
fhandle=@(arglist)express
(1)express是一個matlab變量表達式,比如:x+x.^2,sin(x)等
(2)argilst是參數列表;
(3)符號@是matlab創建函數句柄的操作符,表示創建有輸入參數列表arglist和表達式express確定的函數句柄,並把這個函數句柄返回給變量fhandle,這樣,以后就可以通過fhandle來調用定義好的函數了。
如:
myfun=@(x)(x+x.^2)
------------------------------------------------------------------------------------------------------------------------------------------
覺得自己很少用函數句柄,但是經常遇到,所以在這里總結一下。
函數句柄:是包含了函數的路徑、函數名、類型以及可能存在的重載方法。
函數句柄必須通過專門的定義創建的,而一般的圖像的句柄是自動建立的。
創建函數句柄使用@或者str2func命令創建
[email=h_fun=@fun]h_fun=@fun[/email];
h_fun=str2func('fun');
比如說sin函數,[email=h_sin=@sin]h_sin=@sin[/email]; h_sin=str2func('sin');
執行sin函數 feval
feval('sin',pi/2)
ans =
1
那么使用函數句柄有什么好處呢?
1、提高運行速度。因為matlab對函數的調用每次都是要搜索所有的路徑,從set path中我們可以看到,路徑是非常的多的,所以如果一個函數在你的程序中需要經常用到的話,使用函數句柄,對你的速度會有提高的。
2、使用可以與變量一樣方便。比如說,我再這個目錄運行后,創建了本目錄的一個函數句柄,當我轉到其他的目錄下的時候,創建的函數句柄還是可以直接調用的,而不需要把那個函數文件拷貝過來。因為你創建的function handles中,已經包含了路徑,比如說我創建了一個fun
h_fun=str2func('rei');
可以用functions來查看這個function,結果果然已經包括了路徑。
——————————————————————————————————————————————————————————————————————
Matlab中的匿名函數的使用
在Matlab7.0以后的版本中,出現了一種新的函數類型–匿名函數,不但能夠完成原來版本中內聯函數(inline)的功能,還提供了其他更方便的功能。Matlab首席科學家Moler教授都推薦用匿名函數替代原來的內聯函數。我最近學習了一些有關匿名函數的內容,現在總結一下:
1,匿名函數的基本用法。
handle = @(arglist)anonymous_function
其中handle為調用匿名函數時使用的名字。arglist為匿名函數的輸入參數,可以是一個,也可以是多個,用逗號分隔。anonymous_function為匿名函數的表達式。舉個例子如下:
>> f=@(x,y)x^2+y^2;
>> f(1,2) ans = 5
當然輸入的是數組也是可以的:
>> f=@(x,y)x.^2+y.^2; %注意需要點(.)運算 >> a=1:1:10; >> b=10:-1:1; >> f(a,b) ans = 101 85 73 65 61 61 65 73 85 101
匿名函數的表達式中也可以有參數的傳遞,比如:
>> a=1:5;
>> b=5:-1:1;
>> c=0.1:0.1:0.5;
>> f=@(x,y)x.^2+y.^2+c;
>> f(a,b) ans = 26.1000 20.2000 18.3000 20.4000 26.5000
c作為表達式中的參數,進行了數據傳遞。上面都是單重匿名函數,也可以構造多重匿名函數,如:
>> f=@(x,y)@(a) x^2+y^+a;
>> f1=f(2,3) f1 = @(a)x^2+y^+a
>> f2=f1(4) f2 = 85
每個@后的參數從它后面開始起作用,一直到表達式的最后。
2.使用匿名函數實現符號函數的賦值運算
在老版本的Matlab中,這個功能是由inline函數完成的,現在用匿名函數完成此功能。比如:知道z=2x^3+4x+5,求z在x=3處的2階導數值。可以先用符號函數算出z的2階導數的表達式,然后通過匿名函數,把x賦予3的值,得到最后結果:
>> syms x; %定義符號變量
>> z=2*x^3+4*x+5; %定義表達式
>> z1=diff(z,2) %求z的2階導數的表達式 z1 = 12*x
>> z2=eval_r(['@(x)' vectorize(z1)]); %vectorize函數的功能是使內聯函 %數適合數組運算的法則
>> z2(3) ans = 36
functions(h_fun)
ans =
function: 'rei'
type: 'simple'
file: 'G:\program\serial232\rei.m'