$ 一步一步學Matlab(3)——Matlab中的數據類型

小學時候咱們就知道,數學中有天然數、整數、分數、小數等等不少種類型的數。到了中學,咱們又發現了其實還有無理數、複數這些有些特殊的數。到了大學學了高等數學以後,咱們又知道了其實還存在着無窮大、無窮小這樣「難以想象」的「數」。
爲了對各類數據類型都可以作到有效處理,Matlab中也規定了一系列不一樣的數據類型,下面對其進行一一介紹。算法

數值類型

數值類型其實就對應於數學中的各類類型的數,包括下面幾種:數組

  • 整數
  • 浮點數(包括單精度和雙精度)
  • 複數
  • 無窮量
  • 非數值量

邏輯類型

現實世界中不少事情都是真假之間,好比真假美猴王,真錢假錢,真相與假象...Matlab世界也存在着這種用於判斷真假的數據類型,一般0表示假(0表示無,什麼都沒有,四大皆空,固然是假),而非0的數表示真。函數

在數學中,咱們也常常會遇到判斷真假的問題,好比判斷1>2這個式子是否成立。Matlab中提供了一系列的關係運算符:編碼

關係運算符 含義
< 小於
<= 小於或等於
> 大於
>= 大於或等於
== 等於
~= 不等於

下面將用一段Matlab代碼來展示這些關係運算符的用法:spa

?1>2  % 由於1不大於2,因此結果是假,輸出0

ans =

     0

?1<=2  % 由於1是小於等於2的,因此結果是真,輸出1

ans =

     1

?1~=2  % 由於1是不等於2的,因此結果是真,輸出1

ans =

     1

?1==2  % 由於1不等於2,因此結果是假,輸出0

ans =

     0

除了關係運算符之外,Matlab中還有3個邏輯運算符:與、或、非,是對運算數按二進制位進行運算的:code

邏輯運算符 含義
& (按位)與,兩個數都爲真結果才爲真,不然結果爲假
| (按位)或,兩個數至少有一個爲真,結果才爲真,不然結果爲假
~ (按位)非,對單個數進行操做,若該數爲真,則結果爲假,不然爲真

代碼舉例以下:對象

?2&5  % 由於2和5都是非零的數,因此都爲真,它們的與運算結果也是真

ans =

     1

?2&0  % 由於2是非零的數,表示真,而0表示假,因此它們的與運算結果是假

ans =

     0

?2 | 5  % 由於2和5都表示真,因此它們的或運算結果也爲真

ans =

     1

?2 | 0  % 由於2表示真,0表示假,因此兩個數中有一個數是真,因此結果也是真

ans =

     1

?~0  % 由於0表示假,因此它的非運算的結果就相反,爲真

ans =

     1

?~2  % 由於2表示真,因此它的非運算結果爲假

ans =

     0

字符和字符串類型

還記得在咱們的第一篇Hello World程序中用disp函數輸出Hello World嗎?裏面的"Hello World"其實就是一個字符串,它實際上是由多個單字符組成的字符數組,請看示例代碼:element

?str = 'Hello World';  % 字符串要使用單引號括起來,不要使用雙引號
?disp(str)
Hello World
?size(str)  % 求字符串str的長度,返回的結果爲:[1,11],表示str是一個1維、有11個元素的數組

ans =

     1    11

?str(1,5)  % 顯示str的第1行、第5個元素(注意:下標是從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

結構體類型

結構體類型是一種特殊的數據類型,至關於其餘面嚮對象語言中的對象,也能夠當作是C語言中的結構體類型。unicode

建立結構體類型的方法十分簡單:結構體名稱.字段名稱 = 字段值,而且支持嵌套。字符串

下面給出一段示例程序,用於建立一個名爲Person的結構體,它有name、age、language(會說的語言,是一個單元數組,後面講)、score(成績,也是一個結構體)四個屬性:

?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

數組與矩陣類型

數組是一堆元素的集合,這些元素能夠是數值類型,也能夠是字符串、結構體等類型。同一個數組中的元素的數據類型必須都相同。數組的運算其實是對數組中的每一個元素同時進行運算。

矩陣能夠當作是多維數組,矩陣的運算遵循線性代數運算法則。矩陣將在後面的Blog中進行詳細介紹。

建立數組有以下幾種方式:

  • 枚舉式
  • 等差數列式
  • 區間線性分割式

下面用實例代碼介紹一下建立數組的幾種方式:

?array = [1,2,3,4,5]  % 枚舉式,逐一列舉數組中的每一個元素,元素之間用逗號隔開,也能夠用空格隔開

array =

     1     2     3     4     5

?array2 = 1:5  % 等差數列式,以等差數組的形式建立數組,分別給出首、尾元素和步長(即等差數列的公差),步長爲1時能夠省略

array2 =

     1     2     3     4     5

?array3 = 1:2:6  % 等差數列式,這裏步長爲2,能夠看出,結果並不必定會包含尾元素

array3 =

     1     3     5

?array4 = linspace(1,5,6)  % 區間線性分割式,調用linspace函數,前兩個參數分別爲被分割區間的下限和上限(閉區間),第三個參數爲分割個數

array4 =

    1.0000    1.8000    2.6000    3.4000    4.2000    5.0000

單元數組類型

單元數組其實是一種廣義的矩陣,與矩陣不一樣的是,單元數組能夠容納不一樣數據類型的元素,經過大括號'{}'來界定數組元素。假如cell是一個單元數組,那麼能夠經過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)  % 調用cell函數來建立一個空的單元數組

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

這裏要注意的一點是,對於字符串類型,實際上是字符數組,那麼怎麼表示多個字符串組成的數組呢?若是用通常數組表示,會發現出了問題(全部字符串都鏈接到一塊兒了):

?strs = ['aa','bcd','ef'];
?strs

strs =

aabcdef

那麼這個時候就能夠用單元數組來表示多個字符串的數組了,就不會存在這個問題:

?strs2 = {'aa','bcd','ef'};
?strs2

strs2 = 

    'aa'    'bcd'    'ef'

map容器類型

map是一種"鍵-值"對類型的數據類型,是Matlab R2012a版本新增的數據類型,因此下面的示例代碼是在正式版Matlab上運行的而非精簡版Matlab。能夠經過containers.Map函數建立一個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'
相關文章
相關標籤/搜索