聲明:本系列文章參考了《MATLAB 8.X實戰(zhàn)指南(R2014a中文版)》(清華大學(xué)出版社,趙小川等編著),僅用于個人學(xué)習(xí)總結(jié)和交流,禁止作為商業(yè)用途轉(zhuǎn)載或使用。
小學(xué)時候我們就知道,數(shù)學(xué)中有自然數(shù)、整數(shù)、分?jǐn)?shù)、小數(shù)等等很多種類型的數(shù)。到了中學(xué),我們又發(fā)現(xiàn)了其實還有無理數(shù)、復(fù)數(shù)這些有些特殊的數(shù)。到了大學(xué)學(xué)了高等數(shù)學(xué)之后,我們又知道了其實還存在著無窮大、無窮小這樣“不可思議”的“數(shù)”。
為了對各種數(shù)據(jù)類型都能夠做到有效處理,Matlab中也規(guī)定了一系列不同的數(shù)據(jù)類型,下面對其進(jìn)行一一介紹。
數(shù)值類型
數(shù)值類型其實就對應(yīng)于數(shù)學(xué)中的各種類型的數(shù),包括下面幾種:
- 整數(shù)
- 浮點數(shù)(包括單精度和雙精度)
- 復(fù)數(shù)
- 無窮量
- 非數(shù)值量
邏輯類型
現(xiàn)實世界中很多事情都是真假之間,比如真假美猴王,真錢假錢,真相與假象...Matlab世界也存在著這種用于判斷真假的數(shù)據(jù)類型,通常0表示假(0表示無,什么都沒有,四大皆空,當(dāng)然是假),而非0的數(shù)表示真。
在數(shù)學(xué)中,我們也經(jīng)常會遇到判斷真假的問題,比如判斷1>2
這個式子是否成立。Matlab中提供了一系列的關(guān)系運算符:
關(guān)系運算符 | 含義 |
---|---|
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
== | 等于 |
~= | 不等于 |
下面將用一段Matlab代碼來展現(xiàn)這些關(guān)系運算符的用法:
?1>2 % 因為1不大于2,所以結(jié)果是假,輸出0
ans =
0
?1<=2 % 因為1是小于等于2的,所以結(jié)果是真,輸出1
ans =
1
?1~=2 % 因為1是不等于2的,所以結(jié)果是真,輸出1
ans =
1
?1==2 % 因為1不等于2,所以結(jié)果是假,輸出0
ans =
0
除了關(guān)系運算符以外,Matlab中還有3個邏輯運算符:與、或、非,是對運算數(shù)按二進(jìn)制位進(jìn)行運算的:
邏輯運算符 | 含義 |
---|---|
& | (按位)與,兩個數(shù)都為真結(jié)果才為真,否則結(jié)果為假 |
| | (按位)或,兩個數(shù)至少有一個為真,結(jié)果才為真,否則結(jié)果為假 |
~ | (按位)非,對單個數(shù)進(jìn)行操作,若該數(shù)為真,則結(jié)果為假,否則為真 |
代碼舉例如下:
?2&5 % 因為2和5都是非零的數(shù),所以都為真,它們的與運算結(jié)果也是真
ans =
1
?2&0 % 因為2是非零的數(shù),表示真,而0表示假,所以它們的與運算結(jié)果是假
ans =
0
?2 | 5 % 因為2和5都表示真,所以它們的或運算結(jié)果也為真
ans =
1
?2 | 0 % 因為2表示真,0表示假,所以兩個數(shù)中有一個數(shù)是真,所以結(jié)果也是真
ans =
1
?~0 % 因為0表示假,所以它的非運算的結(jié)果就相反,為真
ans =
1
?~2 % 因為2表示真,所以它的非運算結(jié)果為假
ans =
0
字符和字符串類型
還記得在我們的第一篇Hello World程序中用disp
函數(shù)輸出Hello World
嗎?里面的"Hello World"其實就是一個字符串,它其實是由多個單字符組成的字符數(shù)組,請看示例代碼:
?str = 'Hello World'; % 字符串要使用單引號括起來,不要使用雙引號
?disp(str)
Hello World
?size(str) % 求字符串str的長度,返回的結(jié)果為:[1,11],表示str是一個1維、有11個元素的數(shù)組
ans =
1 11
?str(1,5) % 顯示str的第1行、第5個元素(注意:下標(biāo)是從1開始的)
ans =
o
?str(7) % 顯示str的第7個元素
ans =
W
?abs(str) % 求str每個元素的絕對值(顯示字母的ASCII碼,如果是中文,則將顯示字符的unicode編碼)
ans =
72 101 108 108 111 32 87 111 114 108 100
?abs(str(1)) % 求str第一個元素的絕對值,返回72,這正是字母'H'的ASCII碼
ans =
72
結(jié)構(gòu)體類型
結(jié)構(gòu)體類型是一種特殊的數(shù)據(jù)類型,相當(dāng)于其他面向?qū)ο笳Z言中的對象,也可以看成是C語言中的結(jié)構(gòu)體類型。
創(chuàng)建結(jié)構(gòu)體類型的方法十分簡單:結(jié)構(gòu)體名稱.字段名稱 = 字段值
,并且支持嵌套。
下面給出一段示例程序,用于創(chuàng)建一個名為Person的結(jié)構(gòu)體,它有name、age、language(會說的語言,是一個單元數(shù)組,后面講)、score(成績,也是一個結(jié)構(gòu)體)四個屬性:
?Person.name = 'Tom';
?Person.age = 20;
?Person.language = {'Chinese','Spanish'};
?score.Math = 78;
?score.English = 98;
?Person.score = score;
?Person
Person =
name: 'Tom'
age: 20
score: [1x1 struct]
language: {'Chinese' 'Spanish'}
?Person.score
ans =
Math: 78
English: 98
數(shù)組與矩陣類型
數(shù)組是一堆元素的集合,這些元素可以是數(shù)值類型,也可以是字符串、結(jié)構(gòu)體等類型。同一個數(shù)組中的元素的數(shù)據(jù)類型必須都相同。數(shù)組的運算實際上是對數(shù)組中的每個元素同時進(jìn)行運算。
矩陣可以看成是多維數(shù)組,矩陣的運算遵循線性代數(shù)運算法則。矩陣將在后面的Blog中進(jìn)行詳細(xì)介紹。
創(chuàng)建數(shù)組有如下幾種方式:
- 枚舉式
- 等差數(shù)列式
- 區(qū)間線性分割式
下面用實例代碼介紹一下創(chuàng)建數(shù)組的幾種方式:
?array = [1,2,3,4,5] % 枚舉式,逐一列舉數(shù)組中的每個元素,元素之間用逗號隔開,也可以用空格隔開
array =
1 2 3 4 5
?array2 = 1:5 % 等差數(shù)列式,以等差數(shù)組的形式創(chuàng)建數(shù)組,分別給出首、尾元素和步長(即等差數(shù)列的公差),步長為1時可以省略
array2 =
1 2 3 4 5
?array3 = 1:2:6 % 等差數(shù)列式,這里步長為2,可以看出,結(jié)果并不一定會包含尾元素
array3 =
1 3 5
?array4 = linspace(1,5,6) % 區(qū)間線性分割式,調(diào)用linspace函數(shù),前兩個參數(shù)分別為被分割區(qū)間的下限和上限(閉區(qū)間),第三個參數(shù)為分割個數(shù)
array4 =
1.0000 1.8000 2.6000 3.4000 4.2000 5.0000
單元數(shù)組類型
單元數(shù)組實際上是一種廣義的矩陣,與矩陣不同的是,單元數(shù)組可以容納不同數(shù)據(jù)類型的元素,通過大括號'{}'來界定數(shù)組元素。假如cell是一個單元數(shù)組,那么可以通過cell{i,j}
的方式來獲取cell的元素。
實例代碼如下:
?cell1 = {'demo',1:2:10,5}
cell1 =
'demo' [1x5 double] [5]
?whos cell1
Name Size Bytes Class
cell1 1x3 332 cell array
Grand total is 13 elements using 332 bytes
?cell{1,3}
ans =
5
?cell2 = {'demo2','hello';5:-1:0,Inf}
cell2 =
'demo2' 'hello'
[1x6 double] [ Inf]
?whos cell2
Name Size Bytes Class
cell2 2x2 444 cell array
Grand total is 21 elements using 444 bytes
?cell2{2,2}
ans =
Inf
?a = cell(2,2) % 調(diào)用cell函數(shù)來創(chuàng)建一個空的單元數(shù)組
a =
[] []
[] []
?a{1,2} = 5
a =
[] [5]
[] []
?whos a
Name Size Bytes Class
a 2x2 112 cell array
Grand total is 5 elements using 112 bytes
這里要注意的一點是,對于字符串類型,其實是字符數(shù)組,那么怎么表示多個字符串組成的數(shù)組呢?如果用一般數(shù)組表示,會發(fā)現(xiàn)出了問題(所有字符串都連接到一起了):
?strs = ['aa','bcd','ef'];
?strs
strs =
aabcdef
那么這個時候就可以用單元數(shù)組來表示多個字符串的數(shù)組了,就不會存在這個問題:
?strs2 = {'aa','bcd','ef'};
?strs2
strs2 =
'aa' 'bcd' 'ef'
map容器類型
map是一種"鍵-值"對類型的數(shù)據(jù)類型,是Matlab R2012a
版本新增的數(shù)據(jù)類型,所以下面的示例代碼是在正式版Matlab上運行的而非精簡版Matlab。可以通過containers.Map
函數(shù)創(chuàng)建一個map對象,示例代碼如下:
>> data = containers.Map({'name','age','location'},{'Tom',20,'USA'});
>> data
data =
Map with properties:
Count: 3
KeyType: char
ValueType: any
>> whos data
Name Size Bytes Class Attributes
data 3x1 8 containers.Map
>> data('name')
ans =
'Tom'