第二章 MATLAB的数值运算.docx
《第二章 MATLAB的数值运算.docx》由会员分享,可在线阅读,更多相关《第二章 MATLAB的数值运算.docx(24页珍藏版)》请在冰豆网上搜索。
第二章MATLAB的数值运算
第二章MATLAB的数值运算
本章教学目标
了解MATLAB语言的内存管理
掌握MATLAB变量的命名规则
理解MATLAB数组运算和矩阵运算的区别
掌握MATLAB矩阵的建立及基本操作
掌握MATLAB矩阵的基本运算
掌握MATLAB数组的基本运算
掌握字符串的基本操作
2.1变量与数据操作
在MATLAB的运算中,经常要使用标量、向量、矩阵和数组,这几个名称的定义如下:
标量:
是指1×1的矩阵,即为只含一个数的矩阵。
向量:
是指1×n或n×1的矩阵,即只有一行或者一列的矩阵。
矩阵:
是一个矩形的数组,即二维数组,其中向量和标量都是矩阵的特例,0×0矩阵为空矩阵([])。
数组:
是指n维的数组,为矩阵的延伸,其中矩阵和向量都是数组的特例。
2.1.1变量与赋值
1.变量命名
和其他计算机语言一样,MATLAB也有自己的变量命名规则。
MATLAB中变量的命名规则如下:
A.变量名必须是不含空格的单个单词;
B.变量名区分大小写;
C.变量名最多不超过63个字符;
D.变量名必须以字母打头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号。
注意:
只要是赋过值的变量,不管是否在屏幕上显示过,都存储在工作空间中,以后可随时显示或调用。
变量名尽可能不要重复,否则会覆盖。
2.特殊变量
除了上面的命名规则外,MATLAB中还包括一些特殊的变量。
在使用时,应尽量避免对这些变量重新赋值。
特殊变量
取值
ans
运算结果的默认变量名
pi
圆周率π
eps
计算机的最小数
flops
浮点运算数
inf
无穷大,如1/0
NaN或nan
非数,如0/0、∞/∞、0×∞
i或j
i=j=
nargin
函数的输入变量数目
nargout
函数的输出变量数目
realmin
最小的可用正实数
realmax
最大的可用正实数
3.赋值语句
(1)变量=表达式
(2)表达式
其中表达式是用运算符将有关运算量连接起来的式子,其结果是一个矩阵。
例2-1计算表达式的值,并显示计算结果。
在MATLAB命令窗口输入命令:
x=1+2i;
y=3-sqrt(17);
z=(cos(abs(x+y))-sin(78*pi/180))/(x+abs(y))
其中pi和i都是MATLAB预先定义的变量,分别代表代表圆周率π和虚数单位。
输出结果是:
z=
-0.3488+0.3286i
2.1.2内存变量的管理
MATLAB工作空间窗口专门用于内存变量的管理。
在工作空间窗口中可以显示所有内存变量的属性。
当选中某些变量后,再单击Delete按钮,就能删除这些变量。
当选中某些变量后,再单击Open按钮,将进入变量编辑器。
通过变量编辑器可以直接观察变量中的具体元素,也可修改变量中的具体元素。
clear命令用于删除MATLAB工作空间中的变量。
who和whos这两个命令用于显示在MATLAB工作空间中已经驻留的变量名清单。
who命令只显示出驻留变量的名称,whos在给出变量名的同时,还给出它们的大小、所占字节数及数据类型等信息。
2.1.3MATLAB常用数学函数
MATLAB提供了许多数学函数,函数的自变量规定为矩阵变量,运算法则是将函数逐项作用于矩阵的元素上,因而运算的结果是一个与自变量同维数的矩阵。
函数名
含义
函数名
含义
abs
绝对值或者复数模
rat
有理数近似
sqrt
平方根
mod
模除求余
real
实部
round
4舍5入到整数
imag
虚部
fix
向最接近0取整
conj
复数共轭
floor
向最接近-∞取整
sin
正弦
ceil
向最接近+∞取整
cos
余弦
sign
符号函数
tan
正切
rem
求余数留数
asin
反正弦
exp
自然指数
acos
反余弦
log
自然对数
atan
反正切
log10
以10为底的对数
atan2
第四象限反正切
pow2
2的幂
sinh
双曲正弦
cosh
双曲余弦
tanh
双曲正切
函数使用说明:
(1)三角函数以弧度为单位计算。
(2)abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值。
(3)用于取整的函数有fix、floor、ceil、round,要注意它们的区别。
fix:
向最接近零的数取整floor向左取整ceil向右取整round向最接近的取整
>>x=6.5;
>>fix(x)
ans=
6
>>floor(6.5)
ans=
6
>>ceil(6.5)
ans=
7
>>round(6.5)
ans=
7
2.2MATLAB矩阵和数组
2.2.1矩阵的创建与保存
在MATLAB中,一个矩阵可以是数学意义上的矩阵,也可以是标量或者向量。
对于一个标量可以将之作为1×1矩阵,而向量则可以是1×n或者n×1矩阵。
另外一个0×0矩阵在MATLAB中被认为是空矩阵。
矩阵的创建可以通过一下几种形式创建
以直接形式列出元素形式输入
通过语句和函数产生
从外部文件导入
建立在M文件中
1)直接输入法
对于较小的矩阵,最简单的方法是从键盘直接输入矩阵的元素。
具体方法如下:
将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。
但必须遵循一下规则
矩阵每行的元素都必须用空格或者逗号分开;
在矩阵中,采用分号或者回车表明一行的结束;
整个矩阵必须包含在方括号中;
矩阵中的元素可以是数字或者表达式,但是表达式中不可以包含未知的变量
例2-2简单矩阵
的输入步骤。
(1)在键盘上输入下列内容
A=[1,2,3;4,5,6;7,8,9]
(2)按【Enter】键,指令被执行。
(3)在指令执行后,MATLAB指令窗中将显示以下结果:
A=
123
456
789
或
输入>>A=[1,2,3
4,5,6
7,8,9]
也可以得到上面的结果
例2-3用任意表达式做元素的矩阵
>>A=[-83+4*5exp(0)
(2+3)/31+12/2]
A=
-8.000023.00001.0000
1.66672.00001.0000
2)由函数创建和修改矩阵
MATLAB提供了大量的函数用于创建一些常用的特殊矩阵。
常用的产生通用特殊矩阵的函数有:
zeros:
产生全0矩阵(零矩阵)。
ones:
产生全1矩阵(幺矩阵)。
eye:
产生单位矩阵。
rand:
产生0~1间均匀分布的随机矩阵。
randn:
产生均值为0,方差为1的标准正态分布随机矩阵。
例2-4分别建立3×3、3×2和与矩阵A同样大小的零矩阵。
(1)建立一个3×3零矩阵。
zeros(3)
>>zeros(3)
ans=
000
000
000
(2)建立一个3×2零矩阵。
zeros(3,2)
>>zeros(3,2)
ans=
00
00
00
(3)设A为2×3矩阵,则可以用zeros(size(A))建立一个与矩阵A同样大小零矩阵。
A=[123;456];%产生一个2×3阶矩阵A
zeros(size(A))%产生一个与矩阵A同样大小的零矩阵
>>A=[123;456];zeros(size(A))
ans=
000
000
>>
例2-4建立随机矩阵:
(1)在区间[20,50]内均匀分布的5阶随机矩阵。
(2)均值为0.6、方差为0.1的5阶正态分布随机矩阵。
命令如下:
x=20+(50-20)*rand(5)
y=0.6+sqrt(0.1)*randn(5)
>>x=20+(50-20)*rand(5)
x=
26.083020.458232.559545.143635.0844
25.961742.403645.386620.589241.2841
38.113833.352935.754640.438332.8668
28.165647.954426.079431.384429.1385
25.964433.979840.164144.953925.6896
>>y=0.6+sqrt(0.1)*randn(5)
y=
0.87130.47350.81140.09270.7672
0.99660.81820.97660.68140.6694
0.09600.85790.21970.26590.3085
0.14430.82510.59371.0475-0.0864
0.78061.00800.55040.34540.5813
3).从外部数据文件调入矩阵
在MATLAB中,还可以从外部文件读入数据生成矩阵。
这些文件可以是存储MATLAB已经生成的二进制文件,还可以是包含数值数据的文本文件。
在文本文件中,数据必须排成一个矩形表,数据之间用空格分隔。
文件的每行仅包含矩阵的每一行,并且每行的元素个数必须相等。
采用该方法可以创建和保存的矩阵的大小是没有限制的,还可以将其他的程序生成的矩阵直接调到MATLAB中进行处理
163213
510118
96812
415141
然后用下述命令将magik.dat中的内容调入工作空间生成变量magik
>>loadmagik.dat
>>magik
magik=
163213
510118
96812
415141。
4).利用M文件中的函数生成矩阵
对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。
M文件是一种包含MATLAB代码的文本文件,这种文件的扩展名是“.m”。
它包含的内容就是在MATLAB命令行键入矩阵生成的命令。
下面通过一个简单例子来说明如何利用M文件创建矩阵。
例2-5利用M文件建立MYMAT矩阵。
(1)启动有关编辑程序或MATLAB文本编辑器(可以通过输入edit),并输入待建矩阵:
(2)把输入的内容以纯文本方式存盘(设文件名为mymatrix.m)。
(3)在MATLAB命令窗口中输入mymatrix,即运行该M文件,就会自动建立一个名为MYMAT的矩阵,可供以后使用。
2.2.2数组、向量的建立与保存
数组也是MATLAB运算的一个重要的数据组织形式。
按其维数,可以分为一维数组、二维数组和多维数组。
下面我们主要介绍这几种一维、二维数组的建立及其标志。
1.一维、二维数组的建立
在MATLAB中数组可以看成是行向量,即只有一列的矩阵。
前面介绍的所有矩阵的建立方法对于一、二维数组同样适用,这里不再过多介绍。
例由原有数组建立新数组
>>A=1:
4;
>>B=1:
2:
7;
>>C=[B,A]
C=
13571234
>>D=[A(1:
2:
4)4.24]
D=
1.00003.00004.00000.20004.0000
2.二维数组元素的标志
1)全下标标志
经典数学教科书所引述具体矩阵元素是,采用“全下标”标志法,即,指出是“第几行第几列”的元素。
这种标志方法的优点是:
几何概念清楚,引述简单。
它在MATLAB的访问和赋值中最为常用。
对于二维数组而言,全下标标志由两个下标组成:
行下标,列下标。
2)“单下标”标志
顾名思义,“单下标(LinearIndex)”标志就是“引用一个下标来指明元素在数组中的位置”。
要想这么做,首先要对二维数组的所有元素进行一维编号。
所谓“一维编号”就是:
先设想把二维数组的所有列,按先左后右的次序,首尾相接排成“一维长列“,然后,自上而下对元素位置进行编号。
“单下标”和“全下标”的转换关系:
以m×n的二维数组为例,若“全下标”元素位置是“第r行第c列”,那么相应的“单下标”为l=(c-1)×m+r。
MATLAB有两个指令能实现标志方法间的转换,如下所示
sub2ind:
根据全下标换算出单下标。
ind2sub:
根据单下标换算出全下标。
3.建立向量
1).利用冒号生成向量
冒号表达式可以产生一个行向量,一般格式是:
e1:
e2:
e3
其中e1为初始值,e2为步长,e3为终止值。
当e2省略时缺省值为1
x1=2:
5
x1=
2345
x2=2:
0.5:
4
x2=
2.00002.50003.00003.50004.0000
2).利用MATLAB指令建立向量
linspace用来生成线性等分向量,
linspace(a,b,n)
说明:
a、b、n三个参数分别表示开始值、结束值和元素个数。
生成从a到b之间线性分布的n个元素的行向量,n如果省略则默认值为100。
logspace用来生成对数等分向量,它和linspace一样直接给出元素的个数而得出各个元素的值。
logspace(a,b,n)
说明:
a、b、n三个参数分别表示开始值、结束值和数据个数,n如果省略则默认值为50。
x1=linspace(0,2*pi,5)%从0到2*pi等分成5个点
x1=
01.57083.14164.71246.2832
x2=logspace(0,2,3)%从1到100对数等分成3个点
x2=
110100
4.建立大矩阵
大矩阵可由方括号中的小矩阵或向量建立起来。
2.2.3矩阵的基本操作
1.矩阵元素
通过下标引用矩阵的元素,例如
A(3,2)=200
采用矩阵元素的序号来引用矩阵元素。
矩阵元素的序号就是相应元素在内存中的排列顺序。
在MATLAB中,矩阵元素按列存储,先第一列,再第二列,依次类推。
例如
A=[1,2,3;4,5,6];
A(3)
ans=
2
显然,序号(Index)与下标(Subscript)是一一对应的,以m×n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。
其相互转换关系也可利用sub2ind和ind2sub函数求得。
(说明所谓的序号就是说当前元素在所有矩阵元素中的位置)
2.矩阵拆分
(1)利用冒号表达式获得子矩阵
①A(:
j)表示取A矩阵的第j列全部元素;A(i,:
)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。
②A(i:
i+m,:
)表示取A矩阵第i~i+m行的全部元素;A(:
k:
k+m)表示取A矩阵第k~k+m列的全部元素,A(i:
i+m,k:
k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。
此外,还可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。
end表示某一维的末尾元素下标。
(2)利用空矩阵删除矩阵的元素
在MATLAB中,定义[]为空矩阵。
给变量X赋空矩阵的语句为X=[]。
注意,X=[]与clearX不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。
2.2.4特殊矩阵
1.通用的特殊矩阵
此外,常用的函数还有reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m×n的二维矩阵。
2.3MATLAB运算
2.3.1算术运算
MATLAB有两类不同的算术运算指令:
矩阵算术运算和数组算术运算。
矩阵运算按照线性代数运算法则定义的;数组运算操作按元素逐个执行的。
1.矩阵运算
在MATLAB的系统中提供了一些矩阵运算符。
+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)
(1)矩阵加减运算
假定有两个矩阵A和B,则可以由A+B和A-B实现矩阵的加减运算。
运算规则是:
若A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B矩阵的相应元素相加减。
如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。
(2)矩阵乘法
假定有两个矩阵A和B,若A为m×n矩阵,B为n×p矩阵,则C=A*B为m×p矩阵。
(3)矩阵除法
在MATLAB中,有两种矩阵除法运算:
\和/,分别表示左除和右除。
如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。
A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。
对于含有标量的运算,两种除法运算的结果相同,如3/4和4\3有相同的值,都等于0.75。
又如,设a=[10.5,25],则a/5=5\a=[2.10005.0000]。
对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。
对于矩阵运算,一般A\B≠B/A。
(4)矩阵的幂运算
一个矩阵的幂运算运算可以表示成A^x,要求A为方阵,x为标量。
2.数组运算
(1)数组对标量的加、减、乘、除运算就是对数组的每个元素分别施加运算。
例标量和数组的运算实例
>>Y=[35789];
>>Y-2
ans=
13567
(2)数组-数组运算
数组之间的数学运算不像标量和数组之间运算那样简单。
很明显,不同大小或者维数不同的数组之间的运算难以定义而且值是不确定的。
但是在MATLAB中,当两个数组具有相同的维数时,加减乘除运算是元素对元素的方式进行的。
数组的加法、减法和矩阵的运算符是相同的都是“+”和“-”。
但是数组的乘除运算和矩阵是完全不同的,运算符为(.*)和点除(./)。
注意:
运算符的点号不能少,否则将不按数组的运算规则进行。
例数组和数组的运算
>>a=[134;456];
>>b=[234;567];
>>a+b
ans=
368
91113
例数组的乘法、除法
>>a.*b
ans=
2916
203042
>>a./b
ans=
0.50001.00001.0000
0.80000.83330.8571
>>a.\b
ans=
2.00001.00001.0000
1.25001.20001.1667
从上面的例子可以看出数组的左除和右除得出的结果是不一样的。
我们将数组的除法运算规则总结如下:
A数组之间的除法运算为参与运算的数组对应元素相除,结果数组与参与运算的数组大小相同。
B数组与标量的运算为数组的每个元素与标量相除,结果数组与参与运算的数组大小相同。
C数组的除法运算符号有两个,即左除号“./”和右除号“.\”。
它们的关系如下:
a./b=b.\a
(3)数组的幂运算
在MATLAB中数组的幂运算和矩阵的幂运算完全不同。
数组的幂运算符号为“.^”,用来表示数组元素对元素的幂运算。
注意点号不要省略。
例
>>a.^3
ans=
12764
64125216
数组运算
矩阵运算
命令
含义
命令
含义
A+B
对应元素相加
A+B
与数组运算相同
A-B
对应元素相减
A-B
与数组运算相同
S.*B
标量S分别与B元素的积
S*B
与数组运算相同
A.*B
数组对应元素相乘
A*B
内维相同矩阵的乘积
S./B
S分别被B的元素左除
S\B
B矩阵分别左除S
A./B
A的元素被B的对应元素除
A/B
矩阵A右除B即A的逆阵与B相乘
B.\A
结果一定与上行相同
B\A
A左除B(一般与上行不同)
A.^S
A的每个元素自乘S次
A^S
A矩阵为方阵时,自乘S次
A.^S
S为小数时,对A各元素分别求非整数幂,得出矩阵
A^S
S为小数时,方阵A的非整数乘方
3.向量运算
向量的运算主要包括向量的点积、叉积运算。
(1)向量的点积运算
在高等数学中,向量的点积是指两个向量在其中某一向量方向上的投影的乘积,它通常用来定义向量的长度。
在MATLAB中,向量的点积由函数“dot”来实现,“dot”函数的调用格式如下:
C=dot(A,B)表示返回向量A和向量B的点积,结果放在向量C中。
需要说明的是,向量A与B必须长度相同。
另外,当A与B都是列向量时,dot(A,B)等同于A’*B
例
>>A=[24531];
>>B=[38101213];
>>C=dot(A,B)
C=
137
(2)向量的叉积运算
在高等数学中,向量的叉积返回与两向量组成的平面垂直的向量。
在MATLAB中,向量的叉积由函数“cross”实现。
cross的调用格式如下:
C=cross(A,B)表示返回向量A与B的叉积,即C=A×B。
需要说明的是,向量A与B向量必须是3个元素的向量。
>>A=[245];
>>B=[3810];
>>C=cross(A,B)
C=
0-54
2.3.2关系运算
MATLAB提供了6种关系运算符:
<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。
它们的含义不难理解,但要注意其书写方法与数学中的不等式符号不尽相同。
关系运算符的运算法则为:
(1)当两个比较量是标量时,直接比较两数的大小。
若关系成立,关系表达式结果为1,否则为0。
(2)当参与比较的量是两个维数相同的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。
最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
(3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。
最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
例2-8产生5阶随机方阵A,其元素为[10,90]区间的随机整数,然后判断A的元素是否能被3整除。
(1)生成5阶随机方阵A。
A=fix((90-10+1)*rand(5)+10)
(2)判断A的元素是否可以被3整除。
P=rem(A,3)==0
其中,rem(A,3)是矩阵A的每个元素除以3的余数矩阵。
此时,0被扩展为与A同维数的零矩阵,P是进行等于(==)比较的结果矩阵。
2.3.3逻辑运算
MATLAB提供了3种逻辑运算符:
&(与)、|(或)和~(非)。
逻辑运算的运算法则为:
(1)在逻辑运算中,确认非零元素为真,用1表示,零元素为假,用0表示。
(2)设参与逻辑运算的是两个标量a和b,那么,a&ba,b全为非零时,运算结果为1,否则为0。
a|ba,b中只要有一个非零,运算结果为1。
~a当a是零时,运算结果为1;当a非零时,运算结果为0。
(3)若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。
最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成。
(4)若参与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。
最终运算结果是一个与矩阵同维