很久以前寫的一篇Matlab自定義函數訪問量很大,可惜沒有點贊的,我感覺是我沒講清楚,這里又寫了一篇筆記
Matlab函數
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Matlab提供了許多內建函數,比如disp()。但你也可以自己創建函數,這被叫做用戶自定義函數
>> disp('hello world')
hello world
總的來說,自定義函數分為兩步:即定義函數和調用函數。
定義一個函數
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
- 函數代碼塊以 function關鍵詞開頭,后接輸出變量和函數標識符名稱和圓括號 ()。
- 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以end結束。
函數需要定義在腳本文件(*.m)中運行,不可以在命令窗口中臨時創建。
語法
Matlab定義函數需要使用function關鍵字,一般格式如下:
function 輸出變量 = 函數名(輸入變量)
函數體
end
這里的輸入變量和輸出變量都可以根據實際情況缺省。
實例
創建一個函數,用來輸出“hello world!” ,步驟如下:
新建一個腳本,命名為eg1.m
test();
function test()
disp('hello world!')
end
點擊頂部菜單的運行按鈕,即可在命令窗口輸出:
>> eg1
hello world!
更復雜一點的應用,我們讓函數帶上輸入變量和輸出變量:
s = calc_area(4,5);
function s = calc_area(w,h)
s = w*h;
disp(['area=',num2str(s)]);
end
以上實例輸出:
>> eg2
area=20
輸入變量缺省
有時候,輸入變量的個數不確定,但是又想將不同個數情況統一到一個函數里,即輸入變量有缺省時,可以利用nargin
來判斷,然后給出對應的輸出。例如:
out(1)
out(1,2)
out(1,2,3)
function out(a,b,c)
if nargin == 1
disp(a)
elseif nargin == 2
disp([a,b])
elseif nargin == 3
disp([a,b,c])
end
end
上面的實例將會得到:
>> eg5
1
1 2
1 2 3
可以看到,當輸入不同輸入變量個數時,會找到對應個數下的執行代碼,返回相應的內容。
當然這種做法也存在弊端,當變量個數太多時,要寫很多個判斷;這種情況下可以嘗試inputParser
,這里我就不多解釋了,有興趣可以看這篇博文了解下。
函數調用
函數基本結構完成后,進行調用時,存在兩種方法:
- 直接在函數所在腳本文件內調用(上面的例子就是這種情況);
- 函數定義與調用分開,各自存為一個腳本,運行調用腳本。
法一:腳本內調用函數
如上圖所示,調用函數在前,定義函數在后,點運行即可得到輸出。
法二:函數腳本獨立,另外寫代碼調用
如上圖所示,函數腳本和調用函數的腳本分開了,保存在同一路徑下。
在第二種方法下,也可以在命令窗口直接調用所寫的函數:
這種調用與上面本質上是一樣的,都是首先找到以函數名命名的腳本文件,然后再執行函數內部代碼塊,返回結果。在這里必須注意函數腳本名字要與函數名一致。
事實上,為了讓編程變得系統化,模塊化,我們不建議你采用第一種方法去寫代碼,因為這樣不利於分析和維護代碼。
而采用后面一種方法時,我們可以定義很多個函數,然后在其他腳本里調用它們,這樣形成了一種模塊化的關系。我們在分析代碼時,注意力可以集中到主程序上,思路將更加清晰。
輸出值缺省調用
在matlab的函數中,可以選擇性地獲取所返回的變量列表值,下面給出實例:
default = out()
[a,~,~]= out()
[~,b,~] = out()
[~,~,c] = out()
function [a,b,c] = out()
a = 1;
b = 2;
c = 3;
end
上述實例輸出結果:
>> eg4
default =
1
a =
1
b =
2
c =
3
可以看到,函數默認以返回的第一個變量為輸出值;若想得到返回的某個值時,用變量接住,對於不需要的值,則需要用~
占位,但不接收這個值,這樣做的目的就是為了保證輸出的序號能夠匹配到。
小結
函數就是定義和調用,針對實際問題,分析出輸入、輸出變量,理清楚中間環節以什么樣的流程一步步轉換,這樣就可以順利完成自定義函數的編寫。
經過上面的學習,你應該掌握了基本的自定義函數的用法了。那么開始你的探索之旅吧,以代碼為筆,勾畫出腦海中的想法,讓它變成現實!