-
1 # 收拾殘局陳
-
2 # 快意江湖679
1.函數句柄的創建
函數句柄(function handle)是MATLAB中的一類特殊的數據結構,它的地位類似於其它計算機語言裡的函數對象(Javascript,Python),函數指針(C++),或者函數引用(Perl)。作用是將一個函數封裝成一個變量,使其能夠像其它變量一樣在程序的不同部分傳遞。
MATLAB中的函數句柄在調用時和普通函數沒有任何區別,下面展示幾種創建函數句柄的方式,最後通過函數句柄調用sin(pi)。
% 函數句柄的創建% 方式1 : 直接加@% 語法:@函數名fun1 = @sin;% 方式2 : str2func函數% 語法:str2fun('函數名')fun2 = str2func('cos');% 方式3 : 匿名函數% 語法:@(參數列表)單行表達式fun3 = @(x, y)x.^2 + y.^2; % 函數句柄的調用fun1(pi);
2.將函數句柄作為函數參數
函數對象的經典應用情境之一就是排序(Sorting),即為一列未知類型的數組提供自定義的排序規則。下面我將實現一個函數super_sort,接收兩個參數,第一個參數為待排序的數組,第二個參數是一個對原始數據的變換函數。super_sort能夠對原始數據按照變換後的結果進行排序,並返回排好序的原始數據。
%文件名:super_sort.mfunction sorted = super_sort(arr, fh)transformed = fh(arr);% 對原始數組進行變換[~, index] = sort(transformed); % 獲得排序後的原數組位置索引sorted = arr(index); % 返回排序後的原數組end
測試腳本:
arr = round(randn(8, 1) * 10);super_sort(arr, @abs)
% 將arr按照其絕對值大小排序super_sort(arr, @sin)
% 將arr按照sin(x)的結果排序
注意,與Perl或Python不同,這裡提供的函數句柄並不用於元素間的比較,而是用於將數組內各個元素進行映射成待比較的值。
3.利用函數句柄進行畫圖
借助函數句柄,可以方便地畫出各類函數的圖像,這類繪圖函數往往以ez開頭,下面我將演示ezplot, ezsurf兩個函數。
% ezplot畫sin函數在[0, 2 * pi]內的曲線ezplot(@sin, [0, 2 * pi]);
% ezplot利用x和y上的參數方程畫心形線xfun = @(t)3*(2*cos(t)-cos(2*t));yfun = @(t)3*(2*sin(t)-sin(2*t));ezplot(xfun, yfun);
% ezsurf畫二次曲面fun3 = @(x,y)x.^2+y.^2;ezsurf(fun3, [-2, 2, -2, 2]);
4.利用函數句柄進行圖像的濾波
MATLAB提供了colfilt這一函數,該函數能將圖像分成獨立的子塊(局部處理),或者相互交疊的窗口(可實現二維卷積及中值濾波),並利用傳入的函數句柄對各個子塊進行處理。
函數原型為B = colfilt(A,[M N],BLOCK_TYPE,FUN),其中B是輸出圖像,A是輸入圖像,[M N]是圖像塊或窗口的長寬,BLOCK_TYPE參數決定是進行塊處理還是窗口滑動處理,FUN就是處理用的函數句柄,它只接收一個矩陣參數,這個矩陣的每一列都是拉長為列向量的子圖像,FUN一次可能要處理多個子圖像。
回覆列表
1、讀入 列數 和 行數均一致的數據 可是直接用 load filename 或者load('filename');或者s=load('filename');如果filename 中為純數據,則直接讀入到一個矩陣中。
2、importdata函數可讀入數據(可以是文件,也可以是系統粘貼板上的內容),對於行列數不一致的按照第一行的列數對其,其餘的NaN補齊,以矩陣方式儲存。
a=inportdata(__,delimiterIn,headerlinesIn);指定數據的分割方式和跳過指定的行數進行讀數據,不過該方式將以cell的方式儲存。
3、csvread函數專門針對數據中間以“,”隔開的文件。利用R1(行,以0開始,列也一樣 ),C1(列)可以指定開始讀入數據的位置,與R2,C2配合使用可以指定讀入數據的範圍。 4、dlmread函數可以讀取“ASCII-分隔符”的數據文件,用法與csvrad類似。