MATLAB及在电子信息类课程中的应用(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 MATLAB的基本语法

2.1 变量及其赋值

2.1.1 标识符与数据格式

标识符是标志变量名、常量名、函数名和文件名的字符串的总称。在MATLAB中,变量和常量的标识符最长允许19个字符。字符包括全部的英文字母(大小写共52个)、阿拉伯数字和下划线等符号,标识符中第一个字符必须是英文字母。

在其他计算机语言中,通常设有多种数据格式,如字符型(8位)、整数型(16位)等,可节省内存和提高速度,但增加了编程的复杂性。MATLAB省去了多种数据格式,内部只有一种数据格式,那就是双精度格式,对应于64位二进制数,这对绝大多数工程计算是足够了。MATLAB可简化编程,但在运算速度和内存消耗方面付出了代价。

2.1.2 矩阵及其元素的赋值

赋值就是把数赋给代表常量或变量的标识符。赋值语句的一般形式为:

变量=表达式(或数)

在MATLAB中,变量都代表矩阵,其阶数为n×m,即该矩阵共有nm列。列矢量可被当作只有一列的矩阵(n×1);行矢量(或一维数组)可被当作只有一个行的矩阵(1×m);标量(或常量)应看作1×1阶的矩阵。

1.赋值要求

在输入矩阵时,应遵循以下规则:

● 整个矩阵的值应放在方括号中;

● 同一行中各元素之间以逗号“, ”或空格分开;

● 不同行的元素以分号“; ”隔开。

例如,在MATLAB的命令窗口中输入:

      >> s=[1,2,3,4,5] %可当作一个行矢量(或一维数组)

回车后则显示为: s= 1 2 3 4 5

因此,变量s是1×5阶矩阵,该矩阵元素的值分别为:

      s(1,1)=1 s(1,2)=2 s(1,3)=3 s(1,4)=4 s(1,5)=5

又例如输入语句:

>>w=[1 2 3 ; 3 4 5 ; 6 7 8] ← 注意分号“; ”的功能

即变量w是3×3阶的矩阵。

又例如利用表达式赋值:

>>y=[−2.5*3, (1+2+4)/5, sqrt(2)]

显示结果为: y = −7.5000 1.4000 1.4142

如果不希望显示处理结果,可以在语句结尾加上分号“; ”,这在编写M文件时非常有用。例如对常量c赋值:

>>c=5; ← 注意分号“; ”的功能

按回车键(Enter)后,将不显示结果,但已完成对变量c的赋值。这时若在命令窗口中输入:

>>c

按回车键(Enter)后,将显示该变量的内容: c= 5。

2.变量的元素的标注

在MATLAB中,变量的元素(即矩阵元)用圆括号“()”中的数字(也称为下标)来注明,一维矩阵(也称数组)中的元素用一个下标数表示,二维矩阵由两个下标数构成,以逗号分开,对三维矩阵则由三个下标数构成。如a(2,3)表示变量a的第2行第3列元素。

在MATLAB中,也可以单独给元素赋值,例如a(2,3)=10, x(1,2)=1.5等。如果赋值元素的下标超出了原有矩阵的大小,矩阵的行列会自动扩展。

例如: 首先输入一变量

>>a=[1,2,3;4,5,6;7,8,9]

再输入:

>>a(4,4)=5.6

可见,变量a的阶数由3×3自动扩展成4×4阶,且元素a(4,1)、a(4,2)、a(4,3)、a(1,4)、a(2,4)及a(3,4) 被自动地赋值0。这种自动扩展阶数的功能只适用于赋值语句。在其他语句中若出现超阶调用矩阵元素的情况,MATLAB将给出出错提示。

变量的阶数可以用size命令来获取,例如

>>size(a)

回车可得: ans= 4 4

此时MATLAB自动给出一个临时变量“ans”。

3.赋值技巧

在MATLAB中,为变量的赋值提供一些简便快捷的方法。

(1)冒号操作符“: ”

在MATLAB系统中,冒号“: ”是一个非常有用的操作符,除了可以产生数组下标外,还可以产生向量及for循环。例如格式:

t=j:i:k

其功能是以j为初始值,每次增加(i称为步长或间隔大小)直到终值k,相当于[j, j+i, j+2*i, …, k];如果i>0,并且k<j;或者i<0,且k>j,则向量t为空。当步长i =1时,可改写为:

t=j:k

例如:

(2)利用冒号“: ”给全行的元素赋值

例如,给a的第5行全行赋值,可用冒号“: ”,输入

      >>a(5, : )=[5,3,2,1]        ← 注意冒号“: ”的功能

(3)利用行、列标注构成新的矩阵

例如,把a的第2行和第4行及第1列和第3列交点的元素取出,构成一个新矩阵b,可输入:

>>b=a([2,4] , [1,3])

又例如要抽去a中的第2行,第4行,第5行,可利用空矩阵[ ]的概念,输入:

>>a([2 , 4 , 5] , : )=[ ]

矩阵的阶数由5×4阶降为2×4阶。这里值得注意的是,空矩阵与零矩阵是两个不同概念。空矩阵是指没有元素的矩阵,对任何一个矩阵赋值为[ ],就是使它的元素都消失掉。零矩阵中元素是存在的,只是其数值为零。因此,利用空矩阵可以缩减矩阵的阶数。

4.特殊矩阵和数组

除了采用直接输入方法对变量赋值外,也可利用MATLAB的内部函数来对变量赋值,利用这些函数来创建和生成特殊矩阵或数组。在MATLAB中提供了许多生成矩阵的函数命令,这些函数命令存放在“matlab\elmat”目录下。表2.1给出一些常用的生成矩阵函数。利用这些函数,可以直接生成一个矩阵或数组。关于这些函数的具体用法,可以利用help命令来获得,下面仅对一些函数命令的使用作简要说明。

表2.1 常用生成矩阵函数

(1)单位矩阵函数

产生主对角线元素为1,其他元素为0的单位矩阵。其调用格式如下:

A=eye(n)     返回一个n×n阶单位矩阵;

A=eye(m, n)   返回一个m×n阶单位矩阵,或用A=eye([m, n]);

A=eye(size(B)) 返回一个大小与矩阵B一样的单位矩阵。

例如: >>A=eye(3)

(2)zeros函数、ones函数、rand及randn函数

这4个函数的功能如表2.1中所示,下面仅给出zeros函数的调用格式,其余3个函数的调用格式类似。

A=zeros(n)        返回一个n×n阶零矩阵;

A=zeros(m, n)       返回一个m×n阶零矩阵;

A=zeros(d1, d2, d3, … )  返回一个维数为d1× d2× d3×…的所有元素为0的数组;或用A= zeros([d1, d2, d3, … ]);

A=zeros(size(B))      返回一个大小与B一样的零矩阵或数组。

例如:

(3)linspace函数和logspace函数

linspace函数的功能是将指定区间[a, b]按线性等分,而logspace函数则是将区间[a, b]按对数等分。linspace函数的调用格式如下:

y=linspace(a, b) 产生一个行矢量y,该矢量把a和b间的数等分100份而得到

y=linspace(a, b, n) 产生一个行矢量y,该矢量把a和b间的数等分n份而得到

例如:

logspace函数的调用格式与linspace函数的调用类似。

5.MATLAB内部特殊变量和常数

在MATLAB内部,为处理方便定义了一些特殊的变量和常数。

ans: 临时变量,通常指示当前的答案。

eps: 常数,表示浮点相对精度;其值是从1.0到下一个最大浮点数之间的差值。按IEEE标准,eps=2−52,近似为2.2204e− 016,该变量值作为MATLAB一些函数计算的相对浮点精度。

realmax: 常数,表示最大正浮点数;任何大于该值的运算都溢出。在具有IEEE标准浮点格式的机器上,realmax略小于21024,近似为1.7977e+308。

realmin: 常数,表示最小正浮点数;任何小于该值的运算都溢出。在具有IEEE标准浮点格式的机器上,realmin略小于2−1022,近似为2.2251e−308。

pi: 常数,表示圆周率π=3.1415926535897…。表达式4*atan(1)和imag(log(−1))产生相同的值π。

Inf: 常数,代表正无穷大;一般被0除或溢出则产生无穷大结果。如2/0,2^10000均产生结果: Inf;而log(0)产生结果: −Inf。

i, j: 虚数单位,表示复数虚部单位,相当于

NaN: 表示非数值。如Inf−Inf, Inf/Inf,0*Inf,0/0均产生该结果。

6.复数的赋值方式

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+2*i,3+4*i;5+6*i,7+8*i]

(2)将矩阵的实部和虚部分别赋值,例如,输入

>>z=[1,3;5,7]+[2,4;6,8]*i;

两种方法可得出同样结果。但值得注意的是:

① 在方法(2)中省略乘号“*”,就会出错。

② 如果在前面其他程序中曾经给i或j赋过值,这时就不能采用方法(1)或方法(2)乘号“*”方式对复数赋值,但仍可采用方法(1)中非乘号“*”方式对复数赋值。这是因为i和j已经不是虚数符号。例如,若事先已赋值i=2,这时再输入:

>> z=[1+2*i,3+4*i;5+6*i,7+8*i]

若要采用乘号“*”方式对复数赋值,此时应输入:

      >>clear i, j

即把曾赋值过的i和j变量清掉,恢复为虚数标识符,然后再执行复数赋值语句。

7.变量检查

在程序调试或变量的赋值过程中,往往需要检查工作空间中的变量、变量的阶数及变量赋值内容。在检查变量及其阶数等内容时,既可用工作空间窗口,也可在命令窗口使用who或whos命令来完成检查。当查看某变量的赋值情况时,可在命令窗口直接输入该变量名并回车即可。若所查变量不存在(例如变量yy),屏幕将显示如下信号:

>> yy

??? Undefined function or variable 'yy'.

表示目前没有定义yy变量或函数。