全国热线电话:13633878273
发布时间: 2015-02-02 16:08:03
数字为数学运算的最基本对象。在MATLAB 中,数字的数据类型有双精度(double)型、单精度型和各种有符号和无符号整数型。本节主要介绍这些数据类型。
整数
MATLAB 支持8 位、16 位、32 位和64 位的有符号和无符号整数数据类型,如表2-11所示。
上述整数数据类型除了定义范围不同外,具有相同的性质。
由于MATLAB 默认的数据类型为双精度型,因此在定义整型变量时,需指定变量的数据类型。
例2-8 整型数据类型的定义。
>> x=int8(50) %指定x 的数据类型为int8
x =
50
>> class(x)
ans =
int8
>> y=50 %未指定y 的数据类型
y =
50
>> class(y)
ans =
double
类型相同的整数之间可以进行运算,返回相同类型的结果。在进行加、减和乘法运算时比较简单,在进行除法运算时稍微复杂一些,因为在多精度情况下,整数的除法不一定能得到整数的结果。在进行除法运算时,MATLAB 首先将两个数视为双精度类型进行运算,然后将结果转化为相应的整型数据。
例2-9 整数的运算。
>> x=int8(45)
x =
45
>> y=int8(-2)
y =
-2
>> z1=x+y
z1 =
43
>> z2=x-y
z2 =
47
>> z3=x*y
z3 =
-90
>> z4=x/y
z4 =
-23
>> class(z1),class(z2),class(z3),class(z4)
ans =
int8
ans =
int8
ans =
int8
ans =
int8
MATLAB 中不允许进行不同整数类型之间的运算。
例2-10 不同整数类型之间不允许进行运算。
>> x=int8(40);
>> y=int16(20);
>> z=x+y
Error using +
Integers can only be combined with integers of the same class, or scalar
doubles.
由于每种整数数据类型都有相应的取值范围,因此数学运算有可能产生结果溢出。MATLAB 利用饱和处理解决此类问题,即当运算结果超出了此类数据类型的上限或下限时,系统将结果设置为该上限或下限。
例2-11 整数运算中的数据溢出。
>> x=int8(100);
>> y=int8(90);
>> z=x+y
z =
127
>> x-3*y
ans =
-27
>> x-y-y-y
ans =
-128
当计算x+y 时,结果溢出上限,因此结果为127;计算x-3*y 时,3*y 溢出上限,结果为127,继续计算,得到最后结果-27;计算x-y-y-y 时,从左到右进行计算,结果溢出下限,因此结果为-128。
2.3.2 浮点数
MATLAB 的默认数据类型是双精度类型(Double)。为了节省存储空间,MATLAB 也支持单精度数据类型的数组。单精度和双精度数据类型的取值范围和精度可以通过例2-12 的方式进行查看。例2-12 单精度和双精度数据类型的取值范围和精度。
>> realmin('single')
ans =
1.1755e-38
>> realmax('single')
ans =
3.4028e+38
>> eps('single')
ans =
1.1921e-07
>> realmin('double')
ans =
2.2251e-308
>> realmax('double')
ans =
1.7977e+308
>> eps('double')
ans =2.2204e-16
创建单精度类型的变量时需要声明变量类型,与创建整型变量类似。单精度数据类型的数据进行运算时,返回值为单精度。
复数
复数由两个部分组成:实部和虚部。在 MATLAB 中虚数单位由i 或者j 表示。MATLAB 中可以通过两种方法创建复数:第一种方法为直接输入法,第二种方法为
通过complex 函数实现。直接输入法见例2-13。
另一种创建复数的方法为通过complex 函数。complex 函数的调用方法如下。
(1) c = complex(a,b):返回结果c 为复数,其实部为a,虚部为b。输入参数a 和b 可以为标量,或者维数、大小相同的向量、矩阵或者多维数组;输出参数与a 和b 的结构相同。a 和b 可以有不同的数据类型,当a 和b 为各种不同的类型时,返回值分别如下。
① 当a 和b 中有一个为单精度时,返回结果为单精度。
② 如果a 和b 其中一个为整数类型,则另外一个必须有相同的整数类型,或者为 双精度型,返回结果c 为相同的整数类型。
(2) c = complex(a):只有一个输入参数,返回结果c 为复数,其实部为a,虚部为0。但是此时c 的数据类型为复数。
例2-14 通过complex 函数创建复数。
>> a = uint8([1;2;3;4]);
>> b = uint8([2;2;7;7]);
>> c = complex(a,b)
c =
1 + 2i
2 + 2i
3 + 7i
4 + 7i
例2-15 通过complex 函数创建复数和直接创建复数的比较。
>> x=4;y=0;
>> z1=x+i*y;
>> z2=complex(x,y);
>> isreal(z1),isreal(z2)
ans =1
ans =0
逻辑变量
逻辑数据类型通过1 和0 分别表示逻辑真和逻辑假。一些MATLAB 函数或操作符会返回逻辑真或逻辑假表示条件是否满足,如表达式(5 * 10) > 40 返回逻辑真。在MATLAB 中,存在逻辑数组,如下面的表达式返回逻辑数组。
>> [30 40 50 60 70] > 40
ans =
0 0 1 1 1
1. 逻辑数组的创建
创建逻辑数组最简单的方法为直接输入元素的值为true 或者false。
例2-16 直接创建逻辑数组。
>> x = [true, true, false, true, false]
x =
1 1 0 1 0
>> class(x)
ans =
logical
逻辑数组也可以通过逻辑表达式生成,如例2-17。
例2-17 通过逻辑表达式生成逻辑数组。
>> x = magic(4) >= 9
x =
1 0 0 1
0 1 1 0
1 0 0 1
0 1 1 0
MATLAB 中返回逻辑值的函数和操作符如表2-12 所示。
对于大型的逻辑数组,如果其中只有少数元素为1,可以采用稀疏矩阵的方式进行存
储和运算,如下所示。
>> x = sparse(magic(20) > 395)
x =
(1,1) 1
(1,4) 1
(1,5) 1
(20,18) 1
(20,19) 1
2. 逻辑数组的应用
MATLAB 中逻辑数组主要有两种应用:用于条件表达式和用于数组索引。如果仅当条件成立时执行某段代码,可以应用逻辑数组进行判断和控制,如例2-18。例2-18 通过逻辑数组控制程序流程。
>> str = 'Hello';
>> if ~isempty(str) && ischar(str)
sprintf('Input string is ''%s''', str)
end
ans =Input string is 'Hello'
该段程序中,只有当str 非空并且为字符串时,执行sprintf 语句。
在MATLAB 中支持通过一个数组对另一个数组进行索引,如下所示。
>> A = 5:5:50
A =
5 10 15 20 25 30 35 40 45 50
>> B = [1 3 6 7 10];
>> A(B)
ans =
5 15 30 35 50
通过数组B 对数组A 的第1、3、6、7、10 个元素进行访问。另外,MATLAB 允许以逻辑数组作为数组索引,对数组元素进行访问,见例2-19。例2-19 通过逻辑数组对数组进行索引,将数组A 中超过0.5 的元素置为0。
>> A = rand(5);
>> B = A > 0.5;
>> A(B) = 0
A =
0 0.0975 0.1576 0.1419 0
0 0.2785 0 0.4218 0.0357
0.1270 0 0 0 0
0 0 0.4854 0 0
0 0 0 0 0
例2-20 通过逻辑数组对数组进行索引,将数组A 中非素数置为0。
>> A = magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> B = isprime(A)
B =
0 1 1 1
1 1 0 0
0 1 0 0
0 0 0 0
>> A(~B) = 0
A =
0 2 3 13
5 11 0 0
0 7 0 0
0 0 0 0
3. 逻辑数组的判断
MATLAB 中提供了一组函数用于判断数组是否为逻辑数组,如表2-13 所示。
例2-21 判断数组是否为逻辑数组。
>> C{1,1} = pi;
>> C{1,2} = 1;
>> C{1,3} = ispc;
>> C{1,4} = magic(3)
C =
[3.1416] [1] [1] [3x3 double]
>> for k = 1:4
x(k) = islogical(C{1,k});
end
>> x
x =
(3,1) 1
(1,4) 1
(1,5) 1
(20,18) 1
(20,19) 1
各种数据类型之间的转换
在MATLAB 中,各种数据类型之间可以互相转换,转换方式为:(1) datatype(variable),
其中datatype 为目标数据类型,variable 为待转换的变量;(2) cast(x,'type'),将x 的类型转
换为'type'指定的类型。
例2-22 数据类型之间的转换。
>> x=single(6.9)
x =
6.9000
>> x1=int8(x)
x1 =
7
>> class(x1)
ans =int8
>> x2=double(x)
x2 =
6.9000
>> class(x2)
ans =
double
转换时,如果由高精度数据类型转换为低精度数据类型,则对数据进行四舍五入;如果由定义范围大的数据类型转换为定义范围小的数据类型,则返回目标数据类型的上限或下限。
数据类型操作函数
MATLAB R2012a 中提供了大量和数据类型相关的操作函数,如表2-14 所示。
注意:
其中的'type'包括'numeric'、'integer'、'float'和所有的数据类型。
变量
变量是程序的基本元素之一。与其他语言不同,MATLAB 不需要对变量进行事先声明,也不需要指定变量的类型,系统会根据对变量赋予的值为变量自动指定类型。本节主要介绍变量的命名规则,关于变量的更多知识,将会在第6 章进行进一步介绍。MATLAB 的变量命名规则与其他计算机语言类似。首先,变量名必须是一个单一的词,
不能包含空格,另外其命名必须符合下列规则。
(1) 变量名区分大小写。如pi 和Pi 是两个不同的变量。在命令窗口中输入如下的命令,
查看其结果。
>> pi
ans =
3.1416
>> Pi
Undefined function or variable 'Pi'.
>> Pi=2.0
Pi =
2
>> pi
ans =
3.1416
pi 是系统预定义的变量,在命令窗口中输入pi,则显示该变量的值为3.1416。输入Pi,系统提示该变量不存在,可见pi 和Pi 为两个不同的变量。将Pi 赋值为2.0,再次查看变量pi 的值,仍旧为3.1416,即Pi 的改变不影响pi 的值。
(2) 变量名长度不超过63 个字符,超过的部分将会被忽略。
(3) 变量名必须以字母开始,其后可以为字母、数字或者下划线。MATLAB 中的变量名不支持其他符号,因为其他符号在MATLAB 中具有特殊的意义。
除上述3 条规则外,还有一些其他规定,如用户不能利用 MATLAB 中的关键字(保留字)作为变量名。用户可以利用iskeyword 命令查看系统的预定义关键字,或者使用该函数判断一个字符串是否为预定义关键字。
>> iskeyword
ans =
'break'
'case'
'catch'
'classdef'
'continue'
'else'
'elseif'
'end'
'for'
'function'
'global'
'if'
'otherwise'
'parfor'
'persistent'
'return'
'spmd'
'switch'
'try'
'while'
>> iskeyword if
ans =
1
>> iskeyword keyword
ans =
0
另外,用户可以使用isvarname 函数判断一个变量名是否合法,如下所示:
>> isvarname keyword
ans =1
该例显示keyword 为合法变量名,用户可以使用。
系统预定义的特殊变量
除用户定义的变量之外,MATLAB 定义了一些特殊变量,如果用户没有对这些变量另行赋值,则采用其默认值。MALTAB 的预定义特殊变量如表2-15 所示。
变 量 名 描 述
ans 结果显示的默认变量名
beep 使计算机发出“嘟嘟”声
pi 圆周率
eps 浮点数的精度(2.2204e-016),MALTAB 中的最小数
inf 无穷大,如当除数为0 时系统返回inf
NaN 或nan 表示不定数,即结果不能确定
i 或j 虚数单位
nargin 函数的输入参数个数
nargout 函数的输出参数个数
realmin 可用的最小正实数2.2251e-308
realmax 可用的最大正实数值1.7977e+308
bitmax 可用的最大正整数(以双精度格式存储)
varargin 可变的函数输入参数个数
varargout 可变的函数输出参数个数
下面以虚数单位i 为例说明这些变量的用法,见例2-23。
例2-23 系统预定义变量的使用。
>> clear i %清除该变量的定义
>> i
ans =
0 + 1.0000i
>> i=1:3 %重新定义变量i 的值
i =
1 2 3
>> clear i %清除该变量的定义
>> i
ans =
0 + 1.0000i
该例中首先清除i 的定义,查看i 的值,为虚数单位,再对i 重新赋值,则其原来的值被覆盖,清除其定义后,i 的值回到默认值。
MATLAB 中,允许用户再次定义这些变量,对这些变量赋值,如例2-23 中对i 再次赋值。但是在编写程序时,应尽量避免对系统预定义的变量重新赋值,或者使用已有函数名作为变量名,以免程序产生非预期结果。
上一条:常用的操作命令和快捷键