目录
一、变量与常量
1. 常量
常量是程序语句中值不会改变的那些量。如:表达式 y=3.1415*x 中的系数 3.1415 就是一个数值常量;表达式 s='Name and Tel' 中单引号内的英文字符串是一个字符串常量。
在 MATLAB 语言中还为特定常数保留了一些名称,虽然这些常量都可以重新赋值,但建议在编程时应尽量避免对这些量重新赋值。
(1) eps:机器的浮点运算误差限。PC上eps的默认值为,若某个量的绝对值小于eps,则可以认为这个量为0。换句话说,绝对值小于eps的量在双精度数据结构下是没有物理意义的。
(2) i 和 j:若 i 或 j 量不被改写,则它们表示纯虚数量 j。但在程序编写过程中经常事先改写这两个变量的值,如在循环过程中常用这两个变量来表示循环变量,所以应该确认使用这两个变量时没有被改写。如果想恢复该变量,则可以用语句"i=sqrt(-1)"设置,即对-1求平方根。
(3) Inf:无穷大量+∞的 MATLAB 表示,也可以写成 inf。同样地,-∞可以表示为-Inf。在程序执行时,即使遇到了以0为除数的运算,也不会终止程序的运行,而只给出一个"除0"警告,并将结果赋成Inf,这样的定义方式符合IEEE的标准。
(4) NaN:不定式(not a number),通常由0/0运算、Inf/Inf及其他可能的运算得出。NaN是一个很奇特的量,如NaN与Inf的乘积仍为NaN。
(5) pi:圆周率π的双精度浮点表示,π=3.141592653589793。
2. 变量
在程序运行过程中,其值可以改变的量称为变量,变量用变量名表示。变量名必须以字母开头,且只能由字母、数字或下画线3类符号组成,不能包含空格和标点符号等;同时变量名是区分大小写的,即ABC和abc两个变量名代表着不同的变量。
变量的声明:在 MATLAB 中没有变量声明语句,当使用一个变量的时候,MATLAB会搜索这个变量名字,当没有这个名字的时候,默认自动生成。变量的删除:使用语句“clear 变量名”可以进行变量的删除。
二、数据结构
数据结构是计算机程序设计语言中的重要因素。由于 MATLAB 语言主要用于科学运算,所以主要使用数值型与符号型数据结构,双精度数据结构是其默认的数据结构。本节将介绍各种常用的数据结构。MATLAB中,A变量的数据结构可以由命令“class(A)”读出。
1. 数值型数据
强大方便的数值运算功能是MATLAB语言的最显著特色。为保证较高的计算精度,MATLAB语言中最常用的数值量为双精度浮点数,占8字节(64位),遵从IEEE记数法,有11个指数位、52个数值位及一个符号位,值域的近似范围为-1.7x10308~1.7x10308,其MATLAB表示为double()。一般情况下,双精度数据结构可以保留15~16位十进制有效数字。
考虑到一些特殊的应用,比如图像处理,MATLAB语言还引入了无符号的8位整型数据类型,其MATLAB表示为uint8(),其值域为0~255,这样可以大大地节省MATLAB的存储空间,提高处理速度。此外,在MATLAB中还可以使用其他的数据类型,如int8()、int16()、int32()、uint16()、uint32()等,每一个类型后面的数字表示其位数,其含义不难理解。
(1)整数型
① 在MATLAB中,整数类型包含4种有符号整数和4种无符号整数,支持 1B、2B、4B 和 8B 的有符号整数和无符号整数(B:Byte 字节)。
② 在实际应用时,要根据“数据的大小和范围”,选择合适的整数类型。例如:最大值为100的数据可以用 1B 的整数表示,而没有必要使用 8B 的整数来表示。
③ 类型转换函数不仅可以将其它数据类型的数值强制转换为整数类型,还可以用于生成整数类型的数值。
④ 如果要验证一个变量是否为整数类型,可以使用isinteger函数,;如果想要查看数据类型并输出,可以使用class函数。
b = isinteger(a) % a是输入变量,b是输出逻辑值。如果a是整数,则b为1;否则,b为0
class(x) % ans会直接给出变量 x 的数据类型。(变量要用括号括起来)
>> x=uint16(16628) %无符号2B整数
x =
uint16
16628
>> isinteger(x) %验证变量是否为整数,如果x是整数,则返回值为1;否则,返回值为0。
ans =
logical
1
>> class(x) %查看变量的数据类型,ans会直接给出变量的数据类型
ans =
'uint16'
(2)浮点数型
① 在MATLAB中浮点数分为“单精度浮点数(single)”和“双精度浮点数(double)”。
② 双精度浮点数(double)是MATLAB中默认数据类型。
③ 可以使用类型转换函数将数据类型转换为单精度或双精度浮点类型。
b = single(a); % a 是输入的数值或数组,b 是转换后的单精度浮点类型数组。
whos x % 用于查看当前工作空间中的变量列表,显示变量的名称、大小、字节占用等信息。(变量不需要用括号括起来)
>> a=1.3
a =
1.3000
>> whos a
Name Size Bytes Class Attributes
a 1x1 8 double
>> a=single(a)
a =
single
1.3000
>> whos a
Name Size Bytes Class Attributes
a 1x1 4 single
(3)复数型
① 复数包括实部和虚部两部分,虚部单位是 -1 的平方根,在MATLAB中,可以用 i 或 j 表示。
② 可以直接使用赋值语句产生复数,也可以利用 copmlex 函数创建复数。
③ 利用 real 和 imag 函数,可以把复数分为实数和虚数两部分。
z = complex(a,b) % 通过两个实数 a,b 创建一个复数 z,z=a+bi
z = complex(x) % 返回 x 的等效复数。x 为实数,返回 x+0i;x 为复数,则 z 与 x 相同
z = 3+4i
real(z) % 返回复数的实部,返回值为3
imag(z) % 返回复数的虚部,返回值为4
R = rand % 返回一个区间在(0,1)内的均匀分布的随机数
R = rand(n) % 生成 n×n 的矩阵随机数,每个元素均位于(0,1)之间
>> a=12+6i
a =
12.0000 + 6.0000i
>> x=rand(2)*(-3); % 生成一个2×2的随机浮点矩阵,然后矩阵中的每个元素均乘-3
>> y=rand(2)*5; % 生成一个2×2的随机浮点矩阵,然后矩阵中的每个元素具乘5
>> z=complex(x,y) % 创建复数,x、y是实数,z是以x为实部、y为虚部的复数
z =
-2.4442 + 3.1618i -0.3810 + 1.3925i
-2.7174 + 0.4877i -2.7401 + 2.7344i
>> x=rand(2); % 生成一个2×2的随机矩阵,每个元素均位于(0,1)之间
>> z=complex(x) % 创建复数,x是实数,z是以x为实部、0为虚部的复数
z =
0.9575 + 0.0000i 0.1576 + 0.0000i
0.9649 + 0.0000i 0.9706 + 0.0000i
(4)Inf 和 NaN
① 规定用 Inf 和 -Inf 分别表示“正无穷大”和“负无穷大”。在除法运算时,除数为0或运算结果溢出(结果超出了设定的数据类型所对应的范围)都会导致出现 Inf 或 -Inf 的结果。
② 规定用 NaN 表示一个既不是实数又不是复数的数值(非数),NaN是Not a Number 的缩写,类似0/0、Inf/Inf 的表达式得到的结果均为 NaN 。
③ isinf 函数可以用于验证变量是否为无穷大。
b = isinf(a) % a是输入变量,b是输出逻辑值。如果a是无穷大,则b为1;否则,b为0
>> 1000/0
ans =
Inf
>> x=exp(1000)
x =
Inf
>> x=log(0)
x =
-Inf
>> 0/0
ans =
NaN
>> Inf/Inf
ans =
NaN
>> isinf(x)
ans =
logical
1
2. 符号型数据
MATLAB还定义了"符号"型变量,以区别于常规的数值型变量,可以用于公式推导和数学问题的解析求解。进行解析运算前需要首先将采用的变量声明为符号变量,这需要用syms命令来实现。该语句具体的用法为 syms vars 变量属性,其中,vars给出需要声明的变量列表,可以同时声明多个变量,中间用空格分隔,而不是用逗号等分隔。如果需要,还可以进一步声明变量的"变量属性",可以使用的类型为real(实数)、positive(正数)等。例如,将a,b均定义为符号变量,则可以用syms a b语句声明,该命令还支持对符号变量具体形式的设定,如syms a real。
① 如果已知某数值型变量A,则可以使用 B=sym(A) 命令将数值型变量A转换成符号型数据结构,而 A=double(B) 命令可以将符号型数值还原成双精度数据结构。
syms vars % 声明符号变量
B = sym(A) % 将数值型变量A转换为符号型数据结构
A = double(B) % 将符号型数值B还原成双精度数据结构
>> syms a b
>> whos a
Name Size Bytes Class Attributes
a 1x1 8 sym
>> whos b
Name Size Bytes Class Attributes
b 1x1 8 sym
>> a=1;
>> b=sym(a)
b =
1
>> whos b
Name Size Bytes Class Attributes
b 1x1 8 sym
>> a=double(b)
a =
1
>> whos a
Name Size Bytes Class Attributes
a 1x1 8 double
② 符号型数值可以通过变精度算法函数 vpa() 以任意指定的精度显示出来。直接使用 vpa() 命令最多显示5万位左右,需要更多的位可以通过循环的方式实现。
vpa(A) % 以默认的十进制位数(32位)显示结果
vpa(A,n) % A为需要显示的数值或矩阵,n为指定的有效数字位数
>> vpa(pi)
ans =
3.1415926535897932384626433832795
>> vpa(pi,100)
ans =
3.1415926535897932384626433832795028841971693993751
05820974944592307816406286208998628034825342117068
③ 数学函数有两种表示方法,一种是符号变量的描述方法,另一种是符号函数的描述方法。下面的语句都可以定义出该函数,但两种方法定义的数据结构是不一致的,前者是普通符号变量 sym, 后者是符号函数 symfun。由 class() 函数可以直接读取符号表达式的数据结构。
>> syms x;
>> f1=sin(x)/(x^2+4*x+3),class(f1)
f1 =
sin(x)/(x^2 + 4*x + 3)
ans =
'sym'
>> f2(x)=sin(x)/(x^2+4*x+3),class(f2)
f2(x) =
sin(x)/(x^2 + 4*x + 3)
ans =
'symfun'
④ 当输入指令“>>a=sym(12345678901234567890”,不过实际输入到计算机的是“a=12345678901234567168”,和期望的有差距,这是因为在MATLAB 执行机制下,该数被先转换成双精度数据结构,再由双精度的结果转换成符号型数据结构,从而出现偏差。如果想不走样地输入位数很多的整数,则需要借助字符串数据结构的帮助。例如,由下面语句可以直接输入更多位的有效数字。
>> a=sym(12345678901234567890)
a =
12345678901234567168
>> a=sym('12345678901234567890')
a =
12345678901234567890
3. 其它数据结构
(1)字符串型数据。MATLAB支持字符串变量,可以用它来存储相关的信息。和C语言等程序设计语言不同,MATLAB字符串是用单引号括起来的。
(2)多维数组。三维数组是一般矩阵的直接拓展。在控制系统的分析中也可以直接用于多变量系统的表示。在实际编程中还可以使用维数更高的数组。
(3)单元数组。单元数组是矩阵的直接扩展,其存储形式类似于普通的矩阵,而矩阵的每个元素不是数值,可以认为能存储任意类型的信息,这样每个元素称为"单元"(cell),例如,A{i,j}可以表示单元数组A的第i行,第j列的内容。
(4)类与对象。MATLAB允许用户自己编写包含各种复杂信息的变量,称为类,而对象是类的一个实例。类变量可以包含各种下级的信息,还可以重新对类定其计算,这在控制系统描述中特别有用。例如,在MATLAB的控制系统工具箱中定义了传递函数类,可以用一个变量来表示整个传递函数,还重新定义了该类的运算,如加法运算可以直接求取多个模块的并联连接,乘法运算可以求取若干模块的串联。这些内容将在后面进行详细介绍。
三、基本语句结构
1. 直接赋值语句
直接赋值语句的基本结构为“赋值变量=赋值表达式”,这一过程把等号右边的表达式直接赋给左边的赋值变量,并返回到MATLAB的工作空间。如果赋值表达式后面没有分号,则将在MATLAB命令窗口中显示表达式的运算结果。若不想显示运算结果,则应该在赋值语句的末尾加一个分号。如果省略了赋值变量和等号,则表达式运算的结果将赋给保留变量ans。所以说,保留变量ans将永远存放最近一次无赋值变量语句的运算结果。
>> A=[1 2 3;4 5 6;7 8 0];
>> A=[[A;41 42 43],[14;24;34;44]] %矩阵维数动态变化
A =
1 2 3 14
4 5 6 24
7 8 0 34
41 42 43 44
2. 函数调用语句
函数调用语句的基本结构为“[返回变元列表]=函数名(输入变元列表)”,其中,函数名的要求和变量名的要求是一致的,一般函数名应该对应在 MATLAB 路径下的一个文件。例如,函数名 my_fun 应该对应于 my_fun.m 文件。当然,还有一些函数名需对应于 MATLAB 的内核函数(built-in function),如 inv() 函数等。
返回变元列表和输入变元列表均可以由若干个变量名组成,它们之间应该分别用逗号隔开。返回变元还允许用空格分隔,例如,[U S V]=svd(X),该函数对给定的X 矩阵进行奇异值分解,所得的结果由 U、S、V 这3个变元返回。如果不想返回某个变元,则可以用~符号占位。
四、冒号表达式
冒号表达式是 MATLAB 中很有用的表达式,在向量生成、子矩阵提取等很多方面都是特别重要的。冒号表达式的原型为,该函数将生成一个行向量 v,其中 为向量的起始值, 为步距。该向量将从 出发,每隔步距 取一个点,直至不超过 的最大值就可以构成一个向量。若省略 ,则步距取默认值1。
y = linspace(x1, x2, n) % x1 是起始点,x2 是结束点,n 是生成的数据点的数量
>> v1=0:0.6:pi
v1 =
0 0.6000 1.2000 1.8000 2.4000 3.0000
>> v2=0:pi/5:pi
v2 =
0 0.6283 1.2566 1.8850 2.5133 3.1416
>> v3=linspace(0,pi,6)
v3 =
0 0.6283 1.2566 1.8850 2.5133 3.1416
五、子矩阵提取
提取子矩阵在 MATLAB 编程中是经常需要处理的事。提取子矩阵的具体方法是B=A(v1,v2),其中,v1向量表示子矩阵要包含的行号构成的向量,v2表示要包含的列号构成的向量,这样从A矩阵中提取有关的行和列,就可以构成子矩阵B了。若v1为“:”,则表示要提取所有的行,v2亦有相应的处理结果。关键词end表示最后一行(或列,取决于其位置)。
>> A = rand(4, 4) %随机生成一个4×4矩阵
A =
0.8147 0.6324 0.9575 0.9572
0.9058 0.0975 0.9649 0.4854
0.1270 0.2785 0.1576 0.8003
0.9134 0.5469 0.9706 0.1419
>> B1=A(1:2:end,:) %提取A矩阵的奇数行、全部列
B1 =
0.8147 0.6324 0.9575 0.9572
0.1270 0.2785 0.1576 0.8003
>> B2=A([3 2 1],[2 3 4]) %提取A矩阵的3,2,1行、2,3,4列
B2 =
0.2785 0.1576 0.8003
0.0975 0.9649 0.4854
0.6324 0.9575 0.9572
>> B3=A(:,end:-1:1) %将A矩阵左右翻转
B3 =
0.9572 0.9575 0.6324 0.8147
0.4854 0.9649 0.0975 0.9058
0.8003 0.1576 0.2785 0.1270
0.1419 0.9706 0.5469 0.9134