聲明:本系列文章參考了《MATLAB 8.X實戰(zhàn)指南(R2014a中文版)》(清華大學(xué)出版社仰禽,趙小川等編著)参滴,僅用于個人學(xué)習(xí)總結(jié)和交流瘸羡,禁止作為商業(yè)用途轉(zhuǎn)載或使用代赁。
小學(xué)時候我們就知道甘耿,數(shù)學(xué)中有自然數(shù)踊兜、整數(shù)、分數(shù)佳恬、小數(shù)等等很多種類型的數(shù)捏境。到了中學(xué),我們又發(fā)現(xiàn)了其實還有無理數(shù)毁葱、復(fù)數(shù)這些有些特殊的數(shù)垫言。到了大學(xué)學(xué)了高等數(shù)學(xué)之后,我們又知道了其實還存在著無窮大倾剿、無窮小這樣“不可思議”的“數(shù)”筷频。
為了對各種數(shù)據(jù)類型都能夠做到有效處理,Matlab中也規(guī)定了一系列不同的數(shù)據(jù)類型前痘,下面對其進行一一介紹凛捏。
數(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ù)按二進制位進行運算的:
邏輯運算符 | 含義 |
---|---|
& | (按位)與拭荤,兩個數(shù)都為真結(jié)果才為真茵臭,否則結(jié)果為假 |
| | (按位)或,兩個數(shù)至少有一個為真舅世,結(jié)果才為真旦委,否則結(jié)果為假 |
~ | (按位)非,對單個數(shù)進行操作雏亚,若該數(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ù)組中的每個元素同時進行運算。
矩陣可以看成是多維數(shù)組唁桩,矩陣的運算遵循線性代數(shù)運算法則闭树。矩陣將在后面的Blog中進行詳細介紹。
創(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'