矩阵及字符串运算.docx
《矩阵及字符串运算.docx》由会员分享,可在线阅读,更多相关《矩阵及字符串运算.docx(34页珍藏版)》请在冰豆网上搜索。
矩阵及字符串运算
三MATLAB矩阵及运算
3.1MATLAB矩阵的生成和修改
3.1.1矩阵的生成
1.直接输入数据
当需要输入的矩阵维数比较小时,可以直接输入数据建立矩阵。
矩阵数据(或矩阵元素)的输入格式如下:
(1)输入矩阵时要以“[]”作为首尾符号,矩阵的数据应放在“[]”内部,此时MATLAB才能将其识别为矩阵;
(2)要逐行输入矩阵的数据,同行数据之间可由空格或“,”分隔,行与行之间可用“;”或回车符分隔;
(3)矩阵数据可为运算表达式;
(4)矩阵大小可不预先定义;
(5)如果不想显示输入的矩阵(作为中间结果),可以在矩阵输入完成后以“;”结束;
(6)无任何元素的空矩阵也合法。
【例3.1】a=[125]和a=[1,2,5]为同一矩阵;
b=[3;2;5]和b=[3
2
5]为同一矩阵。
【例3.2】建立矩阵并显示结果。
>>X=[1,2,3;4,5,6;7,8,3*3]
X=
123
456
789
2.由矩阵编辑器生成
MATLAB提供了一个矩阵编辑器,用户可以用来创建和修改比较大的矩阵。
在使用矩阵编辑器之前,需要预先定义一个变量(任意的),如上例3.1所示的3×3矩阵X。
接下来,按下列步骤进行操作:
(1)选中所定义的变量,打开矩阵编辑器,如图3.1所示;
(2)将文本框size中的数据3by3改变成欲生成矩阵的行数和列数,回车后就能看到窗口中矩阵的维数立刻发生改变;
图3.1
(3)在窗口中矩阵元素的位置上输入或修改数据,回车后自动提示输入下一行矩阵元素的数据,矩阵元素的输入顺序是按列自动进行的;
图3.2
(4)输入完成后,关闭编辑器,变量X就定义保存好了。
3.由函数自动生成
MATLAB提供了一些生成矩阵的函数,用户可以方便地用他们建立自己所需要的矩阵。
(1)向量、行矩阵、列矩阵的自动生成
用“起始值:
增量值:
终止值”的格式自动生成等差数列。
【例3.3】>>x=(1:
1:
10)%表示“起始值:
增量值:
终止值”,
增量为1时可表示成“起始值:
终止值”,即x=(1:
10)或x=1:
10。
x=
12345678910
>>x=1:
1:
10
x=
12345678910
>>I=1:
15
I=
123456789101112131415
用“linspace(起始值:
终止值:
元素数目)”的格式自动生成等差数列;用“logspace(起始值:
终止值:
元素数目)”的格式自动生成对数等分数列。
【例3.4】>>y=linspace(30,50,11)
y=
3032343638404244464850
列矩阵的生成格式如下:
【例3.5】>>x=(1:
1:
10)';
>>y=linspace(90,95,6)'
y=
90
91
92
93
94
95
(2)其它矩阵的自动生成
MATLAB提供了许多特殊矩阵的生成函数,如零矩阵zeros(m,n),全部元素为1的矩阵ones(m,n),单位矩阵eye(n),随机矩阵rand(m,n)和魔方矩阵magic(n)等,利用这些矩阵可以生成所需要的矩阵。
【例3.6】特殊矩阵的生成。
>>a=[]%定义空矩阵,即0×0矩阵。
a=
[]
>>zeros(2,2);%定义全为0的矩阵(22的阵列)。
>>ones(3,3);%定义全为1的矩阵(33的阵列)。
>>rand(2,6)%定义随机矩阵(26的矩阵)。
ans=
0.22590.76040.64050.37980.68080.5678
0.57980.52980.20910.78330.46110.7942
>>rand(2,6)%第二次运行结果。
ans=
0.95010.60680.89130.45650.82140.6154
0.23110.48600.76210.01850.44470.7919
>>magic(4)
ans=
162313
511108
97612
414151
3.1.2矩阵的修改
1.矩阵元素的修改
欲修改矩阵中某个元素的数值,应该先确定该元素的位置,再用赋值语句来实现。
根据矩阵的行列数和元素在矩阵中的存储顺序,可以确定出欲修改元素的位置。
【例3.7】根据元素在矩阵中的存储顺序来确定矩阵元素的位置,再对元素的数值进行修改。
>>a=[12345678];%定义一维1x8阵列,表示了8个元素,每个向量由一个分量构成。
>>x=[12345678;4567891011];%定义2×8矩阵,以分号“;”隔离各列元素,该矩阵表示了每个向量由2个分量构成的8个向量的多维空间
>>x(3)%找出x的第三个元素,即该矩阵的元素(1,2)。
ans=
2
>>x([125])%找出x的第一、二、五个元素,即2×8矩阵中的元
%素(1,1)、(2,1)和(1,3)。
ans=
143
>>x(1:
5)%找出x的前五个元素即第1个到第五个元素。
ans=
14253
>>x(10:
end)%x的第十个元素后的元素,包括第10个元素。
ans=
869710811
>>x(10:
-1:
2)%x的第十个元素和第二个元素的倒排。
括号中用“:
”隔开的3个参数的含义是:
第一个参数表示起始的元素序号,第二个参数表示递增或递减(-)的元素数,第三个参数表示终止元素序号。
ans=
857463524
>>x(find(x>=10))%找出在x大于等于10的元素,也表达为x(x>=10)。
ans=
10
11
>>
>>x(4)=100%给x的第四个元素重新赋值
x=
12345678
410067891011
>>x(3)=[]%删除第三个元素,注意矩阵变成了1×15矩阵。
x=
1410036475869710811
>>x(16)=99%添加一个元素(加入第十六个元素)。
x=
141003647586971081199
在MATLAB的内部数据结构中,每一个矩阵都是一个以纵列为主(Column-oriented)的阵列(Array)因此,对于矩阵元素的存取,我们可用一维或二维的索引(Index)来定址。
【例3.8】根据矩阵行列数来确定矩阵元素的位置,再对元素的数值进行修改。
>>z=rand(2,5)
z=
0.62990.57510.04390.31270.3840
0.37050.45140.02720.01290.6831
>>z(2,3)
ans=
0.0272
>>z(2,3)=0
z=
0.62990.57510.04390.31270.3840
0.37050.451400.01290.6831
2.矩阵行列的修改
A(m,n)表示矩阵第m行第n列的元素,中间有“,”将行和列分开。
若要同时表示更多的矩阵元素,可以采用下列表示方法:
A(I,:
)表示矩阵A第I行全部的元素;
A(:
J)表示矩阵A第J列全部的元素;
A([1,3],[2,4])表示矩阵A第1行、第3行与第2列、第4列交叉处的元素;
A([1:
3],[2:
4])表示矩阵A第1行到第3行与第2列到第4列交叉处的元素,
也可以写成另外两种形式:
A((1:
3),(2:
4))和A(1:
3,2:
4)。
有了矩阵多个元素的表示方法,就可以方便地进行矩阵行和列的修改。
【例3.9】矩阵行列的修改。
>>a=rand(4,5)
a=
0.09280.01580.05760.69270.3533
0.03530.01640.36760.08410.1536
0.61240.19010.63150.45440.6756
0.60850.58690.71760.44180.6992
>>a(2,:
)
ans=
0.03530.01640.36760.08410.1536
>>a([1:
3],[2:
4])=0
a=
0.09280000.3533
0.03530000.1536
0.61240000.6756
0.60850.58690.71760.44180.6992
>>a([1,3],[2,4])=1
a=
0.09281.000001.00000.3533
0.03530000.1536
0.61241.000001.00000.6756
0.60850.58690.71760.44180.6992
>>a(4,:
)=[]%删除一行元素(第4行)。
a=
0.09281.000001.00000.3533
0.03530000.1536
0.61241.000001.00000.6756
>>a(:
6)=[10;20;30]%增加一列元素(第6列)。
a=
0.09281.000001.00000.353310.0000
0.03530000.153620.0000
0.61241.000001.00000.675630.0000
3.子矩阵
可以由一个矩阵抽取生成一个子矩阵,或者由几个子矩阵组合生成一个新矩阵。
【例3.10】矩阵抽取生成子矩阵,子矩阵组合生成新矩阵。
>>a=rand(2,3)
a=
0.89280.25480.2324
0.27310.86560.8049
>>b=ones(2,5)
b=
11111
11111
>>c=magic(5)
c=
17241815
23571416
46132022
101219213
11182529
>>x=[a,b]
x=
0.89280.25480.23241.00001.00001.00001.00001.0000
0.27310.86560.80491.00001.00001.00001.00001.0000
>>d=c(2,2:
4)
d=
5714
>>y=[a;d]
y=
0.89280.25480.2324
0.27310.86560.8049
5.00007.000014.0000
3.2MATLAB矩阵的保存与提取
在数值计算过程中,经常有大量的矩阵需要保存和再次使用时提取,因此有必要把数据保存于文件中。
在MATLAB中可以使用mat文件来保存二进制的数据。
具体步骤如下:
(1)保存矩阵。
如果A,B矩阵都已存在,用save命令保存,具体格式如下:
savemyfilenameAB
注意:
myfilename是用户自定义的文件名,MATLAB系统会自动地加上后缀mat。
系统默认的路径是MATLAB6p5\work。
如果用户想要改变路径,可以在文件名前加上路径。
(2)提取矩阵。
在重新启动MATLAB后,用load命令可以将保存在文件中的矩阵读到MATLAB工作区的内存中来。
loadmyfilename
load命令中不指定变量名,系统仍然将A,B作为矩阵的名称来使用。
对矩阵的保存与提取,用户也可以在工作空间窗口中使用保存与打开两个按钮来操作,在概述中已介绍过。
3.3MATLAB的向量运算
向量就是一维矩阵(行矩阵或列矩阵),并按照矢量运算的规则进行运算。
但应注意,在一些场合,向量仅仅是指一维矩阵或矩阵的某一列。
本节对向量的基本运算作简单介绍。
3.3.1加减及与数加减
【例3.11】向量的加减及与数加减。
>>a=[1,3,5,7,9,11],b=[2,4,6,8,10,12]
a=
1357911
b=
24681012
>>c=a+b
c=
3711151923
>>d=a-1
d=
0246810
3.3.2数乘
【例3.12】向量的数乘。
a,b向量同上例。
>>3*b
ans=
61218243036
3.3.3点积、叉积及混合积
1.点积计算
在高等数学中,向量的点积是指两个向量在其中某一个向量方向上的投影的乘积,在MATLAB中,向量的点积可由函数dot来实现。
dot(a,b)返回向量a和b的数量点积。
a和b必须同维。
当a和b都为列向量时,dot(a,b)同于a'*b;
dot(a,b,dim)返回a和b在维数为dim的点积。
【例3.13】试计算向量a=(1,2,3)和向量b=(3,4,5)的点积。
>>a=[123];
>>b=[345];
>>dot(a,b)
ans=
26
还可以用另一种方法计算向量的点积。
>>sum(a.*b)
ans=
26
或a*(b’)
2.叉积计算
在数学上,向量的叉积表示过两相交向量的交点、垂直于两向量所在平面的向量。
在MATLAB中,向量的叉积由函数cross来实现。
c=cross(a,b)返回向量a和b的叉积向量c=a×b。
a和b必须为三维向量。
c=cross(a,b,dim)当a和b为n维数组时,则返回a和b的dim维向量的叉积。
a和b必须有相同的维数,且size(a,dim)和size(b,dim)必须为3。
(略)
【例3.14】计算垂直于向量a=(5,2,3)和b=(3,4,5)的向量。
>>a=[523];b=[345];
>>c=cross(a,b)
c=
-2-1614
3.混合积计算
在MATLAB中,向量的混合积由以上两个函数实现。
【例3.15】计算上例中向量a,b,c的混合积。
>>dot(a,cross(b,c))
ans=
456
注意函数的顺序不可颠倒,否则将会出现错误。
3.4MATLAB的矩阵运算
矩阵运算是MATLAB语言最重要和最具有特色的内容之一,是编程进行科学计算的重要基础。
矩阵的运算包括矩阵的基本数学运算和矩阵的函数运算。
3.4.1矩阵的基本运算
矩阵的基本数学运算包括矩阵的算术运算、与常数的运算、转置运算、逆运算、行列式运算、幂运算等。
1.算术运算
矩阵的算术运算是指矩阵之间的加、减、乘、除、幂等运算,表3.1给出了矩阵算术运算对应的运算符和MATLAB表达式。
表3.1经典的算术运算符
经典的算术运算符
名称
运算符
MATLAB表达式
加
+
a+b
减
-
a-b
乘
*
a*b
除
/或\
a/b或a\b
幂
^
a^n
矩阵进行加减运算时,相加减的矩阵必须是同阶的;矩阵进行乘法运算时,相乘的矩阵要有相邻公共维,即若A为i×j阶,则B必须为j×k阶,此时A和B才可以相乘。
常数与矩阵的运算,是常数同矩阵的各元素之间进行运算,如数加是指矩阵的每个元素都加上此常数,数乘是指矩阵的每个元素都与此常数相乘。
需要注意的是,当进行数除时,常数通常只能做除数。
在线性代数中,矩阵没有除法运算,只有逆矩阵。
矩阵除法运算是MATLAB从逆矩阵的概念引申而来,主要用于解线性方程组。
方程A*X=B,设X为未知矩阵,在等式两边同时左乘inv(A),即
inv(A)*A*X=inv(A)*B
X=inv(A)*B=A\B
把A的逆矩阵左乘以B,MATLAB就记为A\,称之为“左除”。
A、B两矩阵的行数必须相等。
如果方程的未知数矩阵在左,系数矩阵在右,即X*A=B,同样有
X=B*inv(A)=B/A
把A的逆矩阵右乘以B,MATLAB就记为/A,称之为“右除”。
A、B两矩阵的列数必须相等。
【例3.16】已知A*X=B,Y*C=D,A=[1,2;3,4],B=[4;10],C=[1,3;2,4],D=[4,10],计算未知数矩阵X和Y。
>>a=[1,2;3,4];b=[4;10];c=[1,3;2,4];d=[4,10];
>>x=a\b
x=
2.0000
1.0000
>>y=d/c
y=
2.00001.0000
在MATLAB中,进行矩阵的幂运算时,矩阵可以作为底数,指数是标量,矩阵必须是方阵;矩阵也可以作为指数,底数是标量,矩阵也必须是方阵;但矩阵和指数不能同时为矩阵,否则将显示错误信息。
【例3.17】矩阵的幂运算。
>>a
a=
12
34
>>a^2%n为正整数,a^n表示矩阵a自乘n次。
ans=
710
1522
>>a^(-2)%n为负整数,a^n表示矩阵a自乘n次的逆。
ans=
5.5000-2.5000
-3.75001.7500
>>inv(a^2)
ans=
5.5000-2.5000
-3.75001.7500
>>2^a(略)
ans=
10.482714.1519
21.227831.7106
>>2.^a
ans=
24
816
2.转置运算
在MATLAB中,矩阵转置运算的表达式和线性代数一样,即对于矩阵A,其转置矩阵的MATLAB表达式为A'。
但应该注意,在MATLAB中,有几种类似于转置运算的矩阵元素变换运算是线性代数中没有的,他们是:
fliplr(X)将X左右翻转;
flipud(X)将X上下翻转;
rot90(A)将A逆时针方向旋转90。
3.逆矩阵运算
矩阵的逆运算是矩阵运算中很重要的一种运算。
它在线性代数及计算方法中都有很多的论述,而在MATLAB中,众多的复杂理论只变成了一个简单的命令inv。
【例3.18】矩阵的逆运算。
>>a
a=
10212
3424
98346
>>inv(a)
ans=
-0.01160.0372-0.0015
0.0176-0.10470.0345
0.0901-0.0135-0.0045
4.行列式和秩运算
矩阵的行列式的值由det函数计算得出;矩阵的秩由rank函数来计算。
【例3.19】计算矩阵行列式的值和矩阵的秩。
>>A=
115
225
335
>>rank(A)
ans=
2
>>det(A)
ans=
0
3.4.2矩阵的函数运算(略)
矩阵的函数运算包括基本的数学函数运算、矩阵专门的函数运算以及矩阵的分解运算等内容。
1.数学函数运算(略)
在MATLAB中,指数函数expm、对数函数logm、开方函数sqrtm是把矩阵作为一个整体进行运算的,即所谓的矩阵运算;其它数学函数都是对矩阵的元素分别进行运算的,即所谓的阵列运算。
因此,MATLAB基本函数库中的大部分常用函数都适合于阵列运算,此时矩阵可以是任意阶。
【例3.20】>>e=eye
(2);
>>logm(e)
ans=
00
00
>>e=ones
(2);
>>expm(e)
ans=
4.19453.1945
3.19454.1945
>>sqrtm(e)
ans=
0.70710.7071
0.70710.7071
>>a=[0,pi/6,pi/3,pi/2];b=[-1,0,1];
>>sin(a)
ans=
00.50000.86601.0000
>>exp(b)
ans=
0.36791.00002.7183
>>sign(a)
ans=
0111
>>mean(b)
ans=
0
在实际运算中,对其他常用函数的矩阵运算,如三角函数运算和双曲函数运算等,可以采用通用函数形式。
在MATLAB中使用通用函数的格式为funm(A,'funname'),其中A为输入矩阵变量,funname为调用的函数名。
如funm(b,'log')等同于1ogm(b),funm(b,'sqrt')等同于sqrtm(b),而funm(b,'sin'),其作用等同于矩阵b的正弦运算。
【例3.21】>>e=ones
(2);
>>funm(e,'sin')
ans=
0.45460.4546
0.45460.4546
>>sin(e)
ans=
0.84150.8415
0.84150.8415
2.矩阵函数运算(略)
矩阵函数的运算主要包括特征值的计算,奇异值的计算,条件数、各类范数、矩阵迹的计算和矩阵的空间运算等。
这里只介绍部分常用的矩阵函数。
表3.2常用的矩阵函数命令
函数名称
功能简介
cond(A)
矩阵A的条件数
det(A)
方阵A的行列式值
dot(A,B)
矩阵A,B的点积
eig(A)
方阵A的特征值和特征向量
norm(A,1)
矩阵A的1-范数
norm(A)或norm(A,2)
矩阵A的2-范数
norm(A,inf)
矩阵A的无穷大-范数
norm(A,'fro')
矩阵A的F-范数
rank(A)
矩阵A的秩
rcond(A)
矩阵A的倒条件数
svd(A)
矩阵A的奇异值分解
trace(A)
矩阵A的迹
expm(A)
矩阵的指数eA
expml(A)
用Pade法求矩阵的指数eA
expm2(A)
用Taylor级数求矩阵的指数eA,精度差,对任何矩阵都适用
expm3(A)
用特征值和特征向量求矩阵的指数eA,仅当独立特征向量个数等于矩阵秩时适用
logm(A)
求矩阵A的对数
sqrtm(A)
求矩阵的平方根
funm(A,'fun')
一般的方阵函数
(1)求矩阵的维数和长度的函数(了解)
【例3.22】>>a=[10,2,12;34,2,4;98,34,6];
>>size(a)%求矩阵的维数(columns&rows)。
ans=
33
>>length(a)%