陈怀琛、吴大正、高西全编著的《MATLAB及在电子信息课程中的应用(第4版)》以电路、信号和系统、数字信号处理和自动控制原理4门主课为目标,作为这些课程的伴侣书。晶体管模拟电路和数字电路虽然也是主课,但有专门的软件来辅助分析,因此本书不作介绍。作为教学辅导书,本书不作理论推导,而是直接利用教材上的现成结论。重点讨论如何利用这些结论和MATLAB编程来解决实际问题,通过数字结果来加深对理论的理解。本书自成体系,同时避免各门课程的局限性。由于种种原因,目前各门课程之间往往存在一些重叠,各校对课程范围的划分也不尽相同,本书尽量避免这些不必要的矛盾。比如学习控制理论的时候,关于线性系统求解问题就不再介绍,只要查看信号与系统的有关内容就行了。这样做虽然有些不便,但可以使读者把各门课程的概念真正连贯起来,使之融会贯通,有利于对课程的理解和深化。
2.1 变量及其赋值
2.1.1 标识符与数
标识符是标识变量名、常量名、函数名和文件名的字符串的总称。在MATLAB中,变量和常量的标识符最长允许19个字符;函数和文件名则通常不超过8个字符。这些字符包括全部的英文字母(大小写共52个)、阿拉伯数字和下画线等符号。标识符中第1个字符必须是英文字母。MATLAB对大小写敏感(Case Sensitive),即它把A和a看做两个不同的字符。
MATLAB内部只有一种数据格式,那就是双精度(即64位)二进制,对应于十进制16位有效数和±308次幂。MATLAB作运算和存储时都用双精度格式,这对绝大多数工程计算是足够的,许多情况下甚至过于“浪费”。在一些其他的算法语言中设有多种数据格式,如字符型(8位)、整数型(16位)、单精度型(32位)等,可节省内存和提高速度,但增加了编程的复杂性。MATLAB把简化编程作为其主要目标,省去了多种数据格式,但在运算速度和内存消耗方面付出代价。不过,现在计算机的时钟频率和内存容量都以几何级数迅速增长,MATLAB付出的代价容易得到弥补。虽然它的数据格式只有一种,但为了人机交互的友好方便,输出显示格式有8种,已在第1章中指出。
2.1.2 矩阵及其元素的赋值
赋值就是把数赋予代表常量或变量的标识符。MATLAB中的变量或常量都代表矩阵,标量应看做1?1阶的矩阵。赋值语句的一般形式为:
? 变量?表达式(或数)
例如输入语句
a?[1 2 3;4 5 6;7 8 9]
则显示结果为
a? 1 2 3
4 5 6
7 8 9
元素也可以用表达式代替,如输入 x=[-1.3 sqrt(3) (1+2+3)/5*4]
结果为 x=-1.3000 1.7321 4.8000
可以看出,矩阵的值放在方括号中,同一行中各元素之间以逗号或空格分开,不同的行则以分号隔开,语句的结尾可用回车符或逗号,此时会立即显示运算结果。如果不希望显示结果,就以分号结尾。此时运算仍然执行,只是不显示。
变量的元素用圆括号“()”中的数字(也称为下标)来注明,一维矩阵(也称数组或向量)中的元素用一个下标表示,二维的矩阵可有两个下标数,以逗号分开。三维和更高维的矩阵,可有三个或更多下标。用户可以单独给元素赋值,如:x(2)=1.7321,a(2,3)=6等。如果赋值元素的下标超出了原来矩阵的大小,矩阵的行列会自动扩展。如:
x(5)=abs(x(1))
得 x =-1.3000 1.7321 4.8000 0 1.3000
又如输入 a(4,3)=6.5
得 a = 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000
0 0 6.5000
可见,跳空的元素x(4),a(4,1),a(4,2)被自动赋值0。这种自动扩展维数的功能只适用于赋值语句,在其他语句中若出现超维调用的情况,系统将给出出错提示。
给全行赋值,可用冒号。例如,给a的第5行赋值。
输入 a(5, : )=[5,4,3]
得 a = 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000
0 0 6.5000
5.0000 4.0000 3.0000
把a的第2, 4行及第1, 3列交点上的元素取出,构成一个新矩阵b。
可输入 b = a([2,4],[1,3])
得 b = 4.0000 6.0000
0 6.5000
要抽去a中的第2、4、5行,可利用空矩阵[ ]的概念。
输入 a([2,4,5],:)=[ ]
得 a = 1 2 3
7 8 9
注意,“空矩阵”是指没有元素的矩阵。对任何一个矩阵赋值[ ],就是使它的元素都消失掉。这完全不同于“零矩阵”,后者是元素存在,只是其数值为零而已。可以看出,空矩阵是使矩阵减缩时不可缺少的概念。
除“变量=表达式(或数)”的标准赋值格式外,还可以不要等式左端而只剩下“表达式”。这有两种可能:(1)该表达式并不产生数字解,例如,产生图形或改变系统状态;(2)该表达式产生数字解,但不需保存它。此时,MATLAB自动给出一个临时变量ans,把右端的结果暂存在ans中。例如输入 a/7
得 ans = 0.1429 0.2857 0.4286
1.0000 1.1429 1.2857
2.1.3 复数
MATLAB的每一个元素都可以是复数,实数是复数的特例。复数的虚数部分用i或j表示。这是在MATLAB启动时就在内部设定的。例如:
输入 c = 3+5.2i
得 c = 3.0000 + 5.2000i
对复数矩阵有两种赋值方法。
(1)将其元素逐个赋予复数,如:
输入 z=[1+2i,3+4i;5+6i,7+8i]
得 z = 1.0000 + 2.0000i 3.0000 + 4.0000i
5.0000 + 6.0000i 7.0000 + 8.0000i
(2)将其实部和虚部矩阵分别赋值,如:
z = [1,3;5,7]+[2,4;6,8]*i
两种赋值方法得出同样的结果。注意,只有数字和i的乘积可省略乘号,在上述矩阵式中若省略乘号“*”,就会出错。另外,如果在前面程序中曾经给i或j赋过其他值,则i,j已经不是虚数符号,这些虚数赋值语句都不对了。此时应输入:
clear i,j
即把原赋的i,j清掉,然后再执行复数赋值语句。
MATLAB中所有的运算符和函数都对复数有效。例如:
输入 f = sqrt(1+2i)
得 f = 1.2720 + 0.7862i
检验 f*f
ans = 1.0000 + 2.0000i
因此,复数的表达式同样也能作为赋值语句。再来看复数矩阵z的转置、共轭运算,运算符 ' 表示把矩阵作共轭转置,即把它的行列互换,同时,把各元素的虚部反号。函数conj则只把各元素的虚部反号,即只取共轭。所以,若求转置而不要共轭,就把conj和 ' 结合起来完成。
输入 w=z'(共轭转置),u=conj(z) (共轭),v=conj(z)' (转置)
得 w = 1.0000 - 2.0000i 5.0000 - 6.0000i
3.0000 - 4.0000i 7.0000 - 8.0000i
u = 1.0000 - 2.0000i 3.0000 - 4.0000i
5.0000 - 6.0000i 7.0000 - 8.0000i
v = 1.0000 + 2.0000i 5.0000 + 6.0000i
3.0000 + 4.0000i 7.0000 + 8.0000i
……