数据类型

MATLAB提供了多种数据类型,以供用户在不同的情况下使用。用户可以建立浮点型或者整型矩阵和数组、字符和字符串、逻辑true或者false、函数句柄、结构(Structures)数组、元胞(cell)数组、Map容器、日期和时间、分类数组(Categorical)、表格、时间序列等。

在MATLAB中任何一种数据类型都是以矩阵或者数组的形式来表示。这里说的矩阵或者数组,是指最小的00或N维任何尺寸的矩阵或者数组。

1.数值型

MATLAB中的数值型包括有符号和无符号的整数、单精度和双精度浮点数。默认情况下,MATLAB存储数据使用的是双精度浮点数。用户不可以更改默认的数据类型和精度,但是可以选择用非默认的整数或者单精度来储存矩阵或者数组。整数和单精度数组比双精度能节省更多的内存空间,灵活运用可以更高效地利用内存。

所有的数值型数组都支持基本的数组操作,比如说数组的重构、使用数学运算符等。

数值型数组或矩阵比较简单,因篇幅有限这里不再赘述。

2.逻辑型

逻辑型的数据是我们经常使用到的数据类型之一。本节介绍MATLAB中的逻辑型数据的使用方法。

2.1逻辑型简介

所谓逻辑数据类型,就是仅具有“TRUE”和“FALSE”两个数值的一种数据类型。一般来说,逻辑真用1表示,逻辑假用0表示。在MATLAB中,参与逻辑运算或者关系运算的并不一定必须是逻辑型的数据,任何数值都可以参与逻辑运算。在逻辑运算中,MATLAB将所有的非零值作为逻辑真来进行计算,而将零值作为逻辑假来计算。

和一般的数值型类似,逻辑类型的数据可以通过数值型转换,或者使用创建函数生成。

创建逻辑类型矩阵或者数组的函数主要有以下3个。

(1)logical函数。可将任意类型的数组转换成逻辑类型。其中非零元素为真,零元素为假。

(2)true函数。产生全部元素为逻辑真的数组。

(3)false函数。产生全部元素为逻辑假的数组。

【例3-1】  利用函数建立逻辑类型数组示例。

>> rand('state',0)

>> a=rand(4,3)                       % 产生测试矩阵

0.9501    0.8913    0.8214

0.2311    0.7621    0.4447

0.6068    0.4565    0.6154

0.4860    0.0185    0.7919

>> a(a<0.6)=0                       % 产生测试矩阵

0.9501    0.8913   0.8214

0    0.7621         0

0.6068         0    0.6154

0         0    0.7919

>> b=logical(a)                    %  计算逻辑型矩阵b

1     1    1

0     1    0

1     0    1

0     0    1

>> c=true(size(a))                  %  生成全为true的矩阵

1     1    1

1     1    1

1     1    1

1     1    1

>> d=false([size(a),2])               %  生成全为false的矩阵

0     0    0

0     0    0

0     0    0

0     0    0

0     0    0

0     0    0

0     0    0

0     0    0

>> whos                              %  查看现有的变量与数据类型

Name      Size             Bytes  Class     Attributes

a         4x3                 96  double

b         4x3                 12  logical

c         4x3                 12  logical

d         4x3x2               24  logical

由最后对结果的比较可以看出,逻辑类型的数组每一个元素仅占用一个字节的内存空间,所以矩阵b尽管和矩阵a的尺寸一样,但是在内存的占用上却有相当大的差距,并且属于不同的数据类型,这会影响计算的效率与数据的处理方式,因为逻辑型的数据在使用二进制进行计算时速度要快的多。

2.2 返回逻辑结果的函数

表3-1中所列的MATLAB操作将会返回逻辑型的true或者false。

需要说明的是:参与逻辑运算的数组不一定必须是逻辑类型的变量或常数,也可以是其他类型的数据,但是运算的结果一定是逻辑类型的数据。

表3-1        逻辑运算

运算符或函数

说    明

运算符或函数

说    明

具有短路作用的逻辑“与”操作,仅能处理标量

关系操作符,等于

具有短路作用的逻辑“或”操作,仅能处理标量

关系操作符,不等于

元素“与”操作

关系操作符,小于

元素“或”操作

关系操作符,大于

逻辑“非”操作

关系操作符,小于等于

逻辑“异或”操作

关系操作符,大于等于

当向量中的元素有非零元素时,返回真

所有以is开头的函数,cellfun

测试操作

当向量中的元素都是非零元素时,返回真

strcmp, strncmp, strcmpi, strncmpi

字符串比较函数

所谓具有短路作用是指:在进行&&或||运算时,若参与运算的变量有多个,例如a&&b&&c&&d,若a、b、c、d等4个变量中的a为false,则后面的3个都不再被处理,运算结束,并返回运算结果false。

关系运算操作符可以适用于各种数据类型的变量或者常数,运算的结果是逻辑类型的数据。标量也可以和矩阵或者数组进行比较,比较的时候将自动扩展标量,返回的结果是和数组同维的逻辑类型数组。如果进行比较的是两个数组,则数组必须是同维的,且每一维的尺寸也必须一致。

【例3-2】  逻辑与、或、非使用示例。

>> a=[1 2 3;4 5 6];

>> b=[1 0 0;0 -2 1];

>> A=a&b                %  逻辑“与”

1     0    0

0     1    1

>> B=a|b                %  逻辑“或”

1     1    1

1     1    1

>> C=~b                 %  逻辑“非”

0     1    1

1     0    0

【例3-3】  函数any 和all的使用示例。

>> a=[1 1 0; 1 0 0;1 0 1]

1     1    0

1     0    0

1    0     1

>> A=all(a)                %  每列元素均为非零时返回真

1     0    0

>> B=any(a)                %  每列元素存在非零时返回真

1     1    1

本例首先创建数组a=[1 1 0; 1 0 0;1 0 1],因为a的第1列均为1,所以all命令返回了1;而其他列含有0,所以返回了0,如结果中A显示的那样。any函数在数组一列中含有非0元素时就会返回逻辑1,所以B中的元素全部为1。

【例3-4】  isstrprop函数使用示例。isstrprop函数可以用来判断一个字符串中的各字符是否属于某一类别。

>> A = isstrprop('abc123def', 'alpha')

1     1    1     0     0    0     1     1     1

本例中,'alpha'参数的作用就是判断输入字符串abc123def中哪些元素是字母。是字母的字符相对应地返回逻辑值true,也就是1。而数字所对应返回的是false,也就是0。

【例3-5】  关系运算示例。

>> a=[0 -1  2];

>> b=[-3 1  2];

>> a<b                                %  对应元素比较大小

0     1    0

>> a>b                                %  对应元素比较大小

1     0    0

>> a<=b                                %  对应元素比较大小

0     1    1

>> a>=b                                %  对应元素比较大小

1     0    1

>> a==b                                %  对应元素比较相等

0     0    1

>> a~=b                                %  对应元素比较不相等

1     1    0

2.3 运算符的优先级

在MATLAB语言中,可以自由组合运算符,组成更为复杂的运算表达式。需要注意的是:MATLAB语言中的运算符和其他的高级编程语言一样,具有优先级问题。对运算优先级的掌握,可以使我们正确地完成复杂的运算。下面将MATLAB语言的运算符和计算优先级,按照从高到低的顺序进行排列。

(1)括号()。

(2)数组的转秩(.’),数组幂(.^),复转秩(’),矩阵幂(^)。

(3)代数正(+),代数负(-),逻辑非(~)。

(4)数组乘法(.*),数组除法(./),数组除(./),矩阵乘法(*),矩阵右除(/),矩阵左除(\)。

(5)加法(+),减法(-)。

(6)冒号运算符(:)。

(7)小于(<),小于等于(<=),大于(>),大于等于(>=),等于(==),不等于(~=)。

(8)元素与(&)。

(9)元素或(|)。

(10)短路逻辑与(&&)。

(11)短路逻辑或(||)。

如果同一级别的运算符出现在一个表达式中,则按照运算符在表达式中出现的次序,由左到右排列。在具体的程序编写过程中,需要牢记运算符优先级并灵活使用。