1.函數句柄的創建
函數句柄(function handle)是MATLAB中的一類特殊的數據結構,它的地位類似於其它計算機語言里的函數對象(Javascript,Python),函數指針(C++),或者函數引用(Perl)。作用是將一個函數封裝成一個變量,使其能夠像其它變量一樣在程序的不同部分傳遞。
MATLAB中的函數句柄在調用時和普通函數沒有任何區別,下面展示幾種創建函數句柄的方式,最后通過函數句柄調用sin(pi)。
|
2.將函數句柄作為函數參數
函數對象的經典應用情境之一就是排序(Sorting),即為一列未知類型的數組提供自定義的排序規則。下面我將實現一個函數super_sort,接收兩個參數,第一個參數為待排序的數組,第二個參數是一個對原始數據的變換函數。super_sort能夠對原始數據按照變換后的結果進行排序,並返回排好序的原始數據。
|
測試腳本:
|
注意,與Perl或Python不同,這里提供的函數句柄並不用於元素間的比較,而是用於將數組內各個元素進行映射成待比較的值。
3.利用函數句柄進行畫圖
借助函數句柄,可以方便地畫出各類函數的圖像,這類繪圖函數往往以ez開頭,下面我將演示ezplot, ezsurf兩個函數。
|
|
|
4.利用函數句柄進行圖像的濾波
MATLAB提供了colfilt這一函數,該函數能將圖像分成獨立的子塊(局部處理),或者相互交疊的窗口(可實現二維卷積及中值濾波),並利用傳入的函數句柄對各個子塊進行處理。
函數原型為B = colfilt(A,[M N],BLOCK_TYPE,FUN),其中B是輸出圖像,A是輸入圖像,[M N]是圖像塊或窗口的長寬,BLOCK_TYPE參數決定是進行塊處理還是窗口滑動處理,FUN就是處理用的函數句柄,它只接收一個矩陣參數,這個矩陣的每一列都是拉長為列向量的子圖像,FUN一次可能要處理多個子圖像。
下面將實現利用colfilt對圖像進行5*5中值濾波,以及局部閾值化。
|
輸出圖像如下:
5.組合匿名函數實現更復雜的函數句柄
由於只能包含單行的表達式,匿名函數只能完成簡單的運算。但是如果把多個匿名函數結合,就能實現更強大的功能。
當函數sort作用於矩陣時,將各列分別排序,如果要實現提取排序后第K小的行,使用單個匿名函會遇到麻煩。因為
|
這樣的語法在MATLAB中是錯誤的,通過組合匿名函數,我們就能解決這一問題。
|
6.總結
函數句柄是函數的數據抽象,能夠作為其它函數的參數。善用它,將讓程序更加優雅並具有更強的靈活性。