
2.7.1 数列的生成和下标
1. 在命令窗口中手工输入数列
数列的元素用一对方括号“[]”包围,在其中依次输入各个元素,相邻元素之间通过空格或逗号区隔,就能在命令窗口中手工输入数列。例如,输入如下内容:

就可以生成一个长度为4,元素依次为1、9、7、5的数列。
2. 生成全0数列
使用zeros函数可以生成全0数列。
【例2.20】
生成一个长度为5的全0数列a。
在命令窗口中输入如下内容:

输出结果为

或者当变量a还不存在时,使用a(n)=0也可以生成一个长度为n的全0数列。
【例2.21】
重复例2.20。
在命令窗口中输入如下内容:

输出结果为

在变量a之后用括号“()”包围起来的部分表示数组下标。注意:MATLAB中的下标是从1开始的,因此a(5)表示数列a中的第5个元素。上述操作的原理如下:当用户试图对变量a的第5个元素进行写操作时,如果变量a还不存在,那么MATLAB将在工作空间中产生该变量;进一步地,如果变量a的数列长度还不到5,那么MATLAB将自动把a的长度扩充为5,并且用0来填入新扩充出来的元素位置。由于之前变量a并不存在,因此MATLAB在执行a(5)=0时,将直接生成一个长度为5的数列,使用0来填入第1~4个元素,并对第5个元素执行赋值操作,因此得到了一个所需长度的全0数列。
在上面两种生成全0数列的方式中,第一种方式能够更明确地表明操作的语义,并且总是能够得到所需的全0数列,而不用担心变量a是否已经存在。此外,这种方式还能用于生成任何维数的全0数组。第二种方式对于具有一定经验的MATLAB程序员而言是明晰和简便的,但是从程序的易读性和易维护性考虑,推荐读者使用第一种方式。
3. 生成全1数列
使用ones函数可以生成全1数列,其使用方法与zeros函数相同。
【例2.22】
生成一个长度为6的全1数列。
在命令窗口中输入如下内容:

输出结果为

4. 生成等差数列
在MATLAB中生成等差数列最简单的方式是使用冒号运算符。使用

可以生成一个等差数列x,数列的首项为x_start,公差为step,而数列的末项是最接近但不“越过”x_bound的值。所谓的“越过”与公差step的符号有关:若step的值大于0,则数列末项是最接近但不大于x_bound的值;若step的值小于0,则数列末项是最接近但不小于x_bound的值。需要注意的是,x_bound不一定会出现在数列中,用户也没有必要确保x_bound成为数列的末项。
【例2.23】
生成1~10之间的奇数数列和偶数数列。
在命令窗口中输入如下内容:

输出结果为

在命令窗口中输入如下内容:

输出结果为

【例2.24】
设一条50m长的道路需要从道路起点开始,在路旁以15m的间隔植树。请问这些植树的位置分别为多少?
在命令窗口中输入如下内容:

输出结果为

若公差为1,则“:step”部分可以省略,直接使用x_start:x_bound即可。
【例2.25】
生成从1到5的升序和降序数列。
在命令窗口中输入如下内容:

输出结果为

在命令窗口中输入如下内容:

输出结果为

除了使用冒号运算符,也可以使用linspace函数来生成等差数列。使用

将生成一个首项为a、末项为b、项数为n的等差数列x。
注意:此时a和b一定会出现在数列中,而数列的公差将由linspace函数自动确定。
【例2.26】
将[0,1]区间四等分,请给出各个等分点的位置。
在命令窗口中输入如下内容:

输出结果为

5. 生成等比数列
使用logspace函数可以生成等比数列,即

将生成一个首项为、末项为
、项数为n的等比数列,数列的公比由logspace函数自动确定。
注意:该函数的参数不是数列中的首项和末项,而是它们的常用对数值。
6. 生成随机数列
使用rand函数可以生成在(0,1)区间内均匀分布的随机数列,即数列中的每个元素都是一个随机数,并且该随机数可认为是独立抽取自一个在(0,1)区间均匀分布的母体。rand函数的使用方式与zeros函数类似,即

可以生成一个长度为10的(0,1)区间均匀分布随机数列。
使用randn函数可以生成服从标准正态分布的随机数列,即数列中的每个元素都可认为是独立抽取自均值为0、方差为1的标准正态分布母体。randn函数的使用与rand函数类似。
使用randi函数可以生成均匀分布的随机整数。使用randi(Imax,1,n)可以生成一个长度为n、元素在1到Imax范围内均匀分布的随机整数数列;或者可以使用一个长度为2的数列Irange指定要生成的随机整数的分布范围,再使用randi(Irange,1,n)来生成该范围内的n个均匀分布的随机整数。例如使用

可以生成一个长度为5、在60~100范围内取值的均匀分布随机整数数列。
需要注意的是,MATLAB中的随机数实际上都是“伪随机数”,是通过一个“伪随机数发生函数”F,由某个“种子数”x0开始,通过不断迭代获得xk+1=F(xk)。F本身是一个完全确定的函数,只不过经过精巧的设计之后,由F所产生的数列{xi}的统计性质与随机数十分接近,因此可以作为随机数来使用。对于相同的F,从相同的种子数x0开始,所得到的伪随机数列将是完全相同的。
使用rng函数可以设置与伪随机数发生器有关的参数,其最常见的用途是用来设置新的种子数,以产生后续的伪随机数。rng(seed)可以将非负整数seed设置为伪随机数发生函数的新种子数;rng('default')将种子数设置为默认值;rng('shuffle')则可以根据当前时间产生一个种子数,从而使得每次运行时所产生的种子数都是事先无法预测的。
注意:如果在程序中使用了随机数,并且使用了rng('shuffle')来初始化种子数,那么就意味着程序的每次运行几乎都是“不可复现”的。如果希望能够控制程序运行的“确定性”,那么需要使用更加可控的方式。例如,指定某个固定的种子数或按某种可以预计的规律来产生种子数,就能够复现特定的运行过程和结果。对于程序的调试而言,这一做法尤为有用。
【例2.27】
(1)将种子数设置为100,然后生成长度为4的(0,1)区间均匀分布随机数列。
在命令窗口中输入如下内容:

输出结果为

(2)再利用shuffle功能重置随机数发生器种子数,并生成长度为5、在50~80范围内均匀分布的随机整数数列。
在命令窗口中输入如下内容:

输出结果为

(3)再将种子数设置为100,并产生长度为4的(0,1)区间均匀分布的随机数列。
在命令窗口中输入如下内容:

输出结果为

可见,所得的结果与(1)中完全相同。