数据类型
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
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)短路逻辑或(||)。
如果同一级别的运算符出现在一个表达式中,则按照运算符在表达式中出现的次序,由左到右排列。在具体的程序编写过程中,需要牢记运算符优先级并灵活使用。