MATLAB完全自学教程
上QQ阅读APP看书,第一时间看更新

2.6 数值数据类型

数值是MATLAB中数学运算的最基本对象之一。在MATLAB中,主要包括各种有无符号的整数型数据、双精度型数据及单精度型数据等。本节主要介绍这些数值数据类型。

2.6.1 整数

MATLAB支持表2-3所示的各种整数类型,主要包括8位、16位、32位及64位的有符号和无符号类型的整数数据类型。由于在MATLAB中默认的数据是双精度型的数据,因此,在定义整数变量时,需要指定变量的数据类型。

表2-3 MATLAB中的整数类型

需要说明的是,虽然表2-3中定义的整数数据类型不同,但是这些类型的数据具有相同的性质,例如下面的程序。

>> x1=int8(1:9)
x1 =
1    2    3    4    5    6    7    8    9
>> x2=int8(randperm(9))
x2 =
6    3    7    8    5    1    2    4    9
>> x1+x2
ans =
7    5   10   12   10    7    9   12   18
>> x1-x2
ans =
-5   -1   -4   -4    0    5    5    4    0
>> x1.*x2
ans =
6    6   21   32   25    6   14   32   81
>> x1./x2
ans =
0    1    0    1    1    6    4    2    1

每种类型的数据都可以通过函数intmax()和intmin()来查询此种数据的上下限。

2.47 利用intmax()和intmin()函数查询数据的上下限。

>> a=int16(50)
a =
50
>> intmin('int16')
ans =
-32768
>> intmax('int16')
ans =
32767
>> class(a)
ans =
int16

以上代码显示出MATLAB中的整数定义方法及其默认的数据类型,同时通过intmin()函数和intmax()函数来获取整数的上下限。此外,class()函数可以获取所定义变量的数据类型,如下面的程序。

>> b=65
b =
65
>> class(b)
ans =
double

上面的例子通过两种方式定义了两个int8类型的整数向量,这两个向量的元素之间进行加、减、乘、除运算。其中,randperm(9)函数随机生成1~9的随机向量。在进行乘、除运算时,在向量后加“.”表示两个向量之间进行元素间的乘、除运算。需要注意的是,在进行除法运算时,MATLAB首先将向量中的整数元素作为双精度类型的数据进行运算,然后根据四舍五入的原则得到整数相除的结果。

在MATLAB的命令行窗口中输入如下内容。

>> x1
x1 =
1    2    3    4    5    6    7    8    9
>> class(x1)
ans =
int8
>> x2=cast(x1,'uint16')
x2 =
1      2      3      4      5      6      7      8      9
>> x1+x2
Error using  +
Integers can only be combined with integers of the same class, or scalar doubles.
>> x2+5
ans =
6      7      8      9     10     11     12     13     14
>> class(ans)
ans =
uint16

从以上内容可以看出,不同类型的整数之间不能进行数学运算。但是,MATLAB支持双精度标量和整数之间的数学运算,原因在于MATLAB是将双精度标量转化成整数再进行运算,如下面的程序。

>> x1=int8(randperm(9))
x1 =
7    2    8    5    6    9    4    1    3
>> x1=x1+110
x1 =
117  112  118  115  116  119  114  111  113
>> x2=cast(x1,'uint8')
x2 =
117  112  118  115  116  119  114  111  113
>> x2-115
ans =
2    0    3    0    1    4    0   0    0

在MATLAB的整数中,每种类型的整数都存在一定的数值范围,因此在数学运算过程中会产生结果溢出问题。当运算过程中产生结果溢出问题时,MATLAB采用饱和处理问题的方式处理,即将运算结果设定为溢出方向的上下限数值。在进行混合数据运算时,MATLAB仅支持双精度标量和整数之间进行运算。由于整数之间的运算关系,MATLAB只支持同种类型的整数之间进行运算,因此,除64位的整数之外,整数的存储速度比双精度数据的存储速度要快得多。

2.6.2 浮点数

双精度类型(double)是MATLAB的默认数据类型。有时为节省存储空间,MATLAB也支持单精度类型(single)的数据。单精度和双精度类型的数据的取值范围可以用函数realmin()、realmax()得到。单精度类型浮点数的精度可以通过函数eps()得到。

此外,需要注意的是对于单精度类型的数据变量,创建方法和整数的创建方法相同。而对于单精度数据和双精度数据之间的混合运算,运算结果为单精度的数据结果。

2.48 浮点数运算举例。

>> realmin('single')
ans =
1.1755e-038
>> realmax('single')
ans =
3.4028e+038
>> realmin('double')
ans =
2.2251e-308
>> realmax('double')
ans =
1.7977e+308
>> eps
ans =
2.2204e-016
>> x1=single(1:9)
x1 =
1     2     3     4     5     6    7     8     9
>> x2=ones(1,4,'single')
x2 =
1     1     1     1
>> class(x1)
ans =
single
>> class(x2)
ans =
single
>> x3=rand(1,9)
x3 =
0.7922  0.9595  0.6557  0.0357  0.8491  0.9340  0.6787  0.7577 0.7431
>> class(x3)
ans =
double
>> x4=x1+x3
x4 =
Columns 1 through 3
1.7922    2.9595    3.6557
Columns 4 through 6
4.0357    5.8491    6.9340
Columns 7 through 9
7.6787    8.7577    9.7431
>> class(x4)
ans =
single

2.6.3 整数和浮点数之间的操作函数

MATLAB中提供了大量的数据操作函数,可以进行不同数据类型变量的创建或数据之间的转换处理。表2-4所示为其中的一部分数据操作函数,主要实现整数变量或数据与双精度类型变量或数据之间的转换操作。

表2-4 MATLAB中常见的数据操作函数

表2-4中,type为numeric、integer、float及其他类型的数据类型。

2.6.4 复数

MATLAB 的一个比较强大的功能是能够直接在复数域上进行运算,而不用进行任何特殊的操作。而有些编程语言在定义复数的时候,需要进行特殊的处理。在MATLAB中,复数的书写方法和运算表达形式与数学中复数的书写方法和运算表达形式相同,复数单位可以通过i或j来表达。

在MATLAB中,可以使用命令来进行复数的极坐标形式和直角坐标形式之间的转换。通过欧拉恒等式,可以将复数的极坐标形式和直角坐标形式联系起来,即可表示为。在MATLAB中,利用系统所提供的内置转换命令,可以很方便地得到复数的一些基本数值。举例如下。

real(z):计算复数的实部z=rcosθ

imag(z):计算复数的虚部z=rsinθ

abs(z):计算复数的模

angle(z):以弧度为单位给出复数的相位角

2.49 复数的基本运算举例。

>> z1=2+3i         %复数一般表达式
z1 =
2.0000 + 3.0000i
>> z2=3*exp(i*pi/4)     %以极坐标形式表达复数
z2 =
2.1213 + 2.1213i
>> z3=complex(1,2)      %通过函数定义复数
z3 =
1.0000 + 2.0000i
>> z4=sqrt(-4)          %运算得到复数
z4 =
0 + 2.0000i
>> z5=6+sin(1)i
z5=6+sin(1)i
Error: Unexpected MATLAB expression.
>> z5=6+sin(1)*i                %符号函数定义
z5 =
6.0000 + 0.8415i
>> z=z1*z2/z3
z =
3.8184 + 2.9698i
>> z=3+4i
z =
3.0000 + 4.0000i
>> real_z=real(z)               %实部
real_z =
3
>> imag_z=imag(z)               %虚部
imag_z =
4
>> mag_z=abs(z)                 %模
mag_z =
5
>> angle_z=angle(z)             %相位角(弧度)
angle_z =
0.9273
>> angle_z=angle(z)*180/pi      %相位角(角度)
angle_z =
53.1301

下面举例介绍利用roots()函数求解多项式复数根,其中涉及的输出函数会在后续章节详细介绍,此处暂不展开。

2.50 利用MATLAB求解复数的根,并将这些根用图形表达出来。

>> res=(-15)^(1/3)         %直接求解复数的根
res =
1.2331 + 2.1358i
p=[1,0,0,0,0,0,25];        %构造多项式求解所有根
>> r=roots(p)
r =
-1.4809 + 0.8550i
-1.4809 - 0.8550i
-0.0000 + 1.7100i
-0.0000 - 1.7100i
1.4809 + 0.8550i
1.4809 - 0.8550i
>> t=0:pi/30:2*pi;
>> x=1.71*sin(t);
>> y=1.71*cos(t);
>> plot(x,y,'b'),grid on
>> plot(x,y,'b'),grid on
>> hold on
>> plot(r(4),'.','MarkerSize',30,'color','r')
>> plot(r([1,2,3,5,6]),'o','MarkerSize',15,'color','b')
>> axis([-3,3,-3,3]),axis square
>> hold off

为得到−25的6次方根,通过构造多项式函数得到了所有根。最后,通过使用MATLAB提供的绘图函数表示得到的5个根,如图2-1所示。

图2-1 求解复数的根