小学时候我们就知道,数学中有自然数、整数、分数、小数等等很多种类型的数。到了中学,我们又发现了其实还有无理数、复数这些有些特殊的数。到了大学学了高等数学之后,我们又知道了其实还存在着无穷大、无穷小这样“不可思议”的“数”。

为了对各种数据类型都能够做到有效处理,Matlab中也规定了一系列不同的数据类型,下面对其进行一一介绍。

数值类型

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

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

逻辑类型

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

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

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

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

  1. ?1>2 % 因为1不大于2,所以结果是假,输出0
  2. ans =
  3. 0
  4. ?1<=2 % 因为1是小于等于2的,所以结果是真,输出1
  5. ans =
  6. 1
  7. ?1~=2 % 因为1是不等于2的,所以结果是真,输出1
  8. ans =
  9. 1
  10. ?1==2 % 因为1不等于2,所以结果是假,输出0
  11. ans =
  12. 0

除了关系运算符以外,Matlab中还有3个逻辑运算符:与、或、非,是对运算数按二进制位进行运算的:

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

代码举例如下:

  1. ?2&5 % 因为25都是非零的数,所以都为真,它们的与运算结果也是真
  2. ans =
  3. 1
  4. ?2&0 % 因为2是非零的数,表示真,而0表示假,所以它们的与运算结果是假
  5. ans =
  6. 0
  7. ?2 | 5 % 因为25都表示真,所以它们的或运算结果也为真
  8. ans =
  9. 1
  10. ?2 | 0 % 因为2表示真,0表示假,所以两个数中有一个数是真,所以结果也是真
  11. ans =
  12. 1
  13. ?~0 % 因为0表示假,所以它的非运算的结果就相反,为真
  14. ans =
  15. 1
  16. ?~2 % 因为2表示真,所以它的非运算结果为假
  17. ans =
  18. 0

字符和字符串类型

还记得在我们的第一篇Hello World程序中用disp函数输出Hello World吗?里面的"Hello World"其实就是一个字符串,它其实是由多个单字符组成的字符数组,请看示例代码:

  1. ?str = 'Hello World'; % 字符串要使用单引号括起来,不要使用双引号
  2. ?disp(str)
  3. Hello World
  4. ?size(str) % 求字符串str的长度,返回的结果为:[1,11],表示str是一个1维、有11个元素的数组
  5. ans =
  6. 1 11
  7. ?str(1,5) % 显示str的第1行、第5个元素(注意:下标是从1开始的)
  8. ans =
  9. o
  10. ?str(7) % 显示str的第7个元素
  11. ans =
  12. W
  13. ?abs(str) % str每个元素的绝对值(显示字母的ASCII码,如果是中文,则将显示字符的unicode编码)
  14. ans =
  15. 72 101 108 108 111 32 87 111 114 108 100
  16. ?abs(str(1)) % str第一个元素的绝对值,返回72,这正是字母'H'ASCII
  17. ans =
  18. 72

结构体类型

结构体类型是一种特殊的数据类型,相当于其他面向对象语言中的对象,也可以看成是C语言中的结构体类型。

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

下面给出一段示例程序,用于创建一个名为Person的结构体,它有name、age、language(会说的语言,是一个单元数组,后面讲)、score(成绩,也是一个结构体)四个属性:

  1. ?Person.name = 'Tom';
  2. ?Person.age = 20;
  3. ?Person.language = {'Chinese','Spanish'};
  4. ?score.Math = 78;
  5. ?score.English = 98;
  6. ?Person.score = score;
  7. ?Person
  8. Person =
  9. name: 'Tom'
  10. age: 20
  11. score: [1x1 struct]
  12. language: {'Chinese' 'Spanish'}
  13. ?Person.score
  14. ans =
  15. Math: 78
  16. English: 98

数组与矩阵类型

数组是一堆元素的集合,这些元素可以是数值类型,也可以是字符串、结构体等类型。同一个数组中的元素的数据类型必须都相同。数组的运算实际上是对数组中的每个元素同时进行运算。

矩阵可以看成是多维数组,矩阵的运算遵循线性代数运算法则。矩阵将在后面的Blog中进行详细介绍。

创建数组有如下几种方式:

  • 枚举式
  • 等差数列式
  • 区间线性分割式

下面用实例代码介绍一下创建数组的几种方式:

  1. ?array = [1,2,3,4,5] % 枚举式,逐一列举数组中的每个元素,元素之间用逗号隔开,也可以用空格隔开
  2. array =
  3. 1 2 3 4 5
  4. ?array2 = 1:5 % 等差数列式,以等差数组的形式创建数组,分别给出首、尾元素和步长(即等差数列的公差),步长为1时可以省略
  5. array2 =
  6. 1 2 3 4 5
  7. ?array3 = 1:2:6 % 等差数列式,这里步长为2,可以看出,结果并不一定会包含尾元素
  8. array3 =
  9. 1 3 5
  10. ?array4 = linspace(1,5,6) % 区间线性分割式,调用linspace函数,前两个参数分别为被分割区间的下限和上限(闭区间),第三个参数为分割个数
  11. array4 =
  12. 1.0000 1.8000 2.6000 3.4000 4.2000 5.0000

单元数组类型

单元数组实际上是一种广义的矩阵,与矩阵不同的是,单元数组可以容纳不同数据类型的元素,通过大括号'{}'来界定数组元素。假如cell是一个单元数组,那么可以通过cell{i,j}的方式来获取cell的元素。

实例代码如下:

  1. ?cell1 = {'demo',1:2:10,5}
  2. cell1 =
  3. 'demo' [1x5 double] [5]
  4. ?whos cell1
  5. Name Size Bytes Class
  6. cell1 1x3 332 cell array
  7. Grand total is 13 elements using 332 bytes
  8. ?cell{1,3}
  9. ans =
  10. 5
  11. ?cell2 = {'demo2','hello';5:-1:0,Inf}
  12. cell2 =
  13. 'demo2' 'hello'
  14. [1x6 double] [ Inf]
  15. ?whos cell2
  16. Name Size Bytes Class
  17. cell2 2x2 444 cell array
  18. Grand total is 21 elements using 444 bytes
  19. ?cell2{2,2}
  20. ans =
  21. Inf
  22. ?a = cell(2,2) % 调用cell函数来创建一个空的单元数组
  23. a =
  24. [] []
  25. [] []
  26. ?a{1,2} = 5
  27. a =
  28. [] [5]
  29. [] []
  30. ?whos a
  31. Name Size Bytes Class
  32. a 2x2 112 cell array
  33. Grand total is 5 elements using 112 bytes

这里要注意的一点是,对于字符串类型,其实是字符数组,那么怎么表示多个字符串组成的数组呢?如果用一般数组表示,会发现出了问题(所有字符串都连接到一起了):

  1. ?strs = ['aa','bcd','ef'];
  2. ?strs
  3. strs =
  4. aabcdef

那么这个时候就可以用单元数组来表示多个字符串的数组了,就不会存在这个问题:

  1. ?strs2 = {'aa','bcd','ef'};
  2. ?strs2
  3. strs2 =
  4. 'aa' 'bcd' 'ef'

map容器类型

map是一种"键-值"对类型的数据类型,是Matlab R2012a版本新增的数据类型,所以下面的示例代码是在正式版Matlab上运行的而非精简版Matlab。可以通过containers.Map函数创建一个map对象,示例代码如下:

  1. >> data = containers.Map({'name','age','location'},{'Tom',20,'USA'});
  2. >> data
  3. data =
  4. Map with properties:
  5. Count: 3
  6. KeyType: char
  7. ValueType: any
  8. >> whos data
  9. Name Size Bytes Class Attributes
  10. data 3x1 8 containers.Map
  11. >> data('name')
  12. ans =
  13. 'Tom'

随机推荐

  1. 系统管理模块_用户管理1_实现用户有关的功能_测试功能、解决事务的问题、对密码进行MD5摘要

    系统管理模块__用户管理1__实现用户有关的功能 了解用户管理要做什么(增删改查初始化密码) 设计实体 分析功能有几个对应几个请求 增删改查有6个请求,初始化密码一个 实现增删改查一组功能的步骤流程 ...

  2. c#基础 第三讲

    Random r = new Random();                 string x, y;             while (true)             {         ...

  3. js让程序暂停运行的方法

    //自己写的暂停毫秒数的函数 function pauseTime(millTime) { var start=Date.now(); while(true){ var nowTime=Date.no ...

  4. js 实现table表格拖拽和点击表头升降序排序

    js 实现table表格拖拽和点击表头升降序排序,写的比较乱,用的时候可以把其中的一些模块函数提取出来 样式,由于是可拖拽表格,所以样式 table tr th{cursor:move;} js实现 ...

  5. setMasksToBounds

    setMasksToBounds 在IB中,当你使用Custom类型的Button时,你可以指定按钮的背景色.但当你运行时按钮就失去了圆角特性,你看到的仅仅是一个方块.因为custombutton没有 ...

  6. Storm-源码分析-Topology Submit-Worker

    1 mk-worker 和其他的daemon一样, 都是通过defserverfn macro来创建worker (defserverfn mk-worker [conf shared-mq-cont ...

  7. 剑指Offer——数组中重复的数字

    题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度 ...

  8. style2paints、deepcolor、sketchkeras项目

    数据集不够怎么办? 1 一些传统的边缘提取算法可以提取图像边缘. 2 这里我们有一个使用神经网络提取线稿图的项目——sketchkeras 源码:https://github.com/lllyasvi ...

  9. golang 系统包自动填写插件

    Make sure $GOPATH/bin is in your $PATH (Windows: %GOPATH%\bin goes in your %PATH%). [保证你的golang环境正常] ...

  10. redis之django-redis

    自定义连接池 这种方式跟普通py文件操作redis一样,代码如下: views.py import redis from django.shortcuts import render,HttpResp ...