薛定宇教授大讲堂(卷Ⅲ):MATLAB线性代数运算
上QQ阅读APP看书,第一时间看更新

2.2 特殊矩阵的输入方法

2.1节介绍了一般矩阵的输入方法,需要逐个元素将矩阵输入计算机。然而,对于一些特定的矩阵,有时没有必要逐个元素输入,可借助于MATLAB语言提供的特殊矩阵输入函数。本节将介绍特殊矩阵的输入方法。

2.2.1 零矩阵、幺矩阵及单位矩阵

定义2-4 在一般的矩阵理论中,把所有元素都为零的矩阵称为零矩阵;把元素全为1的矩阵称为幺矩阵;把主对角线元素均为1,而其他元素全部为0的方阵称为单位矩阵。这里进一步扩展单位矩阵的定义,使其为m×n矩阵。

零矩阵、幺矩阵和扩展单位矩阵的MATLAB生成函数分别为

A=zeros(n),B=ones(n),C=eye(n) %生成n×n方阵

A=zeros(m,n);B=ones(m,n);C=eye(m,n) %生成m×n矩阵

A=zeros(size(B)) %生成和矩阵B同样维数的矩阵

例2-4 试生成一个3×8的零矩阵,并生成一个同维的单位矩阵。

以下语句可以生成一个3×8的零矩阵A,并可以生成一个和A维数相同的扩展单位阵B。可见,特殊矩阵的输入还是很容易的。

可以将下面两个矩阵输入MATLAB工作空间。

例2-5 函数zeros()和ones()还可用于多维数组的生成。例如,zeros(3,4,5)将生成一个3×4×5的三维数组,其元素全部为零。

2.2.2 随机元素矩阵

顾名思义,随机元素矩阵的各个元素是随机产生的。生成随机数有两类方法,一类方法是利用电子装置生成随机数,称为物理生成的随机数;另一类是用数学方法生成具有随机数性质的数据,这类方法生成的随机数称为伪随机数。和物理方法生成的随机数相比,伪随机数是可以重复的。

1)均匀分布伪随机数

如果矩阵的随机元素满足[0,1]区间上的均匀分布,则可以由MATLAB函数rand()生成,其调用格式为

A=rand(n), %生成n×n阶标准均匀分布伪随机数方阵

A=rand(n,m), %生成n×m阶标准均匀分布伪随机数矩阵

函数rand()还可以用于多维数组的生成。例如,A=rand(5,4,6)生成一个三维随机数组。

更一般地,如果想生成(a,b)区间上均匀分布的随机数,则可以先生成(0,1)上均匀分布的随机数矩阵V,再通过简单变换生成满足需要的矩阵V1

V=rand(n,m), V1=a+(ba)*V

例2-6 试生成一组50000个[−2,3]区间均匀分布的伪随机数,求其均值并绘制该区间内随机数据分布的直方图。

生成这样的伪随机数向量并不是难事,通过下面的命令就可以得出这组数的均值为,与理论值0.5比较接近。此外,还可以绘制出这组数据的直方图,如图2-1所示。可以看出,在各个子区间内数据的分布还是比较均匀的。

图2-1 伪随机数的分布直方图

前面提到,伪随机数有两个特点,其一是由数学公式生成的,其二是可以重复的。如何获得可重复的伪随机数呢?生成伪随机数是需要种子(seed)的,如果种子相同,则生成的伪随机数也是相同的。MATLAB提供了控制量rng()函数描述或设置伪随机数种子,该函数的简单调用格式为s=rng,该命令读取当前使用的随机数生成信息。将s存储起来,下次想生成重复的随机数,则可以将s调用出来,再给出命令rng(s),则可以获得重复的伪随机数。

例2-7 试生成两组完全一致的均匀分布伪随机数,并比较效果。

通常情况下调用两次rand()函数,是可以得出两组完全不同的伪随机数的,而执行下面的语句,生成随机数并将其存入数据文件datac27.mat。

     >> s=rng; a=rand(1,100);  save datac27 s

下次不管什么时候读入该文件都可以获得随机数种子s,这样,两次调用rand()函数,则得出的误差err为零,说明可以生成完全一致的伪随机数。

     >> load datac27; rng(s); b=rand(1,100);  err=a-b

2)均匀分布的整数矩阵

利用MATLAB的内核函数randi()也可以生成在[a,b]区间上均匀分布的随机整数矩阵,其调用格式为

A=randi([a,b],[n,m]),B=randi([a,b],n)

其中,ab均应该为整数,且ab,用于表示区间的下限与上限。前面给出的命令可以生成一个n×m长方形矩阵A,或n×n方阵B

例2-8 试生成一个由0和1构成的10×10非奇异整数矩阵。

可以考虑用无限循环结构来生成这样的矩阵,若已经找到非奇异方阵,则用break命令终止循环。这里使用rank()函数用于求矩阵的秩,如果A矩阵的秩为10(满秩),则生成的10×10矩阵是非奇异矩阵。

调用上面的语句每次可能得到不同的矩阵。例如,可能得出下面的满秩矩阵。

3)正态分布伪随机数

满足标准正态分布N(0,1)的随机数矩阵可以直接由函数randn()生成,该函数的调用格式与rand()函数一致。当然,也可以使用命令B=randn(size(A))的形式调用该函数,生成一个与B矩阵同维数的标准正态分布伪随机数矩阵。

若想生成满足N(µ,σ2)的正态分布的随机数,则可以先用V=randn(n,m)命令生成标准正态分布的随机数矩阵V,再用V1=µ+σ*V命令就可以转换成所需的矩阵。

其实,除了这两类分布的随机数外,还可以调用random()函数生成其他分布的随机数,读者可以自己尝试该函数的调用方法。

2.2.3 Hankel矩阵

Hankel矩阵是以德国数学家Hermann Hankel(1839−1873)命名的一类特殊矩阵,其具体形式与生成方法如下。

定义2-5 Hankel矩阵的数学表达式为

如果n→∞,则可以构造无穷维Hankel矩阵,不过MATLAB只能处理有限维矩阵。Hankel矩阵是对称矩阵,特点是每条反对角线上所有的元素都相同。

在MATLAB语言中提供了Hankel矩阵生成函数hankel(),该函数可以有两种调用方法:

H1=hankel(c),H2=hankel(c,r)

其中,给定两个向量cr,分别生成两种不同的Hankel矩阵。

第一种调用格式比较简单,生成的是一个方阵,矩阵下三角的元素都是零,其余元素由“Hankel矩阵反对角线元素相同”这一性质可以逐项填写出来。在第二种调用格式下,要求cn=r1,否则将给出错误信息,自动略去r1的值,故而得出的Hankel矩阵为H2的形式。但是,右上角元素是c还是r将完全取决于c向量与r向量哪个长。如果n=m,则生成方阵,这时右上角元素为cn

例2-9 试用MATLAB语句输入下面两个Hankel矩阵。

分析给出的矩阵,可以用向量分别表示该矩阵的首列和最后一行,c=[1,2,3],r=[3,4,5,6,7,8,9],则可以由下面语句生成所需的Hankel矩阵。注意,两个向量中3这个共同元素。

2.2.4 对角元素矩阵

对角矩阵是一种特殊的矩阵,这种矩阵的主对角线元素可以为零或非零元素,而非对角线元素的值均为零。对角矩阵的数学描述方法为diag(α12,…n)。其中,对角矩阵的矩阵表示为

MATLAB提供了对角矩阵的生成函数diag()。该函数的调用格式为

A=diag(v)%已知向量,生成对角矩阵

v=diag(A)%已知矩阵,提取对角元素列向量

A=diag(v,k) %生成第k条对角线为v的矩阵,若v为矩阵则提取该对角线

MATLAB提供的diag()函数是一个很有特色的函数,它不但能输入对角矩阵,也可以指定某条对角线,输入次对角矩阵,还可以从一个矩阵提取对角或次对角元素。下面通过例子演示该函数的使用方法。

例2-10 试将下面三个矩阵输入MATLAB工作空间。

可以先将v=[1,2,3]向量输入MATLAB工作空间,这样,矩阵A可以直接用diag()函数生成。现在考虑矩阵B,由于该矩阵主对角线上第2条对角线为v向量,所以应该将k设置成2,而矩阵C是主对角线下一条对角线的元素为v,所以可以将k设置为−1。这样,由下面的语句可以将这三个矩阵直接输入MATLAB工作空间。

     >> v=[1 2 3]; A=diag(v), B=diag(v,2),  C=diag(v,-1)

如果采用下面的命令还可以从矩阵提取出对角元素,但是得出的是列向量。

     >> v1=diag(A), v2=diag(B,2),  v3=diag(C,-1)

例2-11 n阶Jordan矩阵的一般形式如下,试编写MATLAB函数构造该矩阵。

可以将Jordan矩阵分解为两个矩阵的和,一个是αI,其中I为单位矩阵;另一个为第一次对角线元素均为1的矩阵,又称为幂零矩阵,后面将详细介绍。有了这样的想法,不难由下面的函数结构直接生成n×n的Jordan矩阵。

定义2-6A1A2,…,An为已知矩阵,则块对角矩阵的数学定义为

可以编写一个diagm()函数,由给出的子矩阵构造出块对角矩阵。该函数的调用格式为A=diagm(A1,A2,…,An),该函数允许输入任意多个子矩阵。

其实,MATLAB提供的blkdiag()函数也能实现同样的功能,并且其功能更强大。除了一般矩阵,还可以直接处理符号型矩阵与稀疏矩阵的块对角矩阵生成。

例2-12 假设已知下面的子矩阵,试构造出块对角矩阵。

可以使用两种方法构造块对角矩阵。

得出的结果是完全一致的。

如果矩阵B是符号型矩阵,则下面得出的矩阵C为符号型矩阵,矩阵D为双精度矩阵,其内容是相同的。

     >> B=sym([1,3; 4,2]);  C=blkdiag(A,B),  D=diagm(A,B)

2.2.5 Hilbert矩阵及Hilbert逆矩阵

Hilbert矩阵是以德国数学家David Hilbert(1862−1943)命名的特殊矩阵。

定义2-7 Hilbert矩阵是一类特殊矩阵,它的第(i,j)个元素的值满足hi,j=1/(i+j−1)。一个n阶的Hilbert矩阵可以写成

产生Hilbert矩阵的MATLAB函数为A=hilb(n)。其中,n为要产生的矩阵阶次,生成的矩阵是n×n方阵。

高阶Hilbert矩阵一般为坏条件的矩阵,直接对其求逆往往会产生浮点溢出的现象。MATLAB提供了直接求取Hilbert逆矩阵的函数B=invhilb(n)。由于Hilbert矩阵本身接近奇异的性质,所以在处理该矩阵时建议尽量采用符号运算工具箱,而采用数值解时应该检验结果的正确性。

例2-13 如果想输入一个长方形的Hilbert矩阵,最简单、最高效的方法是生成一个Hilbert方阵,然后从中提取所需的长方形矩阵。当然,也可以通过下面的命令生成长方形Hilbert矩阵。

2.2.6 相伴矩阵

定义2-8 假设有一个首一化(monic)的多项式

p(s)=sn+a1sn−1+a2sn−2+…+an−1s+an

(2-2-5)

则可以写出一个相伴(companion)矩阵(或称友矩阵)

生成相伴矩阵的MATLAB函数调用格式为Ac=compan(a)。其中,a为降幂排列的多项式系数向量,该函数将自动对多项式进行首一化处理。

例2-14 考虑一个多项式P(s)=2s4+4s2+5s+6,试写出该多项式的相伴矩阵。

先输入特征多项式,则相伴矩阵可以通过下面的语句建立起来,赋给A矩阵。

     >> P=[2 0 4 5 6]; A=compan(P) % 给出向量,自动首一化,可以建立相伴矩阵

以上语句可以得出相伴矩阵为

2.2.7 Wilkinson矩阵

Wilkinson矩阵是以英国数学家James Hardy Wilkinson(1919−1986)命名的测试矩阵。

定义2-9 Wilkinson矩阵是三对角矩阵,其第1与第−1条对角线元素都是1,2m+1阶Wilkinson矩阵主对角线为

v=[m,m−1,…,2,1,0,1,2,…,m−1,m]

(2-2-7)

2m阶的主对角元素为

v=[(2m−1)/2,…,3/2,1/2,1/2,3/2,…,(2m−1)/2]

(2-2-8)

Wilkinson矩阵可以由W=wilkinson(n)函数直接生成,若需要符号型Wilkinson矩阵,则需要调用sym()命令进行转换。

例2-15 试生成5阶和6阶Wilkinson矩阵。

可以用下面的语句直接生成所需的Wilkinson矩阵。其中,第一个Wilkinson矩阵为双精度矩阵,第二个Wilkinson矩阵为转换后的符号型矩阵。

     >> W1=wilkinson(5), W2=sym(wilkinson(6))

得出的结果为

2.2.8 Vandermonde矩阵

Vandermonde矩阵是以法国数学家Alexandre-Théophile Vandermonde(1735−1796)命名的一类特殊矩阵。

定义2-10 给定向量c=[c1,c2,…,cn],可以写出一个矩阵,其第(i,j)个元素满足(i,j=1,2,…,n)。这样构成的矩阵称为Vandermonde矩阵,其数学形式为

可以由MATLAB提供的V=vander(c)函数生成一个Vandermonde矩阵。

例2-16 试建立如下的Vandermonde矩阵。

这里要求的矩阵与式(2-2-9)给出的形式不完全一致,是Vandermonde标准型的转置。可以首先生成向量c=[1,2,3,4,5],得出其Vandermonde标准型后再将其逆时针90°旋转,则可以得出所需V矩阵。

     >> c=[1, 2, 3, 4, 5]; V=vander(c); V=rot90(V) % 先建立标准矩阵再旋转

2.2.9 一些常用的测试矩阵

定义2-11 如果一个n×n矩阵的每行元素、每列元素、正反对角线元素的和都是一个常数,则该矩阵称为魔方矩阵(magic matrix)。

定义2-12 如果一个矩阵的第一行、第一列的元素都是1,且其余元素可以由aij=ai,j−1+ai−1,j格式递推地生成,则该矩阵称为Pascal矩阵。

定义2-13 正向对角线上元素都相同的矩阵称为Toeplitz矩阵,所以已知矩阵的第一行r与第一列c,即可以构造出Toeplitz矩阵。

Pascal矩阵是以法国数学家Blaise Pascal(1623−1662)命名的特殊矩阵,Toeplitz矩阵是以德国数学家Otto Toeplitz(1881−1940)命名的特殊矩阵。

MATLAB提供的一些函数可以生成特殊矩阵。

M=magic(n), P=pascal(n), T=toeplitz(r,c)

例2-17 试分别生成四阶魔方矩阵、Pascal矩阵和Toeplitz矩阵。

由下面的命令可以直接生成所需的矩阵。

     >> A=magic(4), B=pascal(4),  C=toeplitz(1:4)

可以直接得到下面的结果。

观察Pascal矩阵的上三角部分,如果从第一列的每个元素沿反向对角线方向看,则相应的各个元素都是二次项系数。

MATLAB还提供了gallery()函数生成一些特殊矩阵,其调用格式为

A=gallery(矩阵类型,n,其他参数)

其中,“矩阵类型”可以为'binomial'、'cauchy'和'chebspec'等选项,具体可以用doc gallery命令查询。