本节书摘来自异步社区《MATLAB图像处理375例》一书中的第1章,第1.6节,作者:MATLAB技术联盟著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.6 MATLAB基本数值类型
MATLAB图像处理375例
MATLAB的基本数据类型变量或者对象主要用来描述基本的数值对象,MATLAB的基本数据类型是双精度数据类型和字符类型,不同数据类型的变量或对象占用的内存空间不同,不同的数据类型的变量或对象也具有不同的操作函数。MATLAB还存在一些其他的数据。
(1)常量数据:在使用MATLAB过程中由MATLAB提供的公共数据,数据可以通过数据类型转换的方法转换常量到不同的数据类型,还可以被赋予新的数值。
(2)空数组或空矩阵:在创建数组或者矩阵时,可以使用空数组或空矩阵辅助创建数组或者矩阵。
其基本数据类型如表1-4所示。
在MATLAB中,class函数可以用来获取变量或对象的类型、创建用户自定义的数据类型。
例如,在命令窗口输入:
A=[1 2 3];
class(A)
B=int16(A);
class(B)
whos
运行结果如下。
ans =
double
ans =
int16
Name Size Bytes Class Attributes
A 1x3 24 double
B 1x3 6 int16
ans 1x5 10 char
MATLAB和C语言在处理数据类型和变量时的区别是:在C语言中,任何变量在使用之前必须声明,然后赋值,在声明变量时就指定了变量的数据类型;在MATLAB中,任何数据变量都不需要预先声明,MATLAB将自动将数据类型设置为双精度类型。下面举例进行说明。
MATLAB系统默认的运算都是针对双精度类型的数据或变量,稀疏矩阵的元素仅能使用双精度类型的变量,sparse类型的数据变量和整数类型数据、单精度数据类型变量之间的转换是非法的,在进行数据类型转换时,若输入参数的数据类型就是需要转换的数据类型,则MATLAB忽略转换,保持变量的原有特性。
【例1-34】MATLAB处理数据类型和变量示例。
D=[1 2 3];
E=[3 4 5];
F=D+E;
whos
int16(D)+int16(E)
C=int16(D+E)
运行结果如下。
Name Size Bytes Class Attributes
D 1x3 24 double
E 1x3 24 double
F 1x3 24 double
ans =
4 6 8
C =
4 6 8
1.6.1 整数类型数据运算
在MATLAB中提供了整数类型数据的运算函数,如表1-5所示。注意:参与整数运算的数据都必须大于0。
【例1-35】数据位“与”操作。
A=85;B=75;
C=bitand(A,B)
a=uint16(A);b=uint16(B);
c=bitand(a,b)
whos
运行结果如下。
C =
65
c =
65
Name Size Bytes Class Attributes
A 1x1 8 double
B 1x1 8 double
C 1x1 8 double
D 1x3 24 double
E 1x3 24 double
F 1x3 24 double
a 1x1 2 uint16
ans 1x3 6 int16
b 1x1 2 uint16
c 1x1 2 uint16
【例1-36】数据位操作(bitset函数)示例。
A=86;
dec2bin(A)
B=bitset(A,6)
dec2bin(B)
C=bitset(A,7,0)
dec2bin(C)
运行结果如下。
ans =
1010110
B =
118
ans =
1110110
C =
22
ans =
10110
【例1-37】数据位操作(bitget函数)示例。
A=74;
dec2bin(A)
bitget(A,6)
bitget(A,3)
运行结果如下。
ans =
1001010
ans =
0
ans =
0
1.6.2 变量与常量
在MATLAB中,变量名可以有19个字符。字母A~Z、a~z、数字和下划线可以作为变量名,但第一个字符必须是一个字母。预定义函数名也可以像一个变量名那样使用,但函数只有在变量由命令clear删除后才能使用,所以不主张这样使用。
MATLAB是区分大小字母的,如矩阵a 和A 是不一样的。MATLAB命令通常是用小写字母书写。例如,命令abs(A)给出了A的绝对值,但ABS(A)会导致在屏幕上显示错误信息:在变量使用之前,用户不需要指定一个变量的数据类型,也不必声明变量。
MATLAB有许多不同的数据类型,这对决定变量的大小和形式是有价值的,特别适合于混合数据类型、矩阵、细胞矩阵、结构和对象。对于每一种数据类型,有一个名字相同的、可以把变量转换到那种类型的函数。在MATLAB中提供了一些常量,如表1-6所示。
eps、realmax、realmin三个常量具体的数值与运行MATLAB的计算机相关,不同的计算机系统可能具有不同的数值。例如:
eps
realmax
realmin
运行结果如下:
ans =
2.2204e-16
ans =
1.7977e+308
ans =
2.2251e-308
MATLAB的常量数值是可以修改的,例如:
pi=100
clear
pi
运行结果如下:
pi =
100
ans =
3.1416
将inf应用于函数,计算结果可能为inf或NaN。进行数据转换时,inf将获取相应数据类型的最大值,而NaN返回相应整数数据类型的数值0,浮点数类型则仍然 为NaN。
A=Inf;
class(A)
B=int16(A)
C=sin(A)
sin(C)
class(C)
int64(C)
int32(C)
运行结果如下:
ans =
double
B =
32767
C =
NaN
ans =
NaN
ans =
double
ans =
0
ans =
0
MATLAB的常量是可以赋予新的数值的。一旦被赋予了新的数值,则常量代表的就是新值,而不是原有的值,只有执行clear命令后,常量才会代表原来的值。
【例1-38】最小复数单位的使用。
a=i
i=1
b=i+j
clear
c=i+j
运行结果如下:
a =
0.0000 + 1.0000i
i =
1
b =
1.0000 + 1.0000i
c =
0.0000 + 2.0000i
1.6.3 数值
在MATLAB中,数值均采用习惯的十进制,可以带小数点及正负号。例如,以下写法都是合法的。
108 -35.8 -0.008 0.004
科学计数法采用字符e来表示10的幂。例如:
8.45e2 1.26e3 -2.1e-5
虚数的扩展名为i或者j。例如:
2i 3ej -3.14j
在采用IEEE浮点算法的计算机上,实数的数值范围大致为10-308~10308。
在MATLAB中输入同一数值时,有时会发现,在命令行窗口中显示数据的形式有所不同。例如,0.3有时显示0.3,有时会显示0.300。这是因为数据显示格式是不同的。
在一般情况下,MATLAB内部每一个数据元素都是用双精度数来表示和存储的,数据输出时用户可以用format命令设置或改变数据输出格式。表1-7揭示了不同种类的数据显示格式。
表1-7 数据显示格式
表示十六进制格式。例如:400921fb54442d18
【例1-39】在不同数据格式下显示pi的值。
>>pi
ans =
3.1416
>> format long
>> pi
ans =
3.141592653589793
>> pi
ans =
3.141592653589793
>> format short e
>> pi
ans =
3.1416e+00
>> format long g
>> pi
ans =
3.14159265358979
>> format hex
>> pi
ans =
400921fb54442d18
1.6.4 表达式
在MATLAB中,数学表达式的运算操作尽量设计得接近于习惯,不同于其他编程语言在有些情况下一次只能处理一个数据,MATLAB却允许快捷、方便地对整个矩阵进行操作。MATLAB表达式采用熟悉的数学运算符和优先级,如表1-8所示(表中运算符的优先级从上到下依次升高)。
MATLAB与经典的数学表达式也有所差别。例如,对矩阵进行右除与左除操作的结果是不同的。下面通过一个简单的例子演示复数矩阵的转置与共轭转置操作及其区别。
【例1-40】求复数矩阵的转置及共轭转置。
format short
A=[1 4;3 7]+[12 0;9 12]*i
A' %复数矩阵A转置
A.' %共轭转置
运行结果如下:
A =
49 4
39 55
ans =
49 39
4 55
ans =
49 39
4 55
1.6.5 空数组
空数组是指某一个维或者某些维的长度为0的数组,为了完成某些MATLAB操作和运算而专门设计的一种数组,利用空数组可以修改数组的大小,但不能修改数组的维数。空数组不意味着什么都没有,空数组类型的变量在MATLAB的工作空间中是存在的。
使用空数组可以将大数组删除部分行或列,也可以删除多维数组的某一页。
【例1-41】创建空数组示例。
A=[]
B=ones(2,3,0)
C=randn(2,3,4,0)
whos
运行结果如下。
A =
[]
B =
Empty array: 2-by-3-by-0
C =
Empty array: 2-by-3-by-4-by-0
Name Size Bytes Class Attributes
A 0x0 0 double
B 2x3x0 0 double
C 4-D 0 double
【例1-42】使用空数组删除示例。
A=reshape(1:24,4,6)
%删除第2、3、4列
A(:,[2 3 4])=[]
运行结果如下:
A =
1 5 9 13 17 21
2 6 10 14 18 22
3 7 11 15 19 23
4 8 12 16 20 24
A =
1 17 21
2 18 22
3 19 23
4 20 24
1.6.6 逻辑运算
在MATLAB中,逻辑数据类型就是仅具有两个数值的一种数据类型,True用1表示、False用0表示;任何数值都可以参与逻辑运算,非零值看作逻辑真,零值看作逻辑假。
逻辑类型的数据只能通过数值类型转换,或者使用特殊的函数生成相应类型的数组或者矩阵。表1-9揭示了创建逻辑类型数据的函数。
在使用true或者false函数创建逻辑类型数组时,若不指明参数,则创建一个逻辑类型的标量。在MATLAB中有些函数以is开头,是用来完成某种判断功能的函数:isnumeric() 判断输入的参数是否为数值类型,islogical() 判断输入的参数是否为逻辑类型……例如:
a=true
b=false
c=1
isnumeric(a)
isnumeric(c)
islogical(a)
islogical(b)
islogical(c)
运行结果如下:
a =
1
b =
0
c =
1
ans =
0
ans =
1
ans =
1
ans =
1
ans =
0
在MATLAB中,逻辑运算是指能够处理逻辑类型数据的运算,如表1-10所示。
参与逻辑运算的操作数不一定必须是逻辑类型的变量或常量,其他类型的数据也可以进行逻辑运算,但运算结果一定是逻辑类型的数据。例如:
a=eye(3)
b=a;b(3,1)=1
a&b
whos
运行结果如下。
a =
1 0 0
0 1 0
0 0 1
b =
1 0 0
0 1 0
1 0 1
ans =
1 0 0
0 1 0
0 0 1
Name Size Bytes Class Attributes
A 4x3 96 double
B 2x3x0 0 double
C 4-D 0 double
a 3x3 72 double
ans 3x3 9 logical
b 3x3 72 double
c 1x1 8 double
具有短路作用的逻辑“与”操作(&&)和“或”操作(||),在进行a && b && c && d运算时,若a为假(0),则后面的三个变量都不再被处理,运算结束,并返回运算结果逻辑假(0);进行a || b || c || d运算时,若a为真(1),则后面的三个变量都不再被处理,运算结束,并返回运算结果逻辑真(1)。
【例1-43】逻辑运算示例。
a=0;b=1;c=2;d=3;
a&&b&&c&&d
a=0;b=2;c=6;d=8;
a&&b&&c&&d
a=10;b=1;c=2;d=3;
a||b||c||d
a=10;b=0;c=7;d=9;
a||b||c||d
whos
运行结果如下。
ans =
0
ans =
0
ans =
1
ans =
1
Name Size Bytes Class Attributes
A 4x3 96 double
B 2x3x0 0 double
C 4-D 0 double
a 1x1 8 double
ans 1x1 1 logical
b 1x1 8 double
c 1x1 8 double
d 1x1 8 double
【例1-44】函数any和all的使用示例(对向量)。
a=[1 2 3 0];
any(a)
all(a)
b=[0 0 0 0];
any(b)
all(b)
c=[1 2 3 4];
any(c)
all(c)
运行结果如下:
ans =
1
ans =
0
ans =
0
ans =
0
ans =
1
ans =
1
【例1-45】函数any和all的使用示例(对矩阵)。
a=[1 0 2;3 0 0;1 3 0;1 1 1]
any(a)
all(a)
运行结果如下。
a =
1 0 2
3 0 0
1 3 0
1 1 1
ans =
1 1 1
ans =
1 0 0
1.6.7 关系运算
在MATLAB中,关系运算是用来判断两个操作数关系的运算,表1-11揭示了MATLAB的关系运算符。
参与关系运算的操作数可以是各种数据类型的变量或者常数,运算结果是逻辑类型的数据,标量可以和数组(或矩阵)进行比较,比较时自动扩展标量,返回的结果是和数组同维的逻辑类型数组。若比较的是两个数组,则数组必须是同维的,且每一维的尺寸必须一致。
【例1-46】利用“()”和各种运算符相结合完成复杂的关系运算。
A=reshape(-3:5,3,3)
A>=0
B=~(A>=0)
whos
运行结果如下。
A =
-3 0 3
-2 1 4
-1 2 5
ans =
0 1 1
0 1 1
0 1 1
B =
1 0 0
1 0 0
1 0 0
Name Size Bytes Class Attributes
A 3x3 72 double
B 3x3 9 logical
C 4-D 0 double
a 4x3 96 double
ans 3x3 9 logical
b 1x4 32 double
c 1x4 32 double
d 1x1 8 double