計算機本質上是一個能夠處理數據的機器。Matlab 可以處理很多類型的數據,我們功利一點,先只了解最常用的幾種數據類型。其他的數據類型,隨用隨查。
從這一次教程開始,大家要勤在命令行窗口中練習。
數值數據(Numeric)
可以把它理解為數學意義的數字。Matlab 默認把數值型數據按照雙精度浮點型存儲。咱們先不管什么是雙精度浮點型,最直觀的了解就是咱們在Matlab 中做數值計算時,它的精度是小數點后4位。
你可以試著在命令行窗口中輸入以下命令,看看這樣的數值計算(輸入完命令后要按回車。在>>
符號后面是輸入的內容,ans =
之類的內容,是 matlab 在執行命令后的輸出,后文不再解釋類似的輸入與輸出)。
>> 3 + 4
ans =
7
>> 3 / 4
ans =
0.7500
字符串(string)
以單引號'
或雙引號"
括起來的任意文本,如'abc'
就是一個字符串,它包含a
, b
, c
三個字符,也可以寫成"abc"
。
請注意,單引號或雙引號只是字符串的邊界,它并不包含在字符串當中。那如果字符串本身包含有單引號或雙引號時怎么辦?
這里存在兩類情況,我們用寫字符串I'm OK
和I"m OK
來舉例.
- 如果字符串本身的引號與字符串邊界的引號不同,則上述例子在程序中應該寫成
'I"m OK'
和"I'm OK"
. - 字符串本身的引號與字符串邊界的引號相同,則上述例子的寫法就是這樣的:
'I''m OK'
和"I""m OK"
. 注意字符I
后面的引號寫了兩次。
大家可以思考一下,如果字符串里面既包含'
也包含"
怎么辦?
在 matlab 中用不同的方法試試:
>>'I"m OK'
ans =
'I'm OK'
>>"I'm OK"
ans =
"I'm OK"
>>"I""m OK"
ans =
"I"m OK"
>> 'I''m OK'
ans =
'I'm OK'
>> 'I''m "God"!'
ans =
'I'm "God"!'
字符串是文本,而計算機只能處理數字。所以需要先將文本轉換為數字才能執行進一步的操作。這就涉及到編碼,所有的文本先通過編碼計算方案轉換為數字再存儲到計算機里。
最早的編碼方案是美國人搞出來的,只負責127個字符(大小寫英文字母加上一些符號和數字)的編碼。這種編碼方案被稱為ASCII
編碼。比如,在這個編碼方案里,a
對應的數字是97
, b
對應的是98
. 所以,大家應該能理解下面的計算結果。
>> 'a' + 'b'
ans =
195
編碼方案還有很多種,比如中國的漢字編碼采用的是 GBK 編碼,也有采用 GB2312 的,有興趣的小伙伴們,可以自己去查一下。
邏輯型數據(bool)
邏輯型數據,很多人都習慣上把它稱為布爾值。在 Matlab 中,它只有true
和false
這兩個值,請注意大小寫。Matlab 用1
表示true
,而用0
表示false
.
我們在命令行窗口中看看這一特性:
>> true
ans =
logical
1
>> false
ans =
logical
0
布爾值可以通過關系操作符計算得到,關系操作符主要有以下幾種(如果對以下的判斷回答為“是”,則結果為 true,否則結果為 false.):
-
==
判斷兩邊的值是否相等; -
~=
判斷兩邊的值是否不等; -
>
判斷左邊的值是否大于右邊的值; -
<
判斷左邊的值是否小于右邊的值; -
>=
判斷左邊的值是否大于等于右邊的值; -
<=
判斷左邊的值是否小于等于右邊的值。
請看例子:
>> 3 == 5
ans =
logical
0
>> 3 ~= 5
ans =
logical
1
>> 3 > 5
ans =
logical
0
>> 3 <= 5
ans =
logical
1
多個關系計算式可以通過邏輯運算符連接得到更復雜的邏輯表達式。邏輯運算符主要有以下三種:
-
&
邏輯與(AND),只有當&
兩邊的值都為 true 時,結果才為 true. -
|
邏輯或(OR),當|
兩邊的值中至少有一個為 true時,結果為 true. -
~
邏輯非(NOT),它是單目操作符,也就是~A
的形式。如果A為true,則~A
為 false. 反之則為 true.
結合例子進一步理解:
>> 3 | 5
ans =
logical
1
>> -1 & 0
ans =
logical
0
>> 'a' | 0
ans =
logical
1
>> ~'c'
ans =
logical
0
>> ~0
ans =
logical
1
這里可能有小伙伴比較懵,幾個意思?前面說過,true 被 Matlab 存儲為1
,而false被存儲為0
. 更進一步,在邏輯運算過程中,Matlab 將所有的非零數據都當作是 true.
繼續看例子:
>> (~ (2 > 3)) & (3 <= 4) | (5 > 3)
ans =
logical
1
這里用了括號,以提高某些塊的運算優先級(跟數學里做的一樣,都是先算括號里的,然后才算其他的)。可以想一想,如果我寫成這樣:~ 2 > 3 & 3 <= 4 | 5 > 3
,大家能一眼看出先算哪個,后算哪個嗎?
為了避免歧義,勤用括號就沒錯。&
, |
, ~
這三種運算符的運算的規則是從左至右,其他的優先級關系我們就不管了,留著腦容量處理更重要的事情。
邏輯運算常常用于循環或條件判斷中。比如:
if 5 > 3
disp ('OK')
end
如果5 > 3
,就顯示OK
.
while 3 < 5
disp ('x smaller than y')
end
這是一個循環操作,只要3 < 5
就一直顯示3 smaller than 5
. 這個例子,是一個死循環,也就是說它會一直這么執行下去,除非強制終止(在Matlab中是按ctrl
+ c
鍵)。實際工作中,很少這么寫。
變量
變量的概念與初中代數中變量概念幾乎是相同的。只是在計算機程序中,變量可以是任意的數據類型。在程序中,使用變量名來表示變量。顧名思義,變量名就是變量的名稱。變量名不能亂取,在 Matlab 中,變量的命名必須遵守以下規則:
- 第一個字符必須是英文字母
- 可以是數字、英文字母以及下劃線
_
的組合 - 長度不超過63個字符
- 大小寫敏感,也就是說變量
cost
與變量Cost
,COsT
等是不一樣的。 - 有 20 個單詞是 Matlab 內置的關鍵字,這些關鍵字不能用作變量名。具體是哪 20 個單詞,大家可以使用
iskeyword
命令查看。
可以通過賦值操作符=
將數據賦值給變量。
a = 3
b = '2'
c = 'hello world'
d = true
注意,這里的=
與數學里的=
不一樣。
本質上,變量是一個指針,通過指針的指向我們可以獲取變量的值。賦值操作只是改變了這個指針的指向。
我們試著用以上知識來理解下面的結果:
>> a = 5
a =
5
>> a = a + 3
a =
8
>> b = a
b =
8
>> a = 'Hello world!'
a =
'Hello world!'
>> disp (b)
8
第一次,Matlab 創建了一個變量a
和數據5
,并且通過賦值操作,將變量a
指向數據5
;
第二次,先將a
指向的數據5
加上3
,得到8
,通過賦值操作,將變量a
指向了新的數據8
;
第三次,Matlab 創建了一個新的變量b
,通過賦值操作,變量b
與變量a
指向同一個數據8
. 注意了,這里兩個變量指向了同一個數據。
第四次,Matlab 創建了一個字符串數據Hello world!
,通過賦值操作,將變量a
指向了這個字符串數據。注意了,雖然變量a
的指向發生了變化,但是b
仍然是指向數據8
的。
最后,用disp
命令查看下b
的值是什么。