矩阵运算.docx
《矩阵运算.docx》由会员分享,可在线阅读,更多相关《矩阵运算.docx(18页珍藏版)》请在冰豆网上搜索。
矩阵运算
第3章矩阵运算
MATLAB中的大多数运算可以直接对矩阵应用。
除了在第2.4节中讨论的算术运算+、-、
*、^、/、\外,还有用于转置和共轭的运算符、有理数运算符和逻辑运算符。
MATLAB学生版的用户应该知道矩阵中的元素总数极限是16384。
此外,矩阵有算术函数和逻辑函数,有些函数仅能在二维矩阵中使用。
3.1加法和减法
如果矩阵A和B具有相同的维数,那么就可以定义两个矩阵的和A+B和两个矩阵的差A-B。
矩阵A±B,即元素aij…p±bij…p。
在MATLAB中,一个m×n矩阵A和一个标量,即一个1×1矩阵s之间也能进行加和减运算。
矩阵A+s得到与A相同的维数,元素为aij+s。
■例3.1
假设A和B定义如下:
A=
B=
MATLAB命令
Add=A+B,Sub=A-B,Add100=A+100
得到结果:
Add=Sub=Add100=
68-4-4101102
1012-4-4103104
3.2乘法
如果矩阵A的列数等于矩阵B的行数,那么矩阵相乘,即C=AB,就被定义为二维矩阵。
如果
不是这种情况,MATLAB就返回一个错误信息。
只有一个例外就是这两个矩阵之一是1×1,如一
个标量,那么MATLAB是可以接受的。
在MATLAB中,乘法的运算符是*,因此,命令是C=A*B。
元素cij是A的第i行和B的第j列的点积。
点积的定义可参见命令集23和附录B。
矩阵C有与
A相同的行数和与B相同的列数。
■对于方阵,也定义了积BA,但其结果通常与AB不同。
■例3.2
(a)假设A和B如同例3.1,命令
A,B,MultAB=A*B,MultBA=B*A
在屏幕上显示如下的结果:
A=B=MultAB=MultAB=
125619222334
347843503146
(b)令x和y为:
X=(123)y=
命令s=x*y,M=y*x,结果为:
S=M=
321123
102030
100200300
MATLAB也包含其他乘积。
命令dot(x,y)得到具有相同元素数量的两个向量x和y的点
积,也称为标量积或内积。
如果点积为零,则两个向量是正交的。
如果A和B具有相同的维数,则定义两个矩阵A和B的点积,在MATLAB中定义列方式。
其结果是一个行向量,其元素是第1列、第2列等的点积,可参见附录B。
命令集23点积
dot(x,y)得到向量x和y的点积
dot(A,B)得到一个长度为n的行向量,这里的元素是A和B对应列的点积。
矩
阵A和B必须是具有相同的维数m×n。
多维矩阵可参见helpdesk。
dot(A,B,dim)在dim数组中给出A和B的点积。
38MATLAB5手册下载
■对于各具三个元素的两个向量x和y,命令cross(x,y)给出向量积或叉积,即:
X×y=(x2y3-x3y2x3y1-x1y3x1y2-x2y1)
对向量x和y,向量x×y是正交的。
cross命令也可以应用于3×n矩阵,其结果是一个3×n矩阵,这里的第i列是A和B中的第i列的叉积。
命令集24叉积
cross(x,y)得到向量x和y的叉积。
cross(A,B)得到一个3×n矩阵,其中的列是A和B对应列的叉积。
矩
阵A和B必须具有相同的维数3×n。
cross(A,B,dim)在dim数组中给出向量A和B的叉积。
A和B必须具有相同
的维数,size(A,dim)和size(B,dim)必须是3。
■例3.3
假设:
x=(100)y=(010)
命令crossprod=cross(x,y),得到:
crossprod=
001
对x和y,它是正交的,即:
scalar1=dot(x,crossprod),scalar2=dot(y,crossprod)
得:
Scalar1=scalar2=
10
在MATLAB中,有一个完成二维矩阵卷积的函数。
可以使用FIR滤波器(有限脉冲响应)作为一个自变量,这部分内容在helpdesk中描述。
命令集25矩阵的卷积
conv2(A,B)返回矩阵A和B的二维卷积
conv2(hcol,hrow,A)矩阵A与向量hcol列方式和向量hrow行方式的卷积。
conv2(…,format)得到一个卷积的特殊形式。
参数format必须是下列
字符串之一:
‘same’返回最接近中心的部分卷积,其维数与A相同。
‘valid’仅返回不考虑边缘补零计算的部分卷积。
convn(A,B)返回矩阵A和B的多维卷积。
convn(…,format)得到卷积的一个特殊形式,如上所示。
第3章矩阵运算39下载
■Kronecker张量积可以用于创建大的矩阵,它由命令kron(A,B)得到。
如果A是一个m×n矩阵,B是一个k×r矩阵,那么这个命令就返回一个m·k×r·n的矩阵。
命令集26张量积
kron(A,B)得到A和B的Kronecker张量积。
■例3.4
假设:
A=
B=
命令K=kron(A,B)的结果为:
K=
246000
202000
-1-2-3123
-10-1101
3.3除法
在MATLAB中,有两个矩阵除法的符号,左除\和右除/。
如果A是一个非奇异方阵,那么A\B和B/A对应A的逆与B的左乘和右乘,即分别等价于命令inv(A)*B和B*inv(A)。
可是,MATLAB执行它们时是不同的,如例3.5所示。
A的逆,inv(A)或A-1在第7.1节中介绍。
如果A是一个方阵,那么X=A\B是矩阵方程AX=B的解A-1B,这里的X具有与B相同的维数。
在B=b是一个列向量这样一个特殊情况下,x=A\b是线性系统AX=b的解。
参见第7.2节。
如果A是一个m>n的m×n矩阵,X=A\B得到矩阵方程AX=B的最小二乘解,参见第7.7节。
矩阵方程XA=B的解是X=B/A,它等同于(A′\B′)′,即右除可以由左除定义。
这里,撇号′表示转置,这将在第3.4节中进行说明。
■例3.5
(a)设A和B如例3.1一样定义,命令
A,B,Right=B/A,Left=A\B得到:
A=B=Right=Left=
1256-12-3-4
3478-2345
下载
■如果输入Right=B*inv(A)和Left=inv(A)*B,则得到
Right=Left=
-1.00002.0000-3.0000-4.0000
-2.00003.00004.00005.0000
这分别与用/和\计算的矩阵结果是一致的,但浮点格式表明它们的计算过程是不一样的。
(b)设下列A和b:
A=
b=
系统Ax=b的解在MATLAB中写作x=A\b,得到:
X=1.00002.00003.0000
(c)使用如上的A和b,检查求解系统Ax=b的运算次数。
命令flops(0);x=inv(A)*b;flops给出结果:
ans=
109
命令flops(0);X=A\b;flops给出结果:
ans=
72
因此,在MATLAB中求解一个系统用左除比用逆和乘法所需的运算次数要少。
命令
flops的定义参见第2.5节。
3.4转置和共轭
一个重要的运算是转置和共轭转置,它在MATLAB中用撇´表示。
在课本中,这种运算经
常用*和H表示
如果A是一个实数,那么它被转置时,第1行变成第1列,第2行变成第2列,依此类推,一个m×n矩阵变为一个n×m矩阵。
如果矩阵是方阵,那么这个矩阵在主对角线反映出来。
如果矩阵A的元素aij是复数,那么所有元素也是共轭的。
矩阵A´在项(i,j)上含有。
如果仅希望转置,在撇号之前输入一点.´,A.´表示转置,其结果与conj(A´)相同。
如果A是实数,那么A´与A.´相同。
■例3.6
假设A和b与例3.5(b)相同。
Transp=A´,Transpb=b´,得到:
Transp=Transpb=
110221713
325
541
aji
第3章矩阵运算41下载
■3.5元素操作算术运算
算术运算也可以元素与元素逐次进行。
矩阵的维数要相同,可以是多维的。
如果运算是
由一点进行的,那么这个运算实行的是元素方式。
对于加法和减法,数组运算和矩阵运算没有差别。
数组运算符是:
+-.*./.\.^
注意,.并没有列出,这个点在那种情况下具有不同的含义。
这个操作符仅给出转置,
与¢相反,¢给出了共轭转置,详见第3.4节。
■例3.7
假设定义如下矩阵:
A=
B=
C=
(a)A.*B得:
ans=74-10
(b)B./A得:
ans=71-10
(c)B.^2得:
ans=49410
(d)A.^B得:
ans=14-10
(e)基数是标量,而指数是一个矩阵,2.^[1234]得:
ans=
24816
(e)C.´得:
ans=1.0000+2.0000i3.0000+1.0000i
5.0000-2.0000i1.0000+3.0000i
42MATLAB5手册
下载
■可参见例13.1,它也使用了数组运算。
3.6元素操作函数
在MATLAB中预定义的数学标准函数(见第2.4节)是基于矩阵对元素的运算。
如果f是这样一个函数,A是带元素aij的一个矩阵,那么f(A)ij=f(aij)。
如果元素是复数,那么根据这个函数产生的矩阵也可以是复数,矩阵的维数没有改变。
■例3.8
令A、B和C为:
A=
B=
C=
(a)abs(A)得:
ans=035146
(b)cos(B)得:
ans=-1.00001.00000.00000.7071
(c)sin(abs(C))得:
ans=0.98780.000000.7867
数组运算符和数组函数在MATLAB中十分有用,用户可以定义自己的数组函数,并把它
们存放在M文件中,可参见第2.9节。
■例3.9
函数sincos(x)=sin(x)cos(x)是一个非标准MATLAB函数,可是,你可以定义自己的函数sincos并存放在文件sincos.m中。
functiony=sincos(x)
y=sin(x).*cos(x);
可如下调用sincos:
Y1=sincos(pi),y2=sincos([0pi/4pi/2])
Y1=-1.2246e-16
Y2=00.50000.0000
第3章矩阵运算43下载
■看到,应该为0值的y1是一个十分小的数。
事实上,eps是较大的。
如果用一个向量作为一个自变量来调用sincos,因为sin和cos返回向量,所以其结果是一个向量。
当绘制函数图形时,这是十分有用的。
M文件的应用可参见第12章和第13章。
3.7矩阵的乘方与函数
对于二维方阵,A的p次乘方可以用A^p实现。
如果p是一个正整数,那么这个幂可以由许多矩阵乘法运算定义。
对于p=0,得到与A维数相同的同一个矩阵;当p<0时,如果A-1存在,可定义A^p,它是与inv(A)^(-p)相同。
象exp(A)和sqrt(A)那样的MATLAB表达式可视为数组运算(参见第3.6节),即它们是对A中元素逐个运算。
MATLAB也能处理方阵函数。
例如
(A的平方根)或
。
举例如下:
=I+A+
+
+…
命令集27矩阵函数
expm(A)使用Pade近似法计算eA,这是一个内部函数。
expm1(A)使用一个M文件和与内部函数相同的算法计算eA。
expm2(A)使用泰勒级数计算eA。
expm3(A)使用特征值和特征向量计算eA。
logm(A)计算A的对数。
sqrtm(A)计算A1/2。
当A是对称正定阵时,平方根是唯一的。
funm(A,fcn)计算由字符串fcn指定的A的矩阵函数,参见第5.1.4节。
字符串fcn可以是任意的基本函数,如sin、cos等等,参见第2.4节。
例如,expm(A)=funm(A,‘exp’)。
[F,E]=funm(A,fcn)计算如上矩阵函数,但返回结果矩阵F和剩余近似值矩阵E。
polyvalm(p,A)估算矩阵A的一个多项式。
向量p含有多项式的系数。
详
见第10.1节。
很重要的一点是要区别expm和exp、logm和log等等。
■例3.10
假设:
A=
比较exp和expm:
Elementwise=exp(A),Operatorwise=expm(A)
得:
Elementwise=2.71831.00001.00007.3891
Operatorwise=2.7183007.3891
44MATLAB5手册
下载
■3.8关系运算符
MATLAB有用于比较矩阵的六个关系运算符,也可以对矩阵与一个标量进行比较,即矩
阵中的每个元素与标量进行比较。
关系运算符如下:
<小于
<=小于等于
>大于
>=大于等于
==等于
~=不等于
关系运算符比较对应的元素,产生一个仅包含1和0的具有相同维数的矩阵。
其元素是:
1比较结果是真
0比较结果是假
在一个表达式中,算术运算符优先级最高,其次是关系运算符,最低级别是逻辑运算符。
圆括号可以改变其顺序。
■例3.11
(a)对预定义变量pi的值和通过命令rat获得的pi的近似值进行比较。
[t,n]=rat(pi),piapprox=t/n;
formatlong,piapprox,pi,piapprox==pi
得:
t=355n=113piapprox=3.14159292035398ans=3.14159265358979ans=0
(b)假设:
A=
B=
A中的元素有大于B中对应的元素吗?
第3章矩阵运算45下载
■Greater=A>B
得:
Creater=001000010
即A中的项(1,3)和(3,2)的值大于B中对应项的值。
(c)令A如例(b)中假设,A中的元素有大于1的吗?
GreaterThanOne=A>1
得:
GreaterThanOne=011000110
3.9逻辑运算符
在MATLAB中有四种逻辑运算符:
&与
|或
~非
xor异或
逻辑运算符的运算优先级最低。
在一个表达式中,关系运算符和算术运算符的运算级别
要高于逻辑运算符。
xor和or之间的差别在于:
表达式中至少有一个是真,那么or是真;xor是表达式中有一个是真但不能两者均为真时才为真。
运算符&和|比较两个相同维数的矩阵,如同前一节一样,它也能使一个标量与一个矩阵
进行比较。
逻辑运算符是按元素比较的。
零元素表示逻辑值假,任何其他值的元素表示逻辑
值真。
其结果是一个包含1和0的矩阵。
命令集28逻辑运算符
A&B返回一个与A和B相同维数的矩阵。
在这个矩阵中,A和B对应元素
都为非零时,则对应项为1;有一个为零的项则为0。
A|B返回一个与A和B相同维数的矩阵。
在这个矩阵中,A和B对应元素
只要有一个为非零,则对应项为1;两个矩阵均为零时,则为0。
˜A返回一个与A和B相同维数的矩阵。
在这个矩阵中,A是零时,则对
应项为1;A是非零时,则对应项为0。
xor(A,B)返回一个与A和B相同维数的矩阵。
在这个矩阵中,如果A和B均为
零或均为非零时,则对应项为0;如果A或B是非零但不是两者同时
为非零时,则对应项为1。
46MATLAB5手册
下载
■3.10逻辑函数
在MATLAB中有几个逻辑函数。
在以下定义的函数中,假设A是一个m×n的矩阵,x是一个向量。
在一些计算中,很重要的一点是要在给定的矩阵中以一定的特征定位。
例如,在部分选主
元的高斯消去法中,必须在工作列中寻找最大的项。
MATLAB命令find可以用于这种情况。
命令集29查找非零元素
find(x)返回一个x中包含非零元素的下标的向量。
如果所有的元素
都是零,那么返回一个空矩阵,即[]。
find(A)返回一个长的列向量,表示A中包含非零元素的下标向量。
下述命令更可取。
[u,v]=find(A)返回向量u和v,它们包含A中的非零元素的下标,即A中元
素(uk,vk)为非零。
[u,v,b]=find(A)返回包含A中非零元素的下标向量u和v以及一个包含对应非
零元素的向量。
A中元素(uk,vk)为非零并且能在bk中找到。
■例3.12
假设x和A是:
X=(3-406.10)A=
y=
(a)ind=find(x),indcol=find(A)得:
ind=124
indcl=14
即向量x中元素1、2和4是非零值。
要获得indcol,也可以输入:
find(y)
(b)命令find可以与关系运算符一起使用,这样使命令更有用。
例如,index=find(x>0.5)返回:
index=
14
如果输入greaterThan=x(index),得到:
greaterThan=
3.00006.1000
这就是用向量index寻找x中所有大于0.5的元素。
如果仅想知道x中有多少大于0.5的元素时,可以输入:
length(find(x>0.5))。
针对上题数据,得到:
ans=2
第3章矩阵运算47下载
(c)要获得A中所有非零元素的索引,输入:
[index1,index2]=find(A)
得:
Index1=12index=12
即元素(1,1)和(2,2)是非零值。
MATLAB有any和all两个函数,用于测试矩阵和向量的逻辑条件。
其结果是逻辑值,0
或1,真或假。
它们在if语句中有特殊的用途,详见第12.1节。
命令集30逻辑函数
(一)
any(x)如果x中的有一个元素为非零值,那么返回1;否则,返回0。
any(A)对A进行列运算,根据相应列是否包含非零元素,返回一个带1和0的行向量。
all(x)如果所有的元素都是非零值,返回1;否则,返回0。
all(A)对A进行列操作,根据相应列是否所有元素都为非零值,返回带1和0的一个行向量。
如果这两个函数之一对一个矩阵进行两次操作,例如any(any(A))和all(all(A))则
返回一个标量1或0。
■例3.13
(a)如果all(x<=5)返回1,则实向量x中所有的元素都小于或等于5。
如果返回0,则至
少有一个元素大于5。
如果all(all(A<=5))返回1,则一个矩阵A的所有元素小于或等于5。
(b)对一个实方阵A,如果all(all(A==A′))返回1,则A是对称的。
(c)如果any(any(tril(A,-1)))返回0,则方阵A是上三角阵。
否则,在A中的下三
角阵中至少有一个非零元素。
一个等价的命令是all(all(A==triu(A))),如果A是上三角阵,它就返回1。
也有下列逻辑函数:
命令集31逻辑函数
(二)
isnan(A)返回一个维数与A相同的矩阵,在这个矩阵中,对应A中有
‘NaN’处为1,其他地方为0。
48MATLAB5手册下载
■isinf(A)返回一个维数与A相同的矩阵,在这个矩阵中,对应A中有‘inf’处为1,其他地方为0。
isempty(A)如果A是一个空矩阵,返回1;否则返回0。
isequal(A,B)如果A和B是相同的,即有相同的维数和相同的内容,则返回1。
isreal(A)如果A是一个不带虚部的实矩阵,则返回1;否则,返回零。
isfinite(A)返回一个与A维数相同的矩阵。
在这个矩阵中,A中元素是
有限的,则对应元素为1;否则,为零。
也有针对字符串和其他数据类型的逻辑函数,详见第5章。
第3章矩阵运算49下载