MATLAB自定义函数

第六章 自訂函數

 

6.1敘述檔與函數檔


MATLAB依執行時之實質型式分為兩種,其一為前面所述之敘述檔( script files),另一為函數檔(function files);兩者均可在指令窗中呼叫。但敘述檔中,使用者可將檔案內所含的指令一一地在指令窗下執行,其執行過程中,所發生的變數均為整體性變數。因此執行敘述檔時,只能呼叫其檔案名稱,不能在名稱後面加上任何輸入參數。若要事先設定一些參數初值,辦法之一是執行之初立即設定,例如在工作空間內更動其中之變數值,然後再執行該指令。其二是在檔案中利用指令讀取特定檔案之資料或由鍵盤輸入資料。由鍵盤輸入指令可以累積成為指令之組合,並給予指令群之名稱,此名稱因而亦可作為指令在指令窗中直接執行。例如,有一個敘述檔之名稱為 pick_a _number.m,則在 MATLAB 指令窗中直接鍵入"pick_a _number"即可執行該檔案之內容。


% pick_a_number.m, a script file for demonstration.
% Pick up a number that equals to the randomly generated one
%
message='Please pick a number from 0-9 ==> ';
n=1;
while 1
A=input(message);
if isempty(A), A=0; end;
pick=fix(rand*10);
if A==pick,
disp('Congradulations, it''s done!')
break
else
disp(['The random number is ', num2str(pick),...
'. You have failed ',num2str(n),' times!'])
n=n+1;
end
end


執行的結果如下:

>> pick_a_number
Please pick a number from 0-9 ==> 2
The random number is 6. You have failed 1 times!
Please pick a number from 0-9 ==> 3
The random number is 2. You have failed 2 times!
Please pick a number from 0-9 ==> 4
Congradulations, it's done!


上述的程式為一個敘述檔,其內容為讀者自訂一個數字,由程式隨機產生一個數字,直到兩個數字相同為止。此程式使用無窮迴圈while 1,…end,故除非答對,才利用break中斷跳出,否則會繼續進行。有關迴圈指令,將在另節詳加討論。

在敘述檔中之變數是整體性(global) 的,也是共用的 ,故任何先前定義的變數,均可為敘述檔執行時所用,或改變其內容,所以它不需考慮輸入及輸出之問題。敘述檔用於必須重覆多次使用一群指令時最為方便。

函數檔案的內容與敘述檔大略相同,但其檔案可以作為MATLAB語言之一部份,可有輸入及輸出,且其變數的空間是自主的,不與公共空間共用。在型式上函數檔案之開頭一行需有一個函數名稱之宣告,然後用小括符包括其需要之輸入參數。函數名稱前可以有等號,在此等號之左方為其輸出之參數。等號之右方為函數名稱,其後有輸入參數。這些參數變數,無論是輸入或輸出,均可能代表一個數值或一個矩陣。在其他程式語言中,矩陣之變數均需經過宣告,在MATLAB的世界裡,可以省去此項運作,但若屬於大矩陣,事先安排矩陣空間,對提高運算效率有相當的助益。輸出入之參數中,均會預設為矩陣的型式。在函數檔案中,其所屬之變數均屬區域性的,除非特別另宣告為整體性參數。相關的函數特性等後段再作論述。

函數檔案之類型純為文字檔,故可在任何文書處理軟體中編輯或修改。不過,MATLAB也有一個程式編輯器,可以在此編輯器中偵錯(Debug)或編輯,這個編輯器比其他文書處理具有特殊的功能,新版中並有行號。若不使用編輯器,也可以在指令窗中亦直接打入type之指令,以觀察該檔案之內容。

 

6.2 自訂函數之型式

在MATLAB中,可以輕而易舉地定義自己需要之函數,這點大大增強MATLAB之應用能力。一個自定的函數為一個M-檔案,其儲存名稱須與函數名稱相同,格式如下:

function [輸出變數]=Name_of_function(輸入參數)

函數的名稱需以英文字母開頭,中間可為數字或底線,但其間不能有+,-,*,/等字眼。函數名稱長度依一般檔案名稱之規定,但最多僅認定63個字,不過長度如此長也不盡實際。且其名稱不要與現有MATLAB內定的相同,通常可用isvarname這個函數先檢查。輸出及輸入參數可為多個,亦可為矩陣,但輸入參數必須用一般括號括起來,而輸出參數若僅有一項輸出,則不必用任何括號,若有兩項以上,則需用中括號括起來。下面為一個簡單的例子:


function y = freebody(time)
% calculation of height with respect to time
% time: the elapsed time in seconds
% y:the depth of falling, cm
% Example: yy=freebody(1:20)
y =1/2*980*time.*time;%y=(1/2)gt^2




這是一個計算自由落體的例子。freebody為函數之名稱,time為其輸入變數,可為矩陣或向量。這個函數以time=[0:4:20],即time=[0 4 8 12 16 20]代入,執行如下:


>> yy=freebody(0:4:20)

yy =

0 7840 31360 70560 125440 196000



特別注意的是四秒時,自由落體將降至78.4m;若為4.5秒時,約達100m。911時紐約世貿大樓幾乎是以這個自由落體的速度塌下來,沒有任何阻檔,所以一直是個謎。在函數內容中,其說明行之前以%開頭,其後面的資料程式即認為是說明,不加執行。依照慣例,函數除第一行外,其最開始不包括空行的幾行為說明行,但每行前面需加%符號。這個說明行主要在敘述該函數之功能及使用方法。當你使用help freebody查詢這個自設的函數指令時,會出現在其說明之內容。例如:


>> help freebody
time: the elapsed time in seconds
y:the depth of falling, cm
Example: yy=freebody(1:20)




程式本體則包括其他函數呼叫、程式結構流程及交談式輸出入、計算、設定指令、註解及空行等。註解可佔全行,亦可在敘述指令之前後。但其前面均需加上%。MATLAB發現有%存在時,其後面之敘述均視為註解。若說明行不需佔有全行,則亦可在指令後加%後,隨時作進一步的說明,其情況如下:


   y =1/2*980*time.*time; %y=(1/2)gt^2



若有多行的註解行,但不想每行使用%為開頭時,可以在註解之前後行加上%{及%},這兩個符號必須單獨佔行。此外,MATLAB亦不處理空行,所以為使程式容易閱讀,可以加空行。但在程式開頭的第一次空行會中斷help指令所顯示的內容。

函數中所用之變數若不在函數之參數行列出,則應屬區域性變數。若要成為整體性變數則需要特別宣告(如global x y)。下面為兩連桿相接之位置的計算,在此自訂函數two_vectors中,其輸入項為r 1,r 212,輸出為結果點B之位置(x, y)。程式中,另有自創變數d2r, th1, th2等,這些均為區域性變數,故在運算結束跳離函數之後,這些變數將與函數外之參數無關。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值