天天看點

《MATLAB R2012a超級學習手冊》一2.1 資料類型

本節書摘來自異步社群《matlab r2012a超級學習手冊》一書中的第2章,第2.1節,作者 史潔玉 , 孔玲軍,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

matlab r2012a超級學習手冊

matlab中定義了很多種資料類型,包括整數、浮點數、字元、字元串和邏輯類型等,甚至可以定義自己的資料類型。

在matlab中有15種基本資料類型。每種基本的資料類型均以矩陣的形式出現,該矩陣可以是最小的0×0矩陣到任意大小的n維矩陣。數組包括數值類型、字元類型、單元類型、結構類型、java類型、函數句柄。

數值類型包含整數、浮點數和複數3種類型。另外,matlab還定義了inf和nan兩個特殊數值。

1.整數類型

在matlab中整數類型包含4種有符号整數和4種無符号整數。有符号整數可以用來表示負數、零和正整數,而無符号整數則隻可以用來表示零和正整數。matlab支援1、2、4和8位元組的有符号整數和無符号整數。

這8種資料類型的名稱、表示方法和類型轉換函數如表2-1所示。應用時要盡可能用位元組數少的資料類型表示資料,這樣可以節約存儲空間和提高運算速度。例如最大值為100的資料可以用1個位元組的整數來表示,而沒有必要用8個位元組的整數來表示。

《MATLAB R2012a超級學習手冊》一2.1 資料類型

表2-1中的類型轉換函數可以用于把其他資料類型的數值強制轉換為整數類型。此外類型轉換函數還可以用于生成整數類型的數值。例如,如果需要産生一個無符号2位元組整數的數值可以用如下語句實作。

2.浮點數類型

matlab 2012浮點數有雙精度浮點數和單精度浮點數兩種。雙精度浮點數為matlab 2012預設的資料類型。如果某個資料沒有被指定資料類型,那麼matlab會用雙精度浮點數來存儲它。為了得到其他類型的數值類型,可以使用類型轉換函數。

matlab中的雙精度浮點數和單精度浮點數均采用ieee754中規定的格式來定義,其表示範圍、存儲大小和類型轉換函數如表2-2所示。

《MATLAB R2012a超級學習手冊》一2.1 資料類型

3.複數類型

複數包含獨立的兩部分,即實部和虛部。虛部的機關是-1的開平方根,在matlab中可以用i或者j來表示。

可以用如下指派語句來産生複數。

也可以用函數complex來産生複數,示例代碼如下。

其中x、y為實數,得到的z是以x為實部,y為虛部的複數。

也可以這樣使用complex函數,具體代碼如下。

其中x為實數,得到的z是以x為實部,以0為虛部的複數。

4.inf和nan

matlab中規定用inf、-inf來表示正無窮大和負無窮大。除法運算中除數為0或者運算結果溢出都會導緻inf或-inf的結果。以下3條語句運算産生的結果均為inf,具體代碼如下。

matlab中規定用nan來表示一個既不是實數也不是複數的數值。nan是notanumber的縮寫。類似0/0、inf/inf這樣的表達式得到的結果均為nan。

邏輯類型用1和0來表示true和false兩種狀态。可以用函數logical()來得到邏輯類型的數值。函數logical()可以把任何非零的數值轉換為邏輯true(即1),把數值0轉換為邏輯false(即0)。示例代碼如下。

在後面的小節中将介紹的邏輯關系運算符也可以得到邏輯類型的資料。

matlab中規定用資料類型char來表示一個字元。一個char類型的1×n數組則可以稱為字元串string。matlab中char類型都是以2位元組的unicode字元來存儲的。

可以用一對單引号來表示字元串,例如下面的代碼。

也可以用char函數來構造一個字元串,例如下面的代碼。

關于字元串的更深入的介紹請參考本書後面的小節。

結構體是根據屬性名組織起來的不同類型資料的集合。有一種容易與結構體類型混淆的資料類型是單元數組類型。它是一種特殊類型的matlab數組,其每一個元素叫做單元,而每一個單元包含matlab數組。

提示:

結構體和單元數組的共同之處在于它們都提供了一種分級存儲機制來存儲不同類型的資料,不同之處是組織資料的方式不一樣。結構體數組裡的資料是通過屬性名來引用的,而在單元數組裡,資料是通過單元數組下标引用來操作的。

結構體數組是一種由“資料容器”組成的matlab 2012數組。這種“資料容器”稱為結構體的屬性(field)。結構體的任何一個屬性可以包含任何一種類型的資料。

一個結構體human,有3個屬性,即name、score和salary,其中name是一個字元串,score是一個标量,salary是一個1×6的向量。例如:'sara'屬于name字元串,100屬于score标量,[1 2 3 4 5 6]是salary一個1×6的向量。

1.結構體數組的構造

構造一個結構體數組有如下兩種方法。

(1)利用指派語句。

(2)利用函數struct()來進行定義。

下面就通過為結構體中的每一個屬性指派來構造一個結構體數組。示例代碼如下。

上述語句得到的輸出代碼如下。

還可以用如下語句把結構體數組擴充成1×2的結構體,代碼設定如下。

由上述語句使結構體數組human的維數變為1×2。當讀者擴充結構體數組時,matlab對未指定資料的屬性自動指派成空矩陣,使其滿足以下規則。

(1)數組中的每個結構體都具有同樣多的屬性名。

(2)數組中的每個結構體都具有相同的屬性名。

例如,下面語句使結構體數組human的維數變為1×3,此時human(3).name和human(3).salary由于未指定資料,被matlab 2012設為空矩陣。

注意:

結構體數組中元素屬性的大小并不要求一緻,例如結構數組human中的name屬性和salary屬性都具有不同的長度。

除了使用指派語句來構造結構數組外,還可以用函數struct()來實作構造結構數組。函數struct的基本調用格式如下。

上面語句中的輸入變量為屬性名和相應的屬性值。

函數struct()可以有不同的調用方法來實作構造結構體矩陣,例如要實作一個1×3的結構數組human的方法如表2-3所示。

《MATLAB R2012a超級學習手冊》一2.1 資料類型

2.通路結構體數組的資料

使用結構體數組的下标引用,可以通路結構體數組任何元素及其屬性。同樣也可以給任何元素及其屬性指派。還可以通過下面語句來生成一個結構體數組。

讀者可以通路結構數組的任意子數組。例如,下面的指令行生成一個1×2的結構數組。

上述語句得到輸出代碼如下。

讀者也可以通過如下指令行生成一個1×3的結構數組。

如果要通路結構體數組的某個元素的某個屬性,可以用如下格式。

如果要通路結構體數組的某個元素的某個屬性的元素值,可以使用如下格式。

如果想得到結構體數組的所有元素的某個屬性值,可以使用如下格式。

以上結果表明human.name格式的輸入将傳回結構體數組的所有元素的屬性值。可以使用矩陣合并符[]來合并這些結果,程式語句如下。

也可以用把它們合并在一個單元數組裡,代碼設定如下。

單元數組就是每個元素為一個單元的數組。每個單元都可以包含任意資料類型的matlab數組。例如,單元數組的一個單元可以是一個實數矩陣,或是一個字元串數組,也可以是一個複向量數組。

1.單元數組的構造

構造單元數組有左标志法和右标志法兩種方法。下面就詳細介紹這兩種方法。

(1)左标志法

左标志法就是把單元标志{}放在左邊,例如,建立一個2×2的單元數組可以使用如下語句。

(2)右标志法

右标志法就是把标志符放在右邊,例如,建立和上面一樣的單元數組可以使用如下語句。

上述語句還可以簡單地寫為下面的代碼。

要顯示單元數組可以在指令行中直接輸入單元數組的名字,代碼設定如下。

由上述語句得到輸出代碼如下。

另一種顯示單元數組的方法是使用函數celldisp(),代碼如下。

由上述語句得到的輸出代碼如下。

函數celldisp()的顯示格式與直接輸入單元數組名的顯示格式是不同的。celldisp()函數更适用于具有大量資料的單元數組的顯示。

2.單元數組的讀取

以程式c={'butterfly',@cos;eye(1,2),false}為例。要讀取c{1,1}中的字元串,可以使用如下語句。

如果要讀取單元數組的若幹個單元的資料,例如讀取單元數組c的第1行,可以用下面語句。

3.單元數組的删除

将空矩陣賦給單元數組的某一整行或者某一整列,就可以删除單元數組的這一行或者一列。例如,删除單元數組c的第一行可以用如下語句。

2.1.6 函數句柄

函數句柄是matlab中用來提供間接調用函數的資料類型。函數句柄可以轉遞給其他函數以便該函數句柄所代表的函數可以被調用。函數句柄還可以被存儲起來,以便以後利用。

函數句柄可以用符号@後面跟着函數名來表示,例如下面的代碼。

sin為matlab中自帶的正弦函數,得到的輸出變量fhandle為sin函數的句柄。可以利用fhandle來調用sin函數,例如下面的代碼。

上面語句得到的輸出代碼如下。

實際上,該程式中的語句fhandle(0)相當于語句sin(0)。