第2章 MATLAB的基本语法
2.1 变量及其赋值
2.1.1 标识符与数据格式
标识符是标志变量名、常量名、函数名和文件名的字符串的总称。在MATLAB中,变量和常量的标识符最长允许19个字符。字符包括全部的英文字母(大小写共52个)、阿拉伯数字和下划线等符号,标识符中第一个字符必须是英文字母。
在其他计算机语言中,通常设有多种数据格式,如字符型(8位)、整数型(16位)等,可节省内存和提高速度,但增加了编程的复杂性。MATLAB省去了多种数据格式,内部只有一种数据格式,那就是双精度格式,对应于64位二进制数,这对绝大多数工程计算是足够了。MATLAB可简化编程,但在运算速度和内存消耗方面付出了代价。
2.1.2 矩阵及其元素的赋值
赋值就是把数赋给代表常量或变量的标识符。赋值语句的一般形式为:
变量=表达式(或数)
在MATLAB中,变量都代表矩阵,其阶数为n×m,即该矩阵共有n行m列。列矢量可被当作只有一列的矩阵(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变量或函数。