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

为了对各种数据类型都能够做到有效处理,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'

随机推荐

  1. ios开发之 --调用系统的页面,显示中文

    在开发的过程中,我们会接入很多的sdk,比如相机,相册,是否允许获取位置等,大多数的情况下是默认显示英文, 在plist文件里面添加一个key就可以了,如下图: key:Localization na ...

  2. poj_2349 Kruskal 最小生成树

    题目大意 给定N个点的坐标,这N个点之间需要进行通讯.通讯方式可以采用卫星通信或无线通信,若两点之间采用为卫星通信,则两点之间的距离无限制,若采用无线通讯,则两点之间的距离不能大于某个值D.      ...

  3. TCL电视直播软件

    升级你的电视系统我的型号46寸 V7300 3D,具体的升级程序在"技术宅"里有下载 找个格式化过的U盘把你的程序拷贝进去,插在电视上,电视会自动升级 当你成功安装V8-0MT32 ...

  4. oracle导入sql文件

    oracle导入sql文件: 1.进入到sql文件目录下,登录需要导入文件的用户 打开cmd,输入以下命令,进入oracle, sqlplus username/password username:需 ...

  5. Python 名称空间与作用域、闭包与装饰器

    Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...

  6. 多线程入门-第五章-线程的调度与控制之yield

    yield与sleep类似,只是不能指定暂停多长时间,并且只能让同优先级的线程有执行的机会,让位时间不固定. /* yield使用 */ public class ThreadTest04 { pub ...

  7. 三种方案在Windows系统下安装ubuntu双系统

    一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已,比如Mac OS对硬件不兼容,Federa安装频繁出错,各种驱动不全等等,不推荐使用虚拟机安装. 个人感觉这是一种对操作系统的亵 ...

  8. python基础-第五篇-5.4正则表达式

    正则基础知识 正则表达式是通过调用re模块实现的 在python里,正则表达式处理对象为字符串,所以正则里方法和字符串的方法有很多相似的地方:re.findall和find,re.split和spli ...

  9. java基础07 循环结构

    public class While02 { public static void main(String[] args) { /** * while(循环条件){ * 循环体(循环操作) * } * ...

  10. type为number的<input>标签 type和size属性失效

    html5中input的type属性增的可取值新增几种,对于不支持这几种新增值的浏览器会统一解析为text类型. Firefox.ie9不支持