矩阵
矩阵的定义
在键盘上直接按行方式输入矩阵是最方便、最常用的创建数值矩阵的方法,尤其适合较小的简单矩阵。在用此方法创建矩阵时,应当注意以下几点。
- 输入矩阵时要以“[]”为其标识符号,矩阵的所有元素必须都在括号内。
- 矩阵同行元素之间由空格(个数不限)或逗号“,”分隔,行与行之间用分号“,”或 Enter键分隔。
- 矩阵大小不需要预先定义。
- 矩阵元素可以是运算表达式。
- 若“[]”中无元素,表示空矩阵。
- 如果不想显示中间结果,可以用“;”结束。
矩阵的生成
矩阵的生成除了直接输入法,还可以利用M文件生成法和文本文件生成法等。
利用M文件创建
- 当矩阵的规模比较大时,直接输入法就显得笨拙,出了差错也不易修改。为了解决这些问题,可以将要输入的矩阵按格式先写入一个文本文件中,并将此文件以m为其扩展名保存,即M文件。
- M文件是一种可以在MATLAB环境下运行的文本文件,它可以分为命令式文件和函数式文件两种。主要用到的是命令式M文件,可以用简单形式创建大型矩阵。在MATLAB 命令行窗口中输入M文件名,所要输入的大型矩阵即可被输入到内存中。
利用文本文件创建
MATLAB中的矩阵还可以由文本文件创建,即在文件夹(通常为work文件夹)中建立txt文件,在命令行窗口中直接调用此文件名即可。
创建特殊矩阵
用户可以直接调用函数来生成某些特定的矩阵,常用的函数如下。
eye(n):创建nxn单位矩阵。
eye(m,n):创建mxn的单位矩阵。
eye(size(A)):创建与A维数相同的单位矩阵。
ones(n):创建nxn全1矩阵。
ones(m,n):创建mxn全1矩阵。
ones(size(A)):创建与A维数相同的全1矩阵。
zeros(m,n):创建mxn全0矩阵。
zeros(size(A)):创建与A维数相同的全0矩阵。
rand(n):在[0,1]区间内创建一个nxn均匀分布的随机矩阵。
rand(m,n):在[0,1]区间内创建一个mxn均匀分布的随机矩阵。
Rrand(size(A)):在[0,1]区间内创建一个与A维数相同的均匀分布的随机矩阵。
compan(P):创建系数向量是P的多项式的伴随矩阵。
diag(v):创建以向量v中的元素为对角的对角阵。
hilb(n):创建nxn的Hilbert矩阵。
magic(n):生成n阶魔方矩阵。
sparse(A):将矩阵A转化为稀疏矩阵形式,即由A的非零元素和下标构成稀疏矩阵S。若A本身为稀疏矩阵,则返回A本身。
矩阵元素的运算
矩阵中的元素与向量中的元素一样,可以进行抽取引用、编辑修改等操作。
矩阵元素的修改
矩阵建立之后,还需要对其元素进行修改。表5-1列出了常用的矩阵元素修改命令。
命令名 | 说 明 |
---|---|
D=[A;B C] | A为原矩阵,B、C中包含要扩充的元素,D为扩充后的矩阵 |
A(m,:)=[] | 删除A的第m行 |
A(:,n)=[] | 删除A的第n列 |
A(m,n)=a;A(m,:)=[a b···];A(:,n)=[ab···] | 对A的第m行第n列的元素赋值;对A的第m行赋值;对A的第n列赋值 |
矩阵的变维
矩阵的变维可以用符号“:”法和reshape(函数法。函数reshape0的调用形式如下。reshape(X,m,n):将已知矩阵X变维成m行n列的矩阵。
矩阵的变向
命令名 | 说 明 |
---|---|
rot90(A) | 将A逆时针方向旋转90° |
rot90(A,k) | 将A逆时针方向旋转90°*k,k可为正整数或负整数 |
fliplr(X) | ,将X左右翻转 |
flipud(X) | 将X上下翻转 |
flipdim(X,dim) | dim=1时对行翻转,dim=2时对列翻转 |
矩阵的抽取
对矩阵元素的抽取主要是指对角元素和上(下)三角阵的抽取。对角矩阵和三角矩阵的抽取命令见表5-3。
命令名 | 说 明 |
---|---|
diag(X,k) | 抽取矩阵X的第k条对角线上的元素向量k为0时抽取主对角线,k为正整数时抽取上方第k条对角线上的元素,k为负整数时抽取下方第k条对角线上的元素 |
diag(X) | 抽取主对角线 |
diag(v,k) | 使得v为所得矩阵第k条对角线上的元素向量 |
diag(v) | 使得v为所得矩阵主对角线上的元素向量,tril(X),提取矩阵X的主下三角部分 |
tril(X,k) | 提取矩阵X的第k条对角线下面的部分(包括第k条对角线) |
triu(X) | 提取矩阵X的主上三角部分 |
triu(X,k) | 提取矩阵X的第k条对角线上面的部分(包括第k条对角线) |
矩阵的数学运算
- 矩阵的基本运算包括加、减、乘、数乘、点乘、乘方、左除、右除、求逆等。其中加、减、乘与线性代数中的定义是一样的,相应的运算符为“+”“-”“*”。
- 矩阵的除法运算是MATLAB所特有的,分为左除和右除,相应运算符为“\”和“/”。一般情况下,线性方程A*X=B的解是X=A\B,而线性方程X*B=A的解是X=A/B。
- 对于上述的四则运算,需要注意的是,矩阵的加、减、乘运算的维数要求与线性代数中的要求一致。
矩阵的加法运算
(1)交换律 A+B=B+A.
(2)结合律 (A+B)+C=A+(B+C)。
矩阵的乘法运算
数乘运算
矩阵满足下面的规律:
λ(μA)=(λμ)A
(x+μ)A=λA+μA
λ(A+B)=λA+λB
其中,λ,μ为数;A,B为矩阵。
乘运算
若3个矩阵有相乘关系,设A=(a)是一个m*s矩阵,B=(by)是一个sxn矩阵,规定A与B的积为一个mxn矩阵C=(cy),则有
Cy=a1b1j+a;2b2j+···+aisbsj
i=1,2,···,m;j=1,2,··.,n
即C=A*B,需要满足以下3种条件。
矩阵A的列数与矩阵B的行数相同。
矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数。
矩阵C的第m行n列元素值等于矩阵A的m行元素与矩阵B的n列元素对应值积的和。
点乘运算
点乘运算是指将两矩阵中相同位置的元素进行相乘运算,将积保存在原位置组成新矩阵。
矩阵的除法运算
计算左除AB时,A的行数要与B的行数一致,计算右除A/B时,A的列数要与B的列数一1.
左除运算
由于矩阵的特殊性,A*B通常不等于B*A,除法也一样。因此除法要区分左右。
线性方程组D*X=B,如果D非奇异,即它的逆矩阵 inv(D)存在,则其解用MATLAB表示为
X=inv(D)*B=D\B
符号“\”称为左除,即分母放在左边。
左除的条件:B的行数等于D的阶数(D的行数和列数相同,简称阶数)。
右除运算
若方程组表示为X*D1=B1,D1非奇异,即它的逆阵inv(D1)存在,则其解为
符号“/”称为右除。
X=B1*inv(D1)=B1/D1
右除的条件:B1的列数等于D1的阶数(D1的行数和列数相同,简称阶数)。
矩阵运算
MATLAB 常用矩阵函数
函数名 | 说 明 | 函数名 | 说 明 |
---|---|---|---|
cond | 矩阵的条件数值 | diag | 对角变换 |
condest | 1-范数矩阵条件数值 | expm | 矩阵的指数运算 |
det | 矩阵的行列式值 | logm | 矩阵的对数运算 |
eig | 矩阵的特征值 | sqrtm | 矩阵的开方运算 |
inv | 矩阵的逆 | cdf2rdf | 复数对角矩阵转换成实数块对角矩阵 |
norm | 矩阵的范数值 | rref | 转换成逐行递减的阶梯矩阵 |
normest | 矩阵的2-范数值 | rsf2csf | 数块对角矩阵转换成复数对角矩阵 |
rank | 矩阵的秩 | rot90 | 矩阵逆时针方向旋转90° |
orth | 矩阵的正交化运算 | fliplr | 左、右翻转矩阵 |
rcond | 矩阵的逆条件数值 | flipud | 上、下翻转矩阵 |
tce | 矩阵的迹 | reshape | 改变矩阵的维数 |
triu | 上三角变换 | funm | 一般的矩阵函数 |
tril | 下三角变换 |
幂函数
A是一个n阶矩阵,k是一个正整数,规定
$A^k$=AA···A(k个)
称为矩阵的幂。其中k,l为正整数。
在MATLAB中,幂运算就是在乘方符号“.^”后面输入幂的次数。
对于单个n阶矩阵A
$A^k$$A^l$=$A^{k+l}$, ($A^k$)^l=$A^{kl}$
对于两个n阶矩阵A与B,有
$(AB)^k$≠$A^k$$B^k$
矩阵的逆
对于n阶方阵A,如果有n阶方阵B满足AB=BA=I,则称矩阵A为可逆的,称方阵B为A的逆矩阵,记为A-1。
逆矩阵的性质:
- 若A可逆,则A-1是唯一的。
- 若A可逆,则A-1也可逆,并且(A-1)-1=A。
- 若n阶方阵A与B都可逆,则AB也可逆,且(AB)-1=B-A-1。
- 若A可逆,则A-1|=|A|-1。
- 把满足|A|≠0的方阵A称为非奇异的,否则就称为奇异的。使用函数invO求解矩阵的逆,调用格式如下:Y=inv(X)
矩阵的条件数
矩阵的条件数在数值分析中是一个重要的概念,在工程计算中也是必不可少的,它用于描述一个矩阵的“病态”程度。
对于非奇异矩阵A,其条件数的定义为cond(A),=A-'I,l|A|l,,其中v=1,2,··,F。
它是一个大于或等于1的实数,当A的条件数相对较大,即cond(A),>>1时,矩阵A是“病态”的,反之是“良态”的。
矩阵的范数
范数是数值分析中的一个概念,它是向量或矩阵大小的一种度量,在工程计算中有着重要的作用。对于向量x∈R^n”,常用的向量范数有以下几种。
矩阵分解
楚列斯基分解
楚列斯基(Cholesky)分解是专门针对对称正定矩阵的分解。设A=(aij)∈R^nxn 是对称正定矩阵,A=RTR称为矩阵A的楚列斯基分解,其中RER"xn是一个具有正的对角元上三角矩阵。
这种分解是唯一存在的。
在MATLAB中,实现这种分解的命令是chol,它的调用格式见下表:
调用格式 | 说 明 |
---|---|
R=chol(A) | 返回楚列斯基分解因子R |
[R,p]=chol(A) | 该命令不产生任何错误信息,若A为正定矩,阵,则p=0,R同上;若X非正定,则p为正,整数,R是有序的上三角阵 |
LU分解
矩阵的LU分解又称矩阵的三角分解,它的目的是将一个矩阵分解成一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。这种分解在解线性方程组、求矩阵的逆等计算中有着重要的作用。
在MATLAB中,实现LU分解的命令是lu,它的调用格式见表:
调用格式 | 说 明 |
---|---|
[L,U]=lu(A) | 对矩阵A进行LU分解,其中L为单位下三角,阵或其变换形式,U为上三角阵 |
[L,U,P]=lu(A) | 对矩阵A进行LU分解,其中L为单位下三角, |
,U为上三角阵,P为置换矩阵,满足LU=PA |
LDMT与LDLT分解
对于n阶方阵A,所谓的LDMT分解就是将A分解为3个矩阵的乘积-LDMT。其中,L、M是单位下三角矩阵,D为对角矩阵。事实上,这种分解是LU分解的一种变形,因此这种分解可以将LU分解稍做修改得到,也可以根据三个矩阵的特殊结构直接计算出来。
QR分解
矩阵A的QR分解也叫正交三角分解,即将矩阵A表示成一个正交矩阵Q与一个上三角矩阵R的乘积形式。这种分解在工程中是应用最广泛的一种矩阵分解。
在MATLAB中,矩阵A的QR分解命令是qr
调用格式 | 说 明 |
---|---|
[Q,R]=qr(A) | 返回正交矩阵Q和上三角阵R,Q和R满足A=QR;若A为mxn矩阵,则Q为mxm矩阵,R为mxn矩阵 |
[Q,R,E]=qr(A) | 求得正交矩阵Q和上三角阵R,E为置换矩阵使得R的对角线元素按绝对值大小降序排列 |
[Q,R]=qr(A,0) | 产生矩阵A的“经济型”分解,即若A为mxn矩阵,且m>n,则返回Q的前n列,R为nxn |
[Q,R,E]=qr(A,0) | 产生矩阵A的“经济型”分解,E为置换矩阵使得R的对角线元素按绝对值大小降序排列,,且A(:,E)=QR |
R=qr(A) | 对稀疏矩阵A进行分解,只产生一个上三角阵R,R为ATA的Cholesky分解因子,即满足,RTR=ATA,R=qr(A,0),对稀疏矩阵A的“经济型”分解 |
[C,R]=qr(A,b) | 此命令用来计算方程组Ax=b的最小二乘解 |
SVD分解
奇异值分解(SVD)是现代数值分析(尤其是数值计算)的最基本和最重要的工具之一,因此在实际工程中有着广泛的应用。
所谓SVD分解,指的是将mxn矩阵A表示为3个矩阵乘积形式USVT,其中,U为mxm酉矩阵;V为nxn酉矩阵;S为对角矩阵,其对角线元素为矩阵A的奇异值且满足s1≥S2≥···≥s,>Sr+1=·=Sn=0,r为矩阵A的秩。在MATLAB中,这种分解是通过svd命令来实现的。
调用格式 | 说 明 |
---|---|
s=svd(A) | 返回矩阵A的奇异值向量s |
[U,S,V]=svd(A) | 返回矩阵A的奇异值分解因子U、S、V |
[U,S,V]=svd(A,0) | 返回mxn矩阵A的“经济型”奇异值分解,若m>n,则只计算出矩阵U的前n列,矩阵S为nxn矩阵,否则同[U,S,V]=svd(A) |
舒尔分解
舒尔(Schur)分解是Schur于1909年提出的矩阵分解,它是一种典型的酉相似变换,这种变换的最大好处是能够保持数值稳定,因此在工程计算中也是重要工具之一。
对于矩阵A∈C^nxn,所谓舒尔分解,是指找一个酉矩阵U∈C^nxn,使得U^H AU=T,其中T为上三角矩阵,称为舒尔矩阵,其对角元素为矩阵A的特征值。在MATLAB中,这种分解是通过schur命令来实现的。
调用格式 | 说 明 |
---|---|
T=schur(A) | 返回舒尔矩阵T,若A有复特征值,则相应的对角元以2x2的块矩阵形式给出 |
T=schur(A,flag) | 若A有复特征值,则 flag='complex';否则 flag='real' |
[U,T]=schur(A,···) | 返回酉矩阵U和舒尔矩阵T |
海森伯格分解
如果矩阵H的第一子对角线下元素都是0,则H(或其转置形式)称为上(下)海森伯格(Hessenberg)矩阵。这种矩阵在零元素所占比例及分布上都接近三角矩阵,虽然它在特征值等性质方面不如三角矩阵那样简单,但在实际应用中,应用相似变换将一个矩阵化为海森伯格矩阵是可行的,而化为三角矩阵则不易实现;而且通过化为海森伯格矩阵来处理矩阵计算问题能够大大节省计算量,因此在工程计算中,海森伯格分解也是常用的工具之一。在MATLAB中,可以通过hess命令来得到这种形式。hess 命令的调用格式见表5-12。
调用格式 | 说 明 |
---|---|
H=hess(A) | 返回矩阵A的海森伯格形式 |
[P,H]=hess(A) | 返回一个海森伯格矩阵H以及一个矩阵P,满足A=PHP'且P'P=I |
[H,T,Q,U]=hess(A,B) | 对于方阵A、B,返回海森伯格矩阵H,上三角矩阵T以及酉矩阵Q、U,使得QAU=H |