zoukankan      html  css  js  c++  java
  • $ 一步一步学Matlab(3)——Matlab中的数据类型

    小学时候我们就知道,数学中有自然数、整数、分数、小数等等很多种类型的数。到了中学,我们又发现了其实还有无理数、复数这些有些特殊的数。到了大学学了高等数学之后,我们又知道了其实还存在着无穷大、无穷小这样“不可思议”的“数”。
    为了对各种数据类型都能够做到有效处理,Matlab中也规定了一系列不同的数据类型,下面对其进行一一介绍。

    数值类型

    数值类型其实就对应于数学中的各种类型的数,包括下面几种:

    • 整数
    • 浮点数(包括单精度和双精度)
    • 复数
    • 无穷量
    • 非数值量

    逻辑类型

    现实世界中很多事情都是真假之间,比如真假美猴王,真钱假钱,真相与假象...Matlab世界也存在着这种用于判断真假的数据类型,通常0表示假(0表示无,什么都没有,四大皆空,当然是假),而非0的数表示真。

    在数学中,我们也经常会遇到判断真假的问题,比如判断1>2这个式子是否成立。Matlab中提供了一系列的关系运算符:

    关系运算符 含义
    < 小于
    <= 小于或等于
    > 大于
    >= 大于或等于
    == 等于
    ~= 不等于

    下面将用一段Matlab代码来展现这些关系运算符的用法:

    ?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个逻辑运算符:与、或、非,是对运算数按二进制位进行运算的:

    逻辑运算符 含义
    & (按位)与,两个数都为真结果才为真,否则结果为假
    | (按位)或,两个数至少有一个为真,结果才为真,否则结果为假
    ~ (按位)非,对单个数进行操作,若该数为真,则结果为假,否则为真

    代码举例如下:

    ?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"其实就是一个字符串,它其实是由多个单字符组成的字符数组,请看示例代码:

    ?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语言中的结构体类型。

    创建结构体类型的方法十分简单:结构体名称.字段名称 = 字段值,并且支持嵌套。

    下面给出一段示例程序,用于创建一个名为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'
    
  • 相关阅读:
    CRM 客户线索 与 销售人员
    CRM X
    MySQL为Null导致的5大坑
    搞懂 macOS 上的主机名/hostname/ComputerName
    Node服务中如何写日志?
    Linux下 iptables 超详细教程和使用示例
    精读《Prisma 的使用》
    Redis夺命20问
    redis HyperLogLog的使用
    聊聊redis分布式锁的8大坑
  • 原文地址:https://www.cnblogs.com/jiayongji/p/7758259.html
Copyright © 2011-2022 走看看