1. 程式人生 > >Matlab中寫M檔案及呼叫

Matlab中寫M檔案及呼叫

1題、自然數n的階乘
function y=lilu_fact(n)
n=floor(n);%如果是小數,向下取整至整數
y=1; 
if n>1  %這裡負數,0的階乘都將得到1
    for i=1:n
        y=y*i;
    end
end
2題、n中取m的組合
function y=lilu_cnm(n,m)
y=1;
if (n>=m && n>=0 & m>=0)
    m=min(n-m,m);
    for i=1:m
        y=y*(n-i+1)/i;
    end
end
3題、已知任意兩個多項式(不一定同階)的係數,求兩個多項式的和
function y=lilu_polyadd(x1,x2)
%多項式低次放在最前面,升序排列
%比如x1=[1,2,3]代表1+2*x+3*x^2
n1=length(x1);
n2=length(x2);
n=min(n1,n2);
y=[];
for i=1:n
    y=[y,x1(i)+x2(i)];
end
if (n==n1)
    for i=n+1:n2
        y=[y,x2(i)];
    end
else
    for i=n+1:n1
        y=[y,x1(i)];
    end
end
M檔案程式設計
MATLAB 作為一種應用廣泛的科學計算軟體,不僅可以通過直接互動的指令和操作方式進行強大的數值計算、繪圖等,還可以像 C、C++ 等高階程式語言一樣,根據自己的語法規則來進行程式設計。編寫的程式檔案以 .m 作為副檔名,稱之為M檔案。通過編寫M檔案,使用者可以像編寫批處理命令一樣,將多個MATLAB命令集中在一個檔案中,既能方便地進行呼叫,又便於修改;還可以根據使用者自身的情況,編寫用於解決特定問題的M檔案,這樣就實現了結構化程式設計,並降低程式碼重用率。實際上,MATLAB 自帶的許多函式就是M函式檔案。MATLAB 提供的編輯器可以使使用者方便地進行M檔案的編寫

M檔案通用格式及分類
簡單地說,M檔案就是使用者把要實現的命令寫在一個以 .m作為副檔名的檔案中,然後由MATLAB系統進行解釋,執行出結果,實際上M檔案是一個命令集,因此,MATLAB具有強大的可開發性與可擴充套件性。MATLAB中的許多函式本身都是由M檔案擴充套件而成的,而使用者也可以利用M檔案來生成和擴充自己的函式庫。
下面給出一個M檔案的程式碼,簡單介紹M檔案的基本組成部分。
function f = fact(n)                               % 函式定義行
% FACT Factorial.                             %  H1行
% FACT (N) returns the factorial of N,H!         % 幫助檔案文字
% usually denoted by N!
% Put simply ,FACT(N) is PROD(1,N).
f = prod(1,n);                                    % 函式體
M 檔案由以下四部分組成。
●函式定義行:定義了函式的名稱、輸入/輸出變數的數目和順序。
●幫助資訊行:代表幫助檔案的第一行,即代表了幫助檔案的簡要資訊。
●幫助檔案文字:當一個函式使用幫助命令時,MATLAB 將會形成幫助資訊行和幫助檔案文字。
●函式體:函式功能的實現部分,用於實際計算、功能實現和對輸出變數進行賦值。
M 檔案有兩種型別:M 指令碼檔案(M-Script)和M 函式檔案(M-Function)。它們的副檔名相同,都是“.m”。M 指令碼檔案中包含一組有MATLAB語言所支援的語句,類似於 DOS 下的批處理檔案。執行方式也非常簡單,使用者只需要在MATLAB的提示符下輸入該M檔案的檔名,MATLAB 就會自動執行該M檔案的各條語句,並將結果直接返回到MATLAB的工作空間。在執行過程中產生的所有變數都是全域性變數。

指令碼檔案與函式檔案的區別在於指令碼檔案沒有函式定義行,且一般沒有註釋資訊,當然也可以添加註釋資訊,即以 % 開頭的內容。在使用方法、變數生存週期中也存在差異,如表1-8所示。
指令碼檔案與函式檔案的區別
比較 項 目
M指令碼檔案
M函式檔案
輸入/輸出引數
不接收輸入引數,也不返回輸出引數
接收輸入引數,也可以返回引數
變數情況
處理工作空間中的變數
預設內部變數為區域性變數,工作區間不能訪問
適用情況
常用於需多次執行的一系列命令
常用於需多次執行且需要輸入/輸出引數的命令集合,常作為MATLAB應用程式的擴充套件程式設計使用
指令碼檔案和函式檔案適用於不同的情況,有時需要把指令碼檔案轉換為函式檔案。轉換方法實際上非常簡單,只需要在指令碼檔案前面新增必要的函式定義行和註釋資訊(可以省略)即可。
M檔案編輯器
        M檔案的編輯和除錯是在 MATLAB的M檔案編輯器(M-fileEditor)中進行的,若需要對M檔案進行除錯,還需要 MATLAB執行環境的支援,該編輯器既為基本文字檔案的編輯提供了圖形使用者介面,又可以用於其他文字檔案的編輯,同時還可以進行M檔案的除錯工作。
可以在下面的情況下啟動M檔案編輯器。
●建立一個新的M檔案時,可以啟動M檔案編輯器,方法是:File→ New → M- File。
●使用編輯器/偵錯程式開啟一個已經存在的M檔案。
●不啟動 MATLAB,只打開編輯器,由於這個時候沒有MATLAB環境的支援,不能對M檔案進行除錯。
M函式檔案
M函式檔案與M指令碼檔案是不同的,它可以接收輸入變數,也可以返回輸出變數,接下來看一個簡單的M函式檔案的例子:
Function y = ave(x)
% AVERAGE Mean of vector elements.
% AVERAGE(X), where X is a vector, is themean of vector elements.
% Nonvector input results in an error .
[m,n]=size(x);
if (~((m==1)|(n==1))|(m==1& n==1))
 error(‘input must be a bector’)
end
y = sum (x)/length(x);
該函式以檔名ave.m儲存,用於計算一個向量中所有元素的平均值,有一個輸入變數和一個輸出變數。執行該函式可以通過執行以下操作:
>> a=1:2:100;
>> ave(a)
可以得到計算向量a的平均值的結果:
ans =
   50
M函式檔案的組成部分
一個M函式檔案由以下幾部分組成:
●函式定義行
●函式資訊行
●幫助檔案文字
●函式體
●註釋行
(1) 函式定義行:定義了函式名稱、輸入和輸出變數資訊。函式名以字母開頭,由數字、字母或下劃線組成。為了便於程式碼在不同平臺間轉移,一般使用小寫字母。呼叫該函式檔案只需要在命令列輸入函式名即可。若函式有多個輸出變數,則用中括號將他們括起來,若有多個輸入變數則使用小括號將他們括起來。
Function [x, y, z]=sphere(theta, phi, rho)
如果沒有變數輸出,則將輸出部分省去或者使用空的中括號。
(2) 函式資訊行:又稱為H1行,是緊跟在函式定義行後的一個註釋行,以百分號開頭。
% AVERAGE Mean of vector elements.
H1行用於指示當前函式的功能,代表了幫助檔案的簡要資訊。當用戶使用help命令來檢視函式時,H1行和幫助文字就會顯示出來。
(3) 函式體:M檔案的主體部分,由一系列MATLAB命令組成,通過它實現函式的功能。
(4) 註釋行:在函式體中起解釋作用,也以百分號開頭。
編寫M檔案需要注意的問題
在編寫M檔案時,應當注重M檔案的正確性、規範性和通用性。
(1) 函式名和函式檔名必須相同。例如,函式avg就儲存在avg.m檔案中。
(2) 變數的名字最好能夠反映它們的意義,這一點對於一般語言程式設計都是適用的。
(3) 結構體的命名應該以一個大寫字母開頭,幫助區別結構體和普通變數。
(4) MATLAB第一次執行一個M檔案時,將開啟相應的文字檔案並將命令編輯成儲存器的內部表示,以加速執行以後的呼叫。如果函式包含了對其他M檔案函式的呼叫,它們也將同樣被編譯到儲存器中。普通的指令碼M檔案不被編譯,即使它們是從函式M檔案呼叫;每次開啟指令碼M 檔案時,都逐行進行註釋。
(5) MATLAB採用結構化的程式設計。編寫一個大型的程式時,最好將它劃分為一些小的模組,通常採用函式的方式,以增強程式的可讀性和可測試性。
(6) MATLAB支援函式間的相互呼叫。M檔案可以包含兩個以上的函式,其中第一個函式為主函式,其他的為子函式,子函式的順序可以任意排列。呼叫子函式只需要通過M函式檔案的名字即可,子函式只能被本檔案中的主函式和其他子函式呼叫。
(7) 自己編寫的函式最好在編寫時就添加註釋,包括輸入和輸出引數、解釋用法以及可能需要的改進等資訊,以增強函式的可讀性和可用性。
(8) 函式可以沒有輸入和輸出引數,也可以具有一個或多個輸入和輸出引數。
(9) 函式可以按少於規定的輸入和輸出變數進行呼叫,但不能多於函式所規定的輸入和輸出變數數目。如果呼叫時輸入和輸出變數數目多於函式M檔案中所規定的數目,則會返回一個錯誤資訊。
(10) 函式有自己的專用工作區,它與MATLAB的工作空間是分開的。函式內變數與MATLAB工作空間唯一的聯絡是函式的輸入和輸出變數。如果函式的任意一個輸入變數值發生變化,則其變化僅在函式內出現,不影響MATLAB工作空間的變數。函式內所建立的變數只駐留在函式的工作空間,而且只在函式執行期間臨時存在,以後就消失了。因此,從一個呼叫到下一個呼叫,在函式工作空間儲存資訊是不可能的,然而使用全域性變數就可以。
(11) 如果變數說明是全域性變數,函式可以與其他函式、MATLAB工作空間和遞迴呼叫本身共享變數。為了在函式內或MATLAB工作空間中訪問全域性變數,在每一個所希望的工作空間,變數必須說明是全域性的。但是在實際程式設計時應儘量避免使用全域性變數,因為在函式中的全域性變數,在定義該變數函式或工作空間內都可被改變,所以可能會得到與預期不同的結果,或者是毫無意義的結果。如果確實需要用全域性變數,建議全域性變數要長,可包含所有的大寫字母,並有選擇地以首次出現的 M檔案的名字開頭,將全域性變數之間不必要的相互作用減至最小。
(12) 函式可以遞迴呼叫,也就是說,M函式檔案可以呼叫它們本身,也可以呼叫指令碼檔案。函式每呼叫一次指令碼檔案,指令碼檔案就被開啟和解釋一次,這樣對函式的執行會略有減慢。