matlab的腳本和函數

腳本和函數
概述
MATLAB? 產品提供了一個強大的編程語言和交互式計算環境 。您可以使用此語言在 MATLAB 命令行中一次輸入一個命令 , 也可以向某個文件寫入一系列命令,按照執行任何 MATLAB 函數的相同方式來執行這些命令 。使用 MATLAB 編輯器或任何其他文件編輯器可以創建您自己的函數文件 。按照調用任何其他 MATLAB 函數或命令的相同方式來調用這些函數 。
兩種程序文件:

  • 腳本,不接受輸入參數或返回輸出參數 。它們處理工作區中的數據 。
  • 函數,可接受輸入參數 , 并返回輸出參數 。內部變量是函數的局部變量 。
如果您是新 MATLAB 程序員,您只需在當前文件夾中創建您希望嘗試的程序文件 。當您創建的文件越來越多時,您可能希望將這些文件組織到其他文件夾和個人工具箱 , 以便將其添加到您的 MATLAB 搜索路徑中 。
如果您復制多個函數名稱,MATLAB 會執行在搜索路徑中顯示的第一個函數 。
要查看程序文件(例如,myfunction.m)的內容,請使用
type myfunction【matlab的腳本和函數】腳本
當調用腳本時 , MATLAB 僅執行在文件中找到的命令 。腳本可以處理工作區中的現有數據,也可以創建要在其中運行腳本的新數據 。盡管腳本不會返回輸出參數 , 其創建的任何變量都會保留在工作區中,以便在后續計算中使用 。此外,腳本可以使用 plot 等函數生成圖形輸出 。
例如 , 創建一個名為 magicrank.m 的文件 , 該文件包含下列 MATLAB 命令:
% Investigate the rank of magic squaresr = zeros(1,32);for n = 3:32r(n) = rank(magic(n));endrbar(r)鍵入語句
magicrank使 MATLAB 執行命令、計算前 30 個幻方矩陣的秩,并繪制結果的條形圖 。執行完文件之后,變量 nr 將保留在工作區中 。
matlab的腳本和函數

文章插圖
函數
函數是可接受輸入參數并返回輸出參數的文件 。文件名和函數名稱應當相同 。函數處理其自己的工作區中的變量 , 此工作區不同于您在 MATLAB 命令提示符下訪問的工作區 。
rank 提供了一個很好的示例 。文件 rank.m 位于文件夾
toolbox/matlab/matfun您可以使用以下命令查看文件
type rank下面列出了此文件:
function r = rank(A,tol)% RANK Matrix rank.% RANK(A) provides an estimate of the number of linearly% independent rows or columns of a matrix A.% RANK(A,tol) is the number of singular values of A% that are larger than tol.% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.s = svd(A);if nargin==1tol = max(size(A)') * max(s) * eps;endr = sum(s > tol);函數的第一行以關鍵字 function 開頭 。它提供函數名稱和參數順序 。本示例中具有兩個輸入參數和一個輸出參數 。
第一個空行或可執行行前面的后續幾個行是提供幫助文本的注釋行 。當鍵入以下命令時 , 會輸出這些行
help rank幫助文本的第一行是 H1 行 , 當對文件夾使用 lookfor 命令或請求 help 時,MATLAB 會顯示此行 。
文件的其余部分是用于定義函數的可執行 MATLAB 代碼 。函數體中引入的變量 s 以及第一行中的變量(即 rAtol)均為函數的局部變量;他們不同于 MATLAB 工作區中的任何變量 。
本示例演示了 MATLAB 函數不同于其他編程語言函數的一個方面,即可變數目的參數 。可以采用多種不同方法使用 rank 函數:
rank(A)r = rank(A)r = rank(A,1.e-6)許多函數都按此方式運行 。如果未提供輸出參數,結果會存儲在 ans 中 。如果未提供第二個輸入參數,此函數會運用默認值進行計算 。函數體中提供了兩個名為 narginnargout 的數量 , 用于告知與函數的每次特定使用相關的輸入和輸出參數的數目 。rank 函數使用 nargin,而不需要使用 nargout 。
函數類型
MATLAB 提供了多種不同函數用于編程 。
匿名函數
匿名函數是一種簡單形式的 MATLAB 函數,該函數在一個 MATLAB 語句中定義 。它包含一個 MATLAB 表達式和任意數目的輸入和輸出參數 。您可以直接在 MATLAB 命令行中定義匿名函數,也可以在函數或腳本中定義匿名函數 。這樣,您可以快速創建簡單函數,而不必每次為函數創建文件 。
根據表達式創建匿名函數的語法為
f = @(arglist)expression下面的語句創建一個求某個數字的平方的匿名函數 。當調用此函數時 , MATLAB 會將您傳入的值賦值給變量 x,然后在方程 x.^2中使用 x
sqr = @(x) x.^2;要執行上面定義的 sqr 函數,請鍵入
a = sqr(5)a =25主函數和子函數
任何非匿名函數必須在文件中定義 。每個此類函數文件都包含一個必需的主函數(最先顯示)和任意數目的子函數(位于主函數后面) 。主函數的域比子函數的域更廣 。因此 , 主函數可以從定義這些函數的文件外(例如,從 MATLAB 命令行或從其他文件的函數中)調用,而子函數則沒有此功能 。子函數僅對其自己的文件中的主函數和其他子函數可見 。
函數部分中顯示的 rank 函數就是一個主函數的示例 。
私有函數
私有函數是一種主函數 。其特有的特征是:僅對一組有限的其他函數可見 。如果您希望限制對某個函數的訪問,或者當您選擇不公開某個函數的實現時,此種函數非常有用 。
私有函數位于帶專有名稱 private 的子文件夾中 。它們是僅可在母文件夾中可見的函數 。例如,假定文件夾 newmath 位于 MATLAB 搜索路徑中 。newmath 的名為 private 子文件夾可包含只能供 newmath 中的函數調用的特定函數 。
由于私有函數在父文件夾外部不可見,因此可以使用與其他文件夾中的函數相同的名稱 。如果您希望創建您自己的特定函數的版本,并在其他文件夾中保留原始函數,此功能非常有用 。由于 MATLAB 在標準函數之前搜索私有函數 , 因此在查找名為 test.m的非私有文件之前,它將查找名為 test.m 的私有函數 。
嵌套函數
您可以在函數體中定義其他函數 。這些函數稱為外部函數中的嵌套函數 。嵌套函數包含任何其他函數的任何或所有組成部分 。在本示例中,函數 B 嵌套在函數 A 中:
function x = A(p1, p2)...B(p2)function y = B(p3)...end...end與其他函數一樣,嵌套函數具有其自己的工作區,可用于存儲函數所使用的變量 。但是,它還可以訪問其嵌套在的所有函數的工作區 。因此,舉例來說,主函數賦值的變量可以由嵌套在主函數中的任意級別的函數讀取或被覆蓋 。類似地,嵌套函數中賦值的變量可以由包含該函數的任何函數讀取或被覆蓋 。
全局變量
如果您想要多個函數共享一個變量副本,只需在所有函數中將此變量聲明為 global 。如果您想要基礎工作區訪問此變量,請在命令行中執行相同操作 。全局聲明必須在函數中實際使用變量之前進行 。全局變量名稱使用大寫字母有助于將其與其他變量區分開來,但這不是必需的 。例如,在名為 falling.m 的文件創建一個新函數:
function h = falling(t)global GRAVITYh = 1/2*GRAVITY*t.^2;然后,以交互方式輸入語句
global GRAVITYGRAVITY = 32;y = falling((0:.1:5)');通過上述兩條全局語句,可以在函數內使用在命令提示符下賦值給 GRAVITY 的值 。然后,您可以按交互方式修改 GRAVITY 并獲取新解,而不必編輯任何文件 。
命令與函數語法
您可以編寫接受字符參數的 MATLAB 函數,而不必使用括號和引號 。也就是說,MATLAB 將
foo a b c解釋為
foo('a','b','c')但是,當使用不帶引號的命令格式時,MATLAB 無法返回輸出參數 。例如,
legend apples oranges使用 applesoranges 作為標簽在繪圖上創建圖例 。如果您想要 legend 命令返回其輸出參數,必須使用帶引號的格式:
[legh,objh] = legend('apples','oranges');此外 , 如果其中任一參數不是字符向量 , 必須使用帶引號的格式 。
小心
雖然不帶引號的命令語法非常方便 , 但在某些情況下可能會出現使用不當的情形,而 MATLAB 并不會產生錯誤信息 。
在代碼中構造字符參數
帶引號的函數格式可用于在代碼中構造字符參數 。下面的示例處理多個數據文件,即 August1.dat、August2.dat 等 。它使用函數 int2str,該函數將整數轉換為字符以便生成文件名:
for d = 1:31s = ['August' int2str(d) '.dat'];load(s)% Code to process the contents of the d-th fileend