购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 常用矩阵生成

使用矩阵进行运算的第一步是生成矩阵。本小节将介绍学习和工作中常用的MATLAB矩阵生成函数。

3.1.1 zeros——创建零矩阵

【功能简介】 生成不同维度和不同数据类型的零矩阵。

【语法格式】

1.B=zeros([m n p ...])或B=zeros(m,n,p,…)

生成m×n×p×…全零数组。

2.B=zeros([m,n])或B=zeros(m,n)

生成m×n全零矩阵。

3.B=zeros(n)

生成n×n全零矩阵。

4.B=zeros(size(A))

生成与A大小相同的全零矩阵。

5.B=zeros(…,type)

生成指定数据类型的零矩阵。可接受的参数有'double'、'single'、'int8'、'uint8'、'int16'、'uint16'、'int32'、'uint32'、'int64'和 'uint64'等。

【实例3.1】 生成二维和三维零矩阵。

【实例分析】 class函数用于显示变量的数据类型。

3.1.2 eye——创建单位矩阵

【功能简介】 生成单位矩阵。

【语法格式】

1.Y=eye([m,n])或Y=eye(m,n)

生成m×n单位矩阵。

格式变体:

■ Y=eye(n):生成n×n单位矩阵。

2.Y=eye(size(A))

生成与A大小相同的单位矩阵。

【实例3.2】 生成单位矩阵。

【实例分析】 eye函数生成的矩阵不一定是方阵。

3.1.3 magic——创建魔方矩阵

【功能简介】 生成魔方矩阵。魔方矩阵是一个n×n方阵,n≥3,矩阵由1~n 2 中的数构成。矩阵每行、每列和两条对角线上的数之和是一样的,且等于sum(1:n^2)/n。如果n小于3,则返回的不是魔方矩阵。

【语法格式】

生成n×n魔方矩阵。

【实例3.3】 生成3×3魔方矩阵。

【实例分析】 矩阵的行、列、对角线之和都等于15。

3.1.4 ones——创建全1矩阵

【功能简介】 生成不同维度和不同数据类型的全1矩阵。

【语法格式】

1.Y=ones([m n p ...])或Y=ones(m,n,p,…)

生成m×n×p×…全1数组。

2.Y=ones([m,n])或Y=ones(m,n)

生成m×n全1矩阵。

3.Y=ones(n)

生成n×n全1矩阵。

4.Y=ones(size(A))

生成与A大小相同的全1矩阵。

5.Y=ones(…,type)

生成指定数据类型的全1矩阵。可接受的参数有'double'、'single'、'int8'、'uint8'、'int16'、'uint16'、'int32'、'uint32'、'int64' 和'uint64'等。

【实例3.4】 生成一个三维全1矩阵。

【实例分析】 ones函数的调用格式与zeros函数相同。

3.1.5 linspace——创建线性等分向量

【功能简介】 生成线性等分向量。

【语法格式】

1.y=linspace(a,b,n)

在闭区间[a,b]上生成n个线性等分点。

2.y=linspace(a,b)

相当于y=linspace(a,b,100),在闭区间[a,b]上生成100个线性等分点。

【实例3.5】 分别用冒号运算符和linspace函数生成线性等分向量。

【实例分析】 冒号运算符能直接控制数字间距,linspace函数能直接控制向量长度。

3.1.6 logspace——创建对数等分向量

【功能简介】 生成对数等分向量。

【语法格式】

1.y=logspace(a,b,n)

在闭区间[10 a ,10 b ]上生成n个对数等分点。

2.y=logspace(a,b)

相当于y=logspace(a,b,50),在闭区间[10 a ,10 b ]上生成50个对数等分点。

【实例3.6】 对数等分向量与线性等分向量的比较。

执行结果如图3-1所示。

图3-1 对数等分向量与线性等分向量。

【实例分析】 红色坐标点为线性等分向量,蓝色坐标点为对数等分向量。

3.1.7 rand——创建均匀分布随机矩阵

【功能简介】 生成[0,1]区间上均匀分布的随机矩阵。

【语法格式】

1.rand([m n p ...])或rand(m,n,p,…)

生成m×n×p×…均匀分布矩阵。

2.rand([m,n])或rand(m,n)

生成m×n均匀分布矩阵。

3.rand(n)

生成n×n均匀分布矩阵。

4.rand(size(A))

生成与A大小相同的均匀分布矩阵。

5.rand

相当于rand(1),只产生一个随机数。

6.rand(…,'double')或rand(…,'single')

生成指定数据类型的随机数矩阵。

【实例3.7】 利用rand函数生成100~150之间的随机数。

【实例分析】 rand是MATLAB中十分常用的函数。

3.1.8 randn——创建正态分布随机矩阵

【功能简介】 生成正态分布的随机矩阵。

【语法格式】

1.randn([m n p ...])或randn(m,n,p,…)

生成m×n×p×…正态分布随机矩阵。

2.randn([m,n])或randn(m,n)

生成m×n正态分布随机矩阵。

3.randn(n)

生成n×n正态分布随机矩阵。

4.randn(size(A))

生成与A大小相同的正态分布随机矩阵。

5.randn

相当于randn(1),只产生一个正态分布的随机数。

6.randn(…,'double')或randn(…,'single')

生成指定数据类型的正态分布随机数矩阵。

【实例3.8】 利用randn函数生成随机数矩阵。

执行结果如图3-2所示。

图3-2 随机数在各区间的数量分布。

【实例分析】 变量x用于统计各区间中随机数的个数。图3-2直观地显示了randn产生正态分布随机数的功能,由于数字是随机的,每次运行产生的结果都不相同,但多次实验后基本接近正态分布概率密度函数的形状。

3.1.9 randperm——生成随机整数排列

【功能简介】 生成一定范围内整数的随机排列。

【语法格式】

生成1~n之间整数的无重复随机排列。

【实例3.9】 生成1~10之间整数的随机排列。

【实例分析】 randperm可以产生1~n之间的随机顺序。

3.1.10 cat——创建多维数组

【功能简介】 cat函数通过连接多个矩阵的方式生成多维矩阵。

【语法格式】

1.C=cat(dim,A,B)

沿着dim所指定的维度连接数组A与数组B。例如,当dim为1时,沿着列的方向连接A与B,即C=[A;B]。当dim为2时,沿着行的方向连接A与B,即C=[A,B]。

2.C=cat(dim,A1,A2,A3,A4,…)

沿着dim所指定的维度连接数组A1、A2、A3、A4等。

【实例3.10】 通过实例理解参数dim的作用。

【实例分析】 dim取1、2、3时,函数分别将a和b排列在列、行和页面中。

【实例3.11】 用cat函数从结构体数组中提取某一域,构成新的数组。

【实例分析】 data为结构数组,cat函数从中提取int域中的数,构成新的数值数组,便于计算。

3.1.11 hilb——生成Hilbert(希尔伯特)矩阵

【功能简介】 希尔伯特矩阵是一种数学变换矩阵,正定,且高度病态,MATLAB中用hilb函数生成希尔伯特矩阵。

【语法格式】

生成n阶希尔伯特矩阵,其元素为H(i,j)=1/(i+j-1)。

【实例3.12】 生成一个3阶希尔伯特矩阵。

【实例分析】 病态矩阵中,任何一个元素发生一点变动,整个矩阵的值和逆矩阵都会发生巨大变化,病态程度和阶数相关。

3.1.12 invhilb——生成逆希尔伯特矩阵

【功能简介】 由于希尔伯特矩阵中,数据的微小抖动都会引起逆矩阵的巨大变化,因此采用一般方法无法求希尔伯特矩阵的逆矩阵。MATLAB有专门的invhilb函数解决这个问题。

【语法格式】

生成n阶希尔伯特逆矩阵。

【实例3.13】 生成一个3阶希尔伯特逆矩阵。

【实例分析】 用invhilb函数才能可靠地求出希尔伯特矩阵的逆矩阵。

3.1.13 pascal——生成Pascal矩阵

【功能简介】 生成帕斯卡矩阵。二项式展开的系数随n的增大组成一个三角形,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。

【语法格式】

1.A=pascal (n)

生成n阶Pascal矩阵。返回的结果是对称、正定的矩阵,其元素由Pascal三角形组成,它的逆矩阵中所有元素都是整数。

2.A=pascal(n,1)

生成由下三角形排列的Cholesky系数组成的n阶Pascal矩阵,它的逆矩阵是它本身。

3.A=pascal(n,2)

生成pascal(n,1)的转置和交换形式。

【实例3.14】 生成3阶Pascal矩阵。

【实例分析】 容易看出,c=fliplr(b')。

3.1.14 toeplitz——生成托普利兹矩阵

【功能简介】 生成托普利兹(Toeplitz)矩阵。矩阵中,除第一行与第一列外,其他所有元素都与左上角相邻位置的元素相等,即T(i,j)=T(i-1,j-1)。

【语法格式】

1.T=toeplitz(c,r)

生成非对称托普利兹矩阵,将c作为第一列,r作为第一行,若c(1)与r(1)不相等,则使用c(1)作为矩阵的第一个元素,同时打印一条警告信息。

2.T=toeplitz(r)

生成对称的托普利兹矩阵,将r作为第一行与第一列。

【实例3.15】 用给定的向量c、r生成非对称托普利兹矩阵。

【实例分析】 当c与r第一个元素不相等时,采用向量c的第一个元素,忽略r的第一个元素。

3.1.15 compan——生成友矩阵

【功能简介】 生成友矩阵。

【语法格式】

u为多项式向量,A返回多项式u的友矩阵。A的第一行元素为-u(2:n)/u(1),即u的第2~n个元素除以第1个元素再取相反数。矩阵A的特征值是多项式的根。

【实例3.16】 生成多项式(x-1)(x+2)(x-3)=x 3 -2x 2 -5x+6的友矩阵。

【实例分析】 eig函数求出矩阵的特征值,可以看出A的特征值等于多项式的根。

3.1.16 hankel——生成Hankel矩阵

【功能简介】 生成Hankel矩阵。Hankel矩阵的构成方式是:先指定第一列和最后一行,矩阵中其他所有元素都与其左下角相邻位置的元素相等,即H(i,j)=H(i+1,j-1)。

【语法格式】

1.H=hankel(c,r)

生成非对称的Hankel矩阵。第一列元素为c,最后一行元素为r,若c的最后一个元素与r的第一个元素不相等,交叉位置的元素取c的最后一个元素。

2.H=hankel(c)

生成对称的Hankel矩阵。第一列元素为c,次对角线下方所有元素均为零。

【实例3.17】 给定向量c、r生成Hankel矩阵。

【实例分析】 除第一列与最后一行外,其余元素都等于其左下方相邻的元素。

3.1.17 blkdiag——生成以输入元素为对角线元素的矩阵

【功能简介】 生成以输入元素为对角线元素的矩阵。

【语法格式】

生成以a,b,c,d,…为对角线元素的矩阵。

【实例3.18】 生成以1.5、2.5、3.5为对角线元素的矩阵。

【实例分析】 除对角线外,其余元素均为零。

3.1.18 wilkinson——生成Wilkinson特征值测试矩阵

【功能简介】 生成Wilkinson特征值测试矩阵。

【语法格式】

生成n阶特征值测试矩阵,它是一个对称的三对角矩阵。

【实例3.19】 生成4阶特征值测试矩阵。

【实例分析】 Wilkinson特征值测试矩阵是一个三对角矩阵。

3.1.19 spaugment——生成最小二乘增广矩阵

【功能简介】 生成最小二乘增广矩阵。

【语法格式】

S返回一个稀疏、对称的非正定方阵,S=[c*I,A;A',0],c为残留比例因子,I为单位矩阵。函数的功能是求解一个最小二乘问题:

min(norm(b-A*x))

norm函数用于求第二范式,如向量[1,1]的第二范式为sqrt(1 2 +1 2 )=1.4142。最小二乘问题可以表述为:

r=b-A*x

S*[r/c;x]=[b;0]

【实例3.20】 生成一个最小二乘增广矩阵。

【实例分析】 关于最小二乘计算的详细信息,请读者查看相应的帮助文档。 YRZ1FzwWiwyYk5PzLmqR6WVgx35zD25/vpus3kc7778aEJ7PwSIJU1x4LcIQIYpk



3.2 矩阵基本运算

MATLAB系统丰富和完善的函数库为用户提供了强大的矩阵运算功能。另外,MATLAB中的运算符也能实现基本的矩阵运算,在下面的小节中将进行详细介绍。

3.2.1 矩阵运算基础

【功能简介】 “+”、“-”、“*”、“/”分别对矩阵进行加、减、乘、除运算。

【语法格式】

1.C=A+B或C=A-B

A与B是大小相同的矩阵或数组,上式对A和B中的每一个元素分别进行加法或减法运算,并将结果返回给C,C与A和B大小相同。

格式变体:

■ C=A+b或C=A-b:b是一个标量值,计算时,A中的每一个元素分别加上或减去b。相当于C=A+repmat(b,size(A))或C=A-repmat(b,size(A))。

2.C=A.*B或C=A./B

A与B大小相同,计算时,A、B中的每一个元素分别进行乘法或除法运算,并将结果返回给C,C是A和B的同型矩阵。

格式变体:

■ C=A.*b或C=A./b:b是一个标量值,A中的所有元素都乘以或除以b。

3.C=A*B

进行矩阵乘法或矩阵除法。m×n的矩阵A与n×p的矩阵B相乘,得到m×p的矩阵C。C中任意一个元素C(i,j)的计算方法是sum(A(i,:).*B(:,j))。

4.X=A/B或X=A\B

A/B相当于A*inv(B),是X*B=A的解。B必须是非奇异矩阵。A\B相当于inv(A)*B,是A*X=B的解,A必须是非奇异矩阵。

【实例3.21】 矩阵的加减乘除运算。

【实例分析】 注意数值的乘除与矩阵的乘除之间的区别。

3.2.2 dot——向量或矩阵的点乘

【功能简介】 计算向量的内积(点乘)。

【语法格式】

1.C=dot(A,B,dim)

A与B是大小相同的矩阵或数组,函数在dim指定的维数中计算A与B的内积。

2.C=dot(A,B)

若A与B为向量,返回A与B的内积。若A与B为矩阵,对每列计算A、B的内积。若A、B为多维数组,则沿着第一个长度不为1的维度进行计算。

【实例3.22】 分别对两个矩阵中的每一列及两个向量计算内积。

【实例分析】 若A、B是两个向量,还可以用点乘的和代替dot函数。

3.2.3 cross——向量或矩阵的叉乘

【功能简介】 计算向量的外积(叉乘)。

【语法格式】

1.C=cross(A,B,dim)

A与B是大小相同的矩阵或数组,函数在dim指定的维数中长度必须为3,C返回A与B的外积。

2.C=cross(A,B)

在A与B第一个长度不为1的维度上计算外积,且在该维度上数组含有3个元素。

【实例3.23】 求两个三维向量的外积。

【实例分析】 a、b的外积c垂直于a与b。

【实例3.24】 求向量a=(1,2,3)、b=(4,5,6)和c=(7,8,9)的混合积a · (b×c)。

【实例分析】 计算混合积时顺序不可颠倒。

3.2.4 rank——求矩阵的秩

【功能简介】 求矩阵的秩。

【语法格式】

1.k=rank(A,tol)

k返回矩阵A的秩,tol为给定的精确度,k必须大于tol。

2.k=rank(A)

求矩阵的秩,采用默认的精确度。

【实例3.25】 求魔方矩阵的秩。

【实例分析】 秩代表矩阵中相互独立的行或列的个数。

3.2.5 det——求矩阵的行列式

【功能简介】 用高斯消元法求方阵的行列式。

【语法格式】

函数返回方阵X的行列式。行列式等于零的矩阵称为奇异矩阵,理论上可以采用det(X)<tolerance的方法测试矩阵X是否为奇异矩阵。但由于无法合适地选择误差容限tolerance,因此,这种奇异性测试的方法是不被推荐的。

【实例3.26】 求不同矩阵的行列式。

【实例分析】 只有方阵才有行列式。

3.2.6 inv——求矩阵的逆

【功能简介】 用于求解逆矩阵。

【语法格式】

函数返回矩阵X的逆矩阵。注意,只有可逆的矩阵才有逆矩阵,可逆矩阵就是非奇异矩阵,即方阵的行列式不能为零。一种典型的应用是用inv函数来求解线性方程组。在Ax=b中,解出来的结果是x=inv(A)*b,其实求解该方程组有更简便、快速的方法:x=A\b。

【实例3.27】 用两种方法求解线性方程组。

【实例分析】 用逆矩阵和左除运算符求线性方程组的结果是一样的。

3.2.7 pinv——求矩阵的伪逆矩阵

【功能简介】 用于求矩阵的伪逆矩阵。

【语法格式】

1.B=pinv(A)

函数返回矩阵A的伪逆矩阵。如果矩阵A是可逆(非奇异)的,那么pinv(A)与inv(A)的结果是一样的,而且pinv比inv效率低。但如果矩阵A是奇异矩阵,则inv(A)不存在,但pinv(A)仍然存在,并表现出一些与逆矩阵类似的性质。在pinv函数中,A不一定是方阵。

2.B=pinv(A,tol)

采用tol代替默认的精确度。

【实例3.28】 求方阵和普通矩阵的伪逆矩阵。

【实例分析】 矩阵a的秩小于矩阵行数,是奇异矩阵,其逆矩阵不存在,但伪逆矩阵存在。矩阵b不是方阵,没有逆矩阵,但可以有伪逆矩阵。

3.2.8 trace——求矩阵的迹

【功能简介】 求矩阵的迹。迹就是矩阵主对角线元素之和。

【语法格式】

返回矩阵A的迹,相当于sum(diag(A))。

【实例3.29】 求三阶魔方矩阵的迹。

【实例分析】 魔方矩阵是一种每行、每列及两条对角线元素之和都相等的矩阵。

3.2.9 norm——求矩阵和向量的范数

【功能简介】 计算向量或矩阵的逆。

【语法格式】

1.n=norm(A,p)

对任意的1≤p≤+∞,该函数返回向量的p-范数,即sum(abs(A).^p)^(1/p)。

2.n=norm(A)

返回向量的欧几里德范数,即norm(A,2)。

3.n=norm(A,inf)

返回向量元素中绝对值的最大值,即max(abs(A))。

4.n=norm(A,-inf)

返回向量元素中绝对值的最小值,即min(abs(A))。

【实例3.30】 求向量[-1,2,3]的各种范数。

【实例分析】 实例中分别求了向量a的1-范数、欧几里德范数及正负无穷范数。

【语法格式】

1.n=norm(A,1)

返回矩阵的1-范数,即每列元素之和的最大值max(sum(abs(A)))。

2.n=norm(A,2)或n=norm(A)

返回矩阵的欧几里德范数,即矩阵奇异值的最大值max(svd(A))。

3.n=norm(A,inf)

返回矩阵的无穷大范数,即每行元素之和的最大值max(sum(abs(A')))。

4.n=norm(A,'fro')

返回矩阵的Frobenius范数,即sqrt(sum(diag(A'*A)))。

【实例3.31】 求矩阵[1,2,3;4,5,6]的各种范数。

【实例分析】 p取值不同,矩阵范数的含义也不同。

3.2.10 conv——向量的卷积和多项式乘法

【功能简介】 求向量卷积或进行多项式乘法运算。长度为m的向量u与长度为n的向量v的卷积(Convolusion)定义为w(k)=sum(u(j)*v(k+1 - j))。向量w的长度为m+n-1。

【语法格式】

返回向量u和v的卷积。

【实例3.32】 求两个全1向量的卷积。

【实例分析】 卷积在数字信号处理中是序列的一个非常基本的运算。

3.2.11 deconv——反褶积和多项式除法

【功能简介】 求向量反褶积和进行多项式除法运算。

【语法格式】

参数q和r分别返回多项式v除以多项式u的商多项式和余多项式。

【实例3.33】 求多项式(x 2 +2x+1)与多项式(2x 2 +x+3)的积,再求积与(x 2 +2x+1)的商。

【实例分析】 向量c代表多项式(2x 4 +5x 3 +7x 2 +7x+3)。

3.2.12 kron——张量积

【功能简介】 求向量或矩阵的克罗内克张量积。

【语法格式】

K返回向量或矩阵X、Y的克罗内克张量积。X、Y顺序不可交换,若X为2×3矩阵,则kron(X,Y)为:

[X(1,1)*Y, X(1,2)*Y, X(1,3)*Y

X(2,1)*Y, X(2,2)*Y, X(2,3)*Y]

【实例3.34】 求两个矩阵的张量积。

【实例分析】 kron(X,Y)中两个参数顺序不可交换。

3.2.13 intersect——求两个集合的交集

【功能简介】 求向量或矩阵的公共部分。

【语法格式】

1.c=intersect(a,b)

函数找出向量a与b的相同元素,并按升序返回到c中。

格式变体:

■ [c,ia,ib]=intersect(a,b):c返回向量a与向量b的公共元素,ia返回公共元素在a中的位置,ib返回公共元素在b中的位置。

2.c=intersect(A,B,'row')

A与B是列数相同的矩阵,c返回A和B中元素相同的行。

【实例3.35】 求两个向量的公共部分及公共部分在向量中的位置。

【实例分析】 矩阵d的第一行是a与b的公共元素,第二行是公共元素在a中的位置,第三行是公共元素在b中的位置。

3.2.14 ismember——检测集合中的元素

【功能简介】 检测元素是否在集合中。

【语法格式】

1.tf=ismember(A,S)

返回与A大小相同的逻辑数组,如果A中的元素属于S,那么A中的相应位置返回1(true),否则返回0(false)。

格式变体:

■ [tf, loc] = ismember(A, S,…):A中的元素若属于S,则tf返回1,loc返回该元素在S中的索引值,若有多个相等的元素,则返回最大的索引值。若A中的元素不属于S,则tf与loc均返回零。

2.k=ismember(A,S,'row')

A与B是列数相同的矩阵,A和B中元素相同的行返回1,否则返回0。

【实例3.36】 求向量a中的元素是否在set中,并求出其位置。

【实例分析】 tf中的1表示该元素在set中,0值表示该元素不在set中。index中的非0值表示元素在set中的索引值,0值表示元素不在set中。

3.2.15 setdiff——求两个集合的差

【功能简介】 返回两个集合的差。

【语法格式】

1.c=setdiff(A,B)

计算在A中而不在B中(即A-B)的元素,并按升序排列后返回。

格式变体:

■ [c,i] = setdiff(A, B):i返回元素在A中的位置索引。

2.c=setdiff(A, B, 'rows')

A与B是列数相同的矩阵,返回在A中而不在B中的行。

【实例3.37】 求在矩阵A中而不在矩阵B中的行。

【实例分析】 A中第一行属于B,第二行不属于B。

3.2.16 setxor——求两个集合交集的非(异或)

【功能简介】 返回两个集合的异或。

【语法格式】

1.c=setxor(A,B)

c返回A与B的异或,即属于A且不属于B的元素和属于B且不属于A的元素。

格式变体:

■ [c,ia,ib] = setdiff(A, B):ia返回c中元素在A中的位置索引,ib返回c中元素在B中的位置索引。

2.c=setxor(A, B, 'rows')

A与B是列数相同的矩阵,返回A、B的非公共行。

【实例3.38】 求向量A=[1,2,3,4]与向量B=[2,4,5,8]的交集的非。

【实例分析】 两个集合的异或即两集合交集的非。

3.2.17 union——求集合的并集

【功能简介】 返回两个集合的并集。

【语法格式】

1.c=union(A,B)

c返回A与B的并集。

格式变体:

■ [c,ia,ib] = union(A, B):ia返回c中元素在A中的位置索引,ib返回c中元素在B中的位置索引。

2.c=union(A, B, 'rows')

A与B是列数相同的矩阵,c中的行由A、B中的行构成。

【实例3.39】 求向量[-1,0,2,4,6]与[-1,0,1,3]的并集。

【实例分析】 intersect、ismember、setdiff、setxor、union这几个函数的功能有一定类似之处,语法格式也比较相似。

3.2.18 unique——求集合的单值元素

【功能简介】 求集合中的单值元素,即重复的元素只保留一份。

【语法格式】

1.b=unique(A)

b返回A中的单值元素。

2.c=unique (A,'rows')

c返回矩阵A中的单值行。

【实例3.40】 求一个包含NaN的向量中的单值元素。

【实例分析】 NaN(Not a Number)互相是不相等的,因此b中包含两个NaN。

3.2.19 diag——创建对角矩阵

【功能简介】 用给定对角线元素构造矩阵或抽取矩阵的对角线元素。

【语法格式】

1.X=diag(v,k)

以向量v为矩阵X的第k条对角线,当k=0时,向量v为X的主对角线,k>0时,v为主对角线上方的第k条对角线,k<0时,v为主对角线下方的第k条对角线。

格式变体:

■ X=diag(v):以向量v为矩阵X的主对角线,即默认k=0。

2.v=diag(X,k)

从矩阵中抽取一条对角线返回给向量v。当k=0时,抽取主对角线,k>0时,抽取主对角线上方的第k条对角线,k<0时,抽取主对角线下方的第k条对角线。

格式变体:

■ V=diag(X):抽取矩阵X的主对角线元素,即默认k=0。

【实例3.41】 用diag函数构成一个三对角矩阵。

【实例分析】 参数k为正,则对角线在主对角线上方;k为负,则对角线在主对角线下方。

3.2.20 tril——下三角矩阵的抽取

【功能简介】 抽取下三角矩阵。【语法格式】

抽取矩阵中第k条对角线及其以下的元素。k=0指主对角线,k>0指主对角线以上的第k条对角线,k<0指主对角线以下的第k条对角线。

格式变体:

■ L=tril(X):返回矩阵的下三角矩阵,即默认k=0。

【实例3.42】 对全1矩阵进行下三角矩阵的抽取。

【实例分析】 用这种方法可以方便地进行下三角矩阵的抽取。

3.2.21 triu——上三角矩阵的抽取

【功能简介】 抽取上三角矩阵。

【语法格式】

抽取矩阵中第k条对角线及其以上的元素。k=0指主对角线,k>0指主对角线以上的第k条对角线,k<0指主对角线以下的第k条对角线。

格式变体:

■ U=triu(X):返回矩阵的上三角矩阵,即默认k=0。

【实例3.43】 对全1矩阵进行上三角矩阵的抽取。

【实例分析】 triu函数与tril函数的调用格式是一样的。

3.2.22 reshape——矩阵变维

【功能简介】 矩阵变维。

【语法格式】

1.B=reshape(A,[m n p ...])或B=reshape(A,m,n,p,...)

返回一个m×n×p的多维数组B,B与A含有相同的元素个数,即m×n×p=prod(size(A))。

格式变体:

■ B=reshape(A,m,n):对数组A进行维度转换,返回一个m×n的矩阵。

■ B=reshape(A,…,[],…):指定B的维度时,可以用[]代替其中一个维度,该维度可以由系统通过计算自动确定,但最多只能有一个维度是用[]代替的。

2.B=reshape(A,siz)

将数组A进行变维,按siz指定的形状返回。

【实例3.44】 用不同方法对一个3×4矩阵进行变维。

【实例分析】 最多只能用[]代替其中一个维度。

3.2.23 repmat——矩阵的复制和平铺

【功能简介】 复制数组。

【语法格式】

1.B=repmat(A,[m n])或B=repmat(A,m,n)

返回一个大矩阵B,包含m×n个矩阵A。B的大小为[size(A,1)*m, size(A,2)*n]。

2.B=repmat(A,[m n p…])

返回一个大的多维数组B,B包含m×n×p个矩阵A,其大小为[size(A,1)*m, size(A,2)*n, size(A,3)*p, …]。

【实例3.45】 对magic(3)进行复制,产生一个6×9的矩阵。

【实例分析】 矩阵b将a当做一个元素,平铺成2行3列。

3.2.24 rot90——矩阵旋转

【功能简介】 矩阵旋转90°或90°的倍数。

【语法格式】

1.B=rot90(A)

将矩阵A逆时针旋转90°以后返回B。

2.B=rot90(A,k)

将矩阵A逆时针旋转(90×k)°以后返回B,k取负数时表示顺时针旋转。

【实例3.46】 对矩阵进行逆时针和顺时针旋转。

【实例分析】 利用这个函数可以实现矩阵90°角任意倍数的旋转。

3.2.25 fliplr——矩阵左右翻转

【功能简介】 实现矩阵左右翻转。

【语法格式】

对矩阵A进行左右翻转。

【实例3.47】 对矩阵magic(3)进行左右翻转。

【实例分析】 左右翻转的过程中,如果矩阵有奇数列,那么中间一列是没有变化的。

3.2.26 flipud——矩阵上下翻转

【功能简介】 实现矩阵上下翻转。

【语法格式】

对矩阵A进行上下翻转。

【实例3.48】 对矩阵magic(3)进行上下翻转。

【实例分析】 与左右翻转类似,上下翻转的过程中,如果矩阵有奇数行,那么中间一行是没有变化的。

3.2.27 flipdim——按指定维数翻转矩阵

【功能简介】 按指定维数翻转矩阵。

【语法格式】

按指定维数翻转矩阵,flipdim(A,1)=flipud(A),且flipdim(A,2)=fliplr(A)。

【实例3.49】 对矩阵A=[1,2,3;4,5,6]分别进行上下和左右翻转。

【实例分析】 flipdim可以根据不同的参数分别实现fliplr和flipud的功能。

3.2.28 expm——矩阵的指数函数

【功能简介】 求矩阵的指数函数。

【语法格式】

输入参数X必须为方阵,函数计算矩阵X的指数并返回Y。计算方法是:

[V,D] = eig(X)

expm(X) = V*diag(exp(diag(D)))

【辨析与注意】

expm函数计算的是矩阵指数,而exp函数则分别计算每一元素的指数。若输入矩阵是上三角矩阵或下三角矩阵,两函数计算结果中主对角线位置的元素是相等的,其余元素则不相等。expm的输入参数必须为方阵,而exp函数则可以接受任意维度的数组作为输入。

【实例3.50】 对矩阵分别用expm和exp函数计算指数。

【实例分析】 对上三角矩阵aa分别用expm和exp计算,主对角线位置元素相等,其余元素则不相等。

3.2.29 logm——求矩阵的对数

【功能简介】 求矩阵的对数函数。

【语法格式】

1.L=logm(A)

输入参数A必须为方阵,函数计算矩阵A的对数并返回L。如果矩阵A是奇异的或者有特征值在负实数轴,那么A的主要对数是未定义的,函数将计算非主要对数并打印警告信息。logm函数是expm函数的逆运算。

2.[L,exitflag]=logm(A)

exitflag是一个标量值,用于描述函数logm的退出状态。exitflag为零时,表示函数成功完成计算,为1时,需要计算太多的矩阵平方根,但此时返回的结果依然是准确的。

【实例3.51】 先对方阵计算指数,再对结果计算对数,得到原矩阵。

【实例分析】 logm函数是expm函数的逆运算,因此得到的结果与原矩阵相等。

3.2.30 funm——矩阵的函数运算

【功能简介】 对矩阵进行函数运算。

【语法格式】

1.F=funm(A,fun)

输入参数A必须为方阵,fun可以是任意基本函数,如sin、cos等。函数计算fun指定的矩阵函数并将结果返回给F。例如,sin(A)是对矩阵A中每一个元素分别求正弦,而funm(A,@sin)则对整个矩阵求正弦,两者得出的结果是不相等的。

2.F=funm(A,fun,options)

options是一个包含运算参数的结构体,如options.Display可取值'off'、'on'、'verbose',默认为'off',表示函数的显示级别(Level of display)。关于options结构体的详细信息请读者参阅MATLAB的帮助文档。

【实例3.52】 对魔方矩阵进行基本的矩阵函数运算。

【实例分析】 funm执行的是矩阵函数的运算,而不是对每一个元素分别进行运算。

3.2.31 sqrtm——矩阵的平方根

【功能简介】 计算矩阵的平方根。

【语法格式】

1.X=sqrtm(A)

计算矩阵A的平方根A 1/2 ,即X*X=A。若矩阵A的每个特征值都有非负实部,则X是唯一的,若矩阵A的特征值有负的实部,X返回负矩阵,若A为奇异矩阵,则X不存在。检测到A的奇异性时,将打印警告信息。

格式变体:

■ [X,resnorm]=sqrtm(A):resnorm为结果残差,resnorm=norm(A-X^2,'fro')/norm(A,'fro')。

2.[X,alpha,condest]=sqrtm(A)

alpha为稳定因子,condest为结果的条件数的估计值。

【实例3.53】 计算一个2×2矩阵的平方根。

【实例分析】 矩阵b有4个平方根,分别是a、c、-a、-c。

3.2.32 cond——求矩阵的条件数

【功能简介】 求矩阵的条件数。矩阵的条件数用于衡量线性方程组的解对数据误差的敏感性,它反映出矩阵求逆及线性方程组解的精确程度。

【语法格式】

1.c=cond(X)

求矩阵X的2-范数的条件数,即X的最大奇异值与最小奇异值的比值。

2.c=cond(X,p)

求矩阵X的p-范数的条件数。p=1表示1-范数条件数,p=2表示2-范数条件数,p='fro'表示Frobenius-范数条件数,p=inf表示无穷大范数条件数。

【实例3.54】 求矩阵的条件数。

【实例分析】 对于线性方程Ax=b,如果A的条件数大,b的微小改变就能引起解x较大的改变,数值稳定性差。如果A的条件数小,b有微小的改变,x的改变也很微小,数值稳定性好。

3.2.33 condest——1-范数的条件数估计

【功能简介】 求矩阵1-范数的条件数估计。

【语法格式】

1.c=condest(A)

求方阵A的1-范数的条件数的下界估计c。

2.[c,v]=condest(A)

计算向量v,v满足norm(A*v,1) = norm(A,1)*norm(v,1)/c。

【实例3.55】 求矩阵的1-范数条件数估计。

【实例分析】 condest与cond函数都与矩阵条件数有关。

3.2.34 normest——2-范数的条件数估计

【功能简介】 求矩阵的2-范数的条件数估计,主要针对稀疏矩阵。

【语法格式】

1.nrm=normest(S)

求矩阵S的2-范数(欧几里德范数)的估计值nrm,相对误差小于1e-6。

格式变体:

■ nrm=normest(S,tol):tol为指定的相对误差,不采用默认的1e-6。

2.[nrm,count]=normest(…)

输出参数count为计算范数时迭代的次数。

【实例3.56】 求稀疏矩阵的2-范数估计。

【实例分析】 sparse函数产生稀疏矩阵。

3.2.35 rcond——矩阵可逆的条件数估值

【功能简介】 求矩阵可逆的条件数估值。

【语法格式】

返回矩阵A的1-范数可逆的条件数。对于好条件矩阵A,rcond(A)是接近1的数。对于差条件矩阵A,rcond(A)是接近0的数。和cond相比,rcond(A)在对估计矩阵条件数上更有效率,但更不可靠。

【实例3.57】 求魔方矩阵的可逆条件数估值。

【实例分析】 magic(3)的可逆的条件数估值更接近0,所以这是一个条件不好的矩阵。

3.2.36 condeig——特征值的条件数

【功能简介】 求矩阵特征值的条件数。

【语法格式】

1.c=condeig(A)

返回矩阵A的特征值对应的条件数向量c。这些条件数是左、右特征向量夹角的余弦值的倒数。

2.[V,D,s]=condeig(A)

相当于[V,D]=eig(A),s=condrig(A)。

【实例3.58】 求矩阵的特征值条件数。

【实例分析】 关于特征值条件数的详细信息,读者可参阅MATLAB帮助文档。

3.2.37 rat/rats——用有理数形式表示矩阵

【功能简介】 用有理分式逼近矩阵。

【语法格式】

1.[N,D]=rat(X)

返回多项分数数组N和D使得N./D在默认误差1.e-6*norm(X(:),1)内逼近X。

格式变体:

■ [N,D]=rat(X,tol):用tol取代默认的误差。

2.S=rats(X)

rats与rat功能相似,且在内部调用了rat函数,返回值S是字符串。对于有理小数a,rats(a)相当于用format rat来显示a。

格式变体:

■ S=rats(X,strlen):返回包含有理逼近X的字符串,strlen是rats 函数返回每个字符串的长度。默认为strlen = 13。

【实例3.59】 将随机生成的实数矩阵表示成有理数形式。

【实例分析】 矩阵a中,a(1)=1200/193,其余元素以此类推。

3.2.38 sym——数值矩阵转为符号矩阵

【功能简介】 将数值矩阵转化为相应的符号矩阵。

【语法格式】

将数值矩阵A转化为相应的符号矩阵S。无论矩阵是用浮点数还是分数表示,转化后的符号矩阵都将以最接近原值的有理数形式或者函数形式表示。

【实例3.60】 将一个2×2实数矩阵转化为符号矩阵。

【实例分析】 sym函数在转化时,总是以最接近原值的有理数形式或函数形式来表示实数。

3.2.39 factor——符号矩阵的因式分解

【功能简介】 求符号表达式的因式分解,此外还能对整数进行素数因子分解。

【语法格式】

1.f=factor(n)

对整数n进行素数因子分解,返回包含n的素数因子的行向量。

2.factor(X)

对符号表达式或符号整数数组X进行因式分解。

【实例3.61】 对整数和符号表达式进行分解。

【实例分析】 factor函数常用于多项式的因式分解,但不是所有多项式都能进行因式分解。

3.2.40 expand——符号矩阵的展开

【功能简介】 进行多项式和初等函数的符号展开。

【语法格式】

将符号表达式s的每个元素表示为其因子的积,常用于多项式、三角函数、指数和对数函数的展开。

【实例3.62】 对多个符号表达式进行展开。

【实例分析】 直接使用x、y、t构造符号表达式之前,先用syms对其进行声明。

3.2.41 numel——矩阵的元素个数

【功能简介】 返回矩阵或数组中的元素个数。

【语法格式】

求矩阵或数组A的元素个数并返回n,相当于length(A(:))。

【实例3.63】 求四维数组的元素个数。

【实例分析】 数组a有2×2×2×3=24个元素。

3.2.42 cdf2rdf——复对角矩阵转化为实对角矩阵

【功能简介】 将复对角矩阵转化为实对角矩阵。

【语法格式】

把复数对角矩阵转化为实数块对角矩阵,如果特征方程[V,D]=eig(X)有成对的复特征值,cdf2cdf把矩阵V、D转化为实对角形式,对角线上2×2实数块将取代原有的复数对。

【实例3.64】 求矩阵x=[1,2,3;0,4,5;0,-5,4]的特征值与特征向量,再对所得复矩阵进行转化。

【实例分析】 矩阵d有成对的复特征值4.0000 + 5.0000i、4.0000- 5.0000i。

3.2.43 orth——将矩阵正交规范化

【功能简介】 将矩阵正交规范化,得到矩阵的正交基。

【语法格式】

返回矩阵A的正交基,B的列与A的列具有相同的空间,B的列向量是正交向量,满足B'*B = eye(rank(A)),B的列数是A的秩。

【实例3.65】 求矩阵x=[4,0,0;0,3,1;0,1,3]的正交基。

【实例分析】 B'*B是单位矩阵。

3.2.44 rref——计算行阶梯矩阵

【功能简介】 求行阶梯形式矩阵。

【语法格式】

1.R=rref(A)

用高斯-约旦消元法和行主元法求A的行阶梯矩阵R。用默认误差(max(size(A))*eps *norm(A,inf))测试可以忽略不计的列的元素。

2.[R,jb]=rref(A)

返回向量jb满足:r=length(jb)是矩阵A的秩;X(jb)是线性方程AX=b的主元变量;A(:,jb)是A的列向量基;R(1:r,jb)是r×r的单位矩阵。

格式变体:

■ [R,jb]=rref(A,tol):用指定的精度tol代替默认精度。

【实例3.66】 计算魔方矩阵的行阶梯矩阵。

【实例分析】 length(jb)=3是矩阵A的秩。 rqoocvqW5Ym6b5QpyJeuEEoVzUhr2N7ERMed1PcEsqxyH2IOLEq5Q2MR9lCfOltP



第4章

矩阵运算进阶

第3章介绍了MATLAB中矩阵的一些基本运算。在实际应用中,常常需要解决更为专业性的问题,这时就要用到MATLAB中更为复杂的数值计算函数。另外,MATLAB中对零元素占多数的矩阵可以用稀疏矩阵的方式保存以节省内存空间。本章将介绍求解矩阵方程的函数和稀疏矩阵的运算函数。 rqoocvqW5Ym6b5QpyJeuEEoVzUhr2N7ERMed1PcEsqxyH2IOLEq5Q2MR9lCfOltP

点击中间区域
呼出菜单
上一章
目录
下一章
×