? ? ? ? 數學建模競賽中,編程軟件是必不可缺少的,比如大家都熟知的MATLAB多數同學們都會經常用到,今天給大家介紹一些MATLAB的基本元素,希望幫助大家更好的掌握編寫基本的函數!
變量和數組
? ? ? ?MATLAB 程序的基本數據單元是數組。一個數組是以行和列組織起來的數據集合,并且擁有一個數組名。數組中的單個數據是可以被訪問的,訪問的方法是數組名后帶一個括號,括號內是這個數據所對應行標和列標。標量在 MATLAB 中也被當作數組來處理——它被看作只有一行一列的數組。
? ? ? ?數組可以定義為向量或矩陣。向量一般來描述一維數組,而矩陣往往來描述二維或多維數組。在本書中,當我們討論一維數組時用向量表示,當我們討論二維或多維向量時用矩陣。如果在特殊情況下,同時遇到這兩種數組,我們就把他們通稱為“數組”。
? ? ? ?數組的大小(size)由數組的行數和列數共同決定,注意行數在前。一個數組所包含的數據多少可由行數乘列數得到。例如,下列數組的大小為
數組中的單個數據是可以被訪問的,訪問的方法是數組名后帶一個括號,括號內是這個數據所對應的行標和列標。如果這個數組是一個行向量或列向量,則只需要一個下標。例如上面的數組 A(2 1)為 3,C(2)為 2。一個MATLAB變量是一段包含一個數組的內存區,并且擁有一個用戶指定的變量名。通過適當的命令和它的變量名隨時可以就調用它和修改它。
MATLAB 的變量名必須以字母開頭,后面可以跟字母,數字和下劃線(_).只有前31個字符是有效的;如果超過了 31個字符,基余的字符將被忽略。如果聲明兩個變量,兩變量名只有第32個字符不同,那么MATLAB將它們當作同一變量對待。
編程隱患
確保你所聲明的變量名前 31 個字符是獨一無二的。否則,MATLAB 將無法辨認出它們的不同。
? ? ? ?當你編寫程序時,給變量起一個有意義的名字非常的重要。有意義的名字極大的提高了程序的可讀性和可維護性。像 day,month 和 year 這樣的名字意義非常明確,即使第一次看到也能理解。盡管空格不能用在 MATLAB 變量名中,但是可以用下劃線代替空格創造出有意義的變量名。比如,changerate 可以寫成 change_rate
好的編程習慣?
給你的變量起一個描述性的且易于記憶的變量名。例如,貨幣匯率可以 exchange_rate為變量名。這種方法將使得你的程序更加明確且易于理解。
? ? ? ? 在你所寫的程序的開頭列出一數據字典(data dictionary)十分的重要.數據字典列舉了你在本程序中用到的所有變量的定義。它的定義應包括本條目的所要描述的內容和它在執行時所在的單元。當編寫程序時,編定數據字典看似沒有必要。但是設想一下,在過了一段時間后,你或其他人要對此程序修改,這時數據字典就顯得十分的有用。
好的編程習慣
給每個程序創建一個數據字典以增強程序的可維護性。
? ? ? ?在 MATLAB 語言中是區分字母大小的,也就是說,大寫字母和小寫字母代表的東西是不同的。所以變量NAME,Name,name在MATLAB中是不同的。所以已用過的小寫變量名與一個新建大寫的變量名重名,這時使用時要特別地小心。在一般情況下,我們一律用小寫字母來表示。
好的編程習慣
在每次用到一個變量時,我們要確保變量名的大小寫的精確匹配。在變量名中只使用小寫字母是一個好的編程習慣。
? ? ? ?兩個最常見的變量類型是char型和double型。double 型的變量包括由64位雙精度浮點數構成的標量或數組。這種變量可以代表實數,虛數和復數。每個值的實部和虛部的變化范圍為正負10-308~10308,擁有15到16位有效數字。這是基本的數字數據類型。
? ? ? ?無論什么時侯,你將一個數值賦值于一個變量名,那么 MATLAB 將自動建立一個double型變量。例如,下面語句創建了一個以var為變量名的double型變量,包含了一個 double型的單個元素,存儲了復數值(1+i)
? ? ? ?char型的變量包括由16位數值構成的標量或數組,每一個16位數代表一個字符。這個類型的經常用于字符串操作,當一個字符或字符串賦值于一個變量名時,系統會自動建立一個char型變量。例如,下面的這個語句創建了一個char 型變量comment,并存儲了一個字符串在其內。當這個語執行后,系統將會建立一個1×26的字符串數組。
? ? ? ?像C語言這樣的語言中,變量類型和變量在使用之前必須強制聲明。這種語言我們叫它強類型語言。相對地,像MATLAB這樣的叫做弱類型語言。通過簡單的賦值形式就可以創建變量,變量類型取決于創建時的類型。
MATLAB 變量的初始化
當變量初始化時,MATLAB 將會自動建立變量。有三種方式初始化 MATLAB 中的變量:
1.用賦值語句初始化變量
2.用 input 函數從鍵盤輸入初始化變量
01用賦值語句初始化變量
最簡單的創建和初始化一個變量的方法是用賦值語句賦予變量一個或多個值。賦值語句的一般形式如下
? ? ? ?var 是變量名,expression 可以是一個標量、一個數組或常量、其他變量和數學運算符號(+、-)的聯合。這個表達式(expression)的值是通過一般的數學運算法則計算出來的,然后將產生的結果存儲到變量 var 中。下面是一些用賦值語句初始化的變量:
? ? ?? 第一個例子創建了一個 double 類型的標量變量,存儲了一個虛數 40i。第二個例子創建了一個表達式 var2,把 var/5 的值存儲于內。第三個例子創建了一個數組 array,并存儲了一個 4 元素的行向量于內。最后一個例子顯示了多個賦值語句可寫在同一行,中間用逗號或分號隔開。注意如果在賦值語句執行時變量已經存在,那么這個變量原有的值將被覆蓋。
? ? ? ?正如第三個例子顯示的,數據數組也可以初始化變量。我們可以用是括號()和分號建立數組。所有元素按行階排序,換句話說,每一行的值從左向右,頂部的行置于最前,底部的行置于最后。在一行內單個數值可用空格或逗號隔開,而行與行之間要與則用分號隔開,或另起一行書寫。下面的表達式都是合法的,能用于建立一個變量:
注意一個數組每一行元素的個數必須完全相同,每一列元素的個數也必須完全相同.
這樣的表達式是非法的,因為第一行有3個元素,第二行有只有 2個元素.?
編程隱患
每一行元素的個數必須完全相同,每一列元素的個數也必須完全相同.試圖創建一個不同行(列)擁有不同數目元素的數組,在編譯時將會出現錯誤.?
用于初始化數組的表達式可以包括代數符號或事先已經定義好的數組.例如賦值語句
定義了數組 a=[0 8]和數組 b=[8 7 0 8].?
? ? ? ?當我們創建一個數組時,不是每一個元素都必須定義.如果要定義一個特殊的數組,或只有一個或幾個元素沒有定義,那么之前的那些元素將會自動創建,并初始化為 0.例如,如果數組 c 事先沒有定義,語句 c(2,3)=5 將會創建一矩陣
?。相似地,指定一個值賦予一個存在的數組,但超過了這個數組的大小。例如,假設存在一數組 d=[1 2],下面這個語句
將會制造出數組 d=[1 2 0 4].?
? ? ? ? 在每個賦值語句末的分號有特殊的目的:無論在何時一個表達式在賦值語句中被賦值,分號將會中止變量值的重復。如果句末沒有分號,變量值將會自動顯示在命令窗口(The Command Windows)中。
? ? ? ? 如果在賦值語句末有分號,這種重復將會消失。重復是一個用于檢查你的工作極好的方法,但是它降低了運行速度。因此,我們在一般情況下總是禁止重復。盡管如此,重復計算的結果提供了一個強大的應急調試器。如果你不能確定一個特定的賦值語句結果是多少,這時你可以去掉這個語句后的分號,當這個語句編譯時,結果會顯示在命令窗口(The Command Windows)。
好的編程習慣
在 MATLAB 賦值語句后加上一個分號來禁止變量值在命令窗口(The Command Windows)的重復。這將大大提高編譯的速度。
好的編程習慣
如果你在調試程序時需要檢測一個語句的結果,可能把句后的分號去掉,這樣結果將會出現在命令窗口(The Command Windows)。
02用捷徑表達式賦值
? ? ? ?創建一個小數組用一一列舉出元素的方法是比較容易的,但是當我們創建包括成千上萬個元素的數組怎么辦?把每一個元素列舉出來則不太現實。
? ? ? ?MATLAB 提供一種專門的捷徑標記法,這種方法用克隆運算符(colon operator)適用于上述情況。克隆運算符指定一系列的數值,它指定了這個系列數的第一值,步增和最后一個值。它的一般順序始下
? ? ? ?first代表數組的每一個值,incr代表步增量,last代表這個數組的最后一個值。如果步增量為1,那么步增量可省略,而變成了first:last格式。
例如,表達式 1:2:10 是創建一個 1×5 行向量[1 3 5 7 9]的簡便方法。
用克隆標記法初始化一個含有一百個元素的數組
,語句如下
捷徑表達式可以聯合轉置運算符(’)來初始化行向量,或更加復雜的矩陣。轉置運算符可以在需要的情況下完成行和列的轉換。因為這個表達式
產生一個 4 元素行向量[1 2 3 4],然后將其轉換成 4 元素的列向量
,相似地,表達式
將會創建一個矩陣
03用內置函數來初始化
? ? ? 數組也可以用 MATLAB 內置函數創始化。例如,函數 zeros 可以初始化任何大小的全為零的數組。用許多形式的 zeros 函數。如果這個函數的參數只是一個標量,那么 MATLAB將會創建一個方陣,行數和列數均為這個參數。如果這個函數有兩個標量參數,那么第一個參數代表行數,第二個參數代表列數。因為 size 函數所返回的一個數組的行數和列數,所以它可以聯合 zeros 函數來創建一個相同大小零矩陣。下面是一些用到 zeros 函數的例子。
這些語句產生下列的數組
相似地,ones 函數產生的數組包含的元素全為 1,eye 函數通常用來產生單位矩陣,只有對角線的元素為 1.其他元素為 0.表 2.1 列出一些用于初始化變量的函數.?
04用關鍵字 input 初始化變量
關鍵字 input 用來提示使用者和直接從鍵盤輸入初始化變量.當腳本文件(Script files)時,它可以用來提示使用者輸入.input 函數在命令窗口(The Command Windows)顯示提示語句,并等待用戶輸入一個值.例如,下面的賦值語句:?
當這個語句被編譯時,MATLAB 打印出字符串 enter an input value:,然后等待用戶回復.如果要只輸入一個數,那么只需要直接鍵入,如果要輸入一個數組,則必須帶上中括號([]).不管怎樣,當按下回車鍵時.在窗口輸入的任何值都會被儲入變量 my_val.如果只按下回車鍵,那么這個變量就存儲了一個空矩陣.?
如果 input 函數中有字符's'做為它的第二個參數,輸入的數據就被當字符串.因此,語句
把數值 1.23 存儲到 in1 中.而語句
把字符串 1.23 存儲到 in2 中.?
了解更多數學建模干貨,可關注GZH“數模樂園”