670 likes | 783 Views
第二章 MATLAB 数值计算. 本章学习目标 ● 掌握生成特殊矩阵的方法。 ● 掌握矩阵分析的方法。 ● 掌握求解线性方程组的各种方法。 ● 了解矩阵的稀疏存储方式。 ● 掌握数据统计和分析的方法。 ● 掌握多项式常用运算。. §2.5 稀疏矩阵的处理.
E N D
第二章 MATLAB数值计算 本章学习目标 ● 掌握生成特殊矩阵的方法。 ● 掌握矩阵分析的方法。 ● 掌握求解线性方程组的各种方法。 ● 了解矩阵的稀疏存储方式。 ● 掌握数据统计和分析的方法。 ● 掌握多项式常用运算。
§2.5 稀疏矩阵的处理 稀疏矩阵中具有大量的零元素,而仅含极少量的非零元素。 2.5.1矩阵存储方式 matlab的矩阵有两种存储方式:完全存储方式和稀疏存储方式。 (1)完全存储方式 矩阵的全部元素按列存储。以前讲到的矩阵的存储方式都是按这个方式存储的,此存储方式对稀疏矩阵也适用。例如,不论是m×n阶普通的还是稀疏的实矩阵均需要m×n个存储单元,而复矩阵还要翻倍。在这种方式下,矩阵中的全部零元素也必须输入。
§2.5 稀疏矩阵的处理 2.稀疏存储方式: 仅存储矩阵所有的非零元素的值及其位置,即行号和列号。在matlab中稀疏存储方式也是按列存储的。例: A=[1 0 0 0;0 5 0 0;2 0 0 7]是具有稀疏特征的矩阵,其完全存储方式是按列存储全部12个元素: 1,0,2,0,5,0,0,0,0,0,0,7 其稀疏存储方式如下: (1,1) 1 (3,1) 2 (2,2) 5 (3,4) 7
§2.5 稀疏矩阵处理 2.5.2 矩阵的稀疏存储方式 1.将完全存储方式转化为稀疏存储方式 函数A=sparse(S)将矩阵S转化为稀疏存储方式的矩阵A。当矩阵S是稀疏存储方式时,函数调用相当A=S。
§2.5 稀疏矩阵的处理 X=[2,0,0,0,0;0,0,0,0,0;0,0,0,5,0;0,1,0,0,-1;0,0,0,0,-5]; A=sparse(X) A= (1,1) 2 (4,2) 1 (3,4) 5 (4,5) -1 (5,5) -5
§2.5 稀疏矩阵的处理 sparse函数还有其他一些调用格式。 ● sparse(m,n):生成一个m × n的所有元素都是0的稀疏矩阵。 ● sparse(u,v,S):u、v、S是3个等长的向量。S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标,该函数建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵。 和稀疏矩阵操作有关的函数。 ● [u,v,S] = find(A):返回矩阵A中非0元素的下标和元素。这里产生的u、v、S可作为sparse(u,v,S)的参数。 ● full(A):返回和稀疏存储矩阵A对应的完全存储方式矩阵。
§2.5 稀疏矩阵的处理 >> A=sparse([1 2 5 7],[1 3 2 3],[1 1 2 4]) A = (1,1) 1 (5,2) 2 (2,3) 1 (7,3) 4 >> B=full(A) B = 1 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0
§2.5 稀疏矩阵的处理 2.产生稀疏存储矩阵 B=spconvert(A) 其中A为一个m×3或m×4的矩阵,其每行表示一个非0元素,m是非0元素的个数,A中每个元素的意义是: (i,1) 第i个非0元素所在的行; (i,2) 第i个非0元素所在的列; (i,3) 第i个非0元素值的实部; (i,4) 第i个非0元素值的虚部,若矩阵的全部元素都是实数,则无须第4列。 该函数将A所描述的一个稀疏矩阵转化为一个稀疏存储矩阵。
§2.5 稀疏矩阵的处理 【例2.16】 根据表示稀疏矩阵的矩阵A,产生一个稀疏存储方式矩阵B。
§2.5 稀疏矩阵的处理 >> A=[2,2,1;3,1,-1;4,3,3;5,3,8;6,6,12]; >> B=spconvert(A) B = (3,1) -1 (2,2) 1 (4,3) 3 (5,3) 8 (6,6) 12
§2.5 稀疏矩阵的处理 3.带状稀疏存储矩阵
§2.5 稀疏矩阵的处理 首先分析一下矩阵X,其特征数据:5×6阶矩阵,有三条对角线,它们的位置与值依次是:第一条在主对角线下方第三条,记d1=-3,该对角线的元素值为0,0,0,41,51;第二条为主对角线,记d2=0,元素值为11,21,31,42,52;第三条位于主对角线上方第三条,记d3=3,元素值为12,22,32,0,0. 将带状对角线之值构成下列矩阵B,将带状的位置构成向量d:
§2.5 稀疏矩阵的处理 然后利用spdiags函数产生一个稀疏存储矩阵。 B=[0,0,0,41,51;11,21,31,42,52;12,22,32,0,0]'; d=[-3,0,3]'; A=spdiags(B,d,5,6) % 产生一个稀疏存储矩阵A A = (1,1) 11 (4,1) 41 (2,2) 21 (5,2) 51 (3,3) 31 (1,4) 12 (4,4) 42 (2,5) 22 (5,5) 52 (3,6) 32
§2.5 稀疏矩阵的处理 A=spdiags(B,d,m,n) 其中,m、n为原带状矩阵的行数与列数。B为r×p阶矩阵,这里r=min(m,n),p为原带状矩阵所有非零对角线的条数,矩阵B的第i列即为原带状矩阵的第i条非零对角线。取值方法是:若非零对角线上元素个数等于r,则取全部元素;若非零对角线上元素个数小于r,则应该用零补足到r个元素。补零的原则:当m<n,应从该对角线的第1行开始补零或向后补零至末行;当m≥n,则应从该对角线的第1列开始补零或向后补零至末列。d为具有p个元素的列向量,它的第i个元素为该带状矩阵的第i条对角线的位置k。k的取法: 若是主对角线,取k=0, 若位于主对角线的下方第s条对角线,取k=−s, 若位于主对角线的上方第s条对角线,则取k=s。
§2.5 稀疏矩阵的处理 4.单位矩阵的稀疏存储 单位矩阵只有对角线元素为1,其他元素都为0,是一种具有稀疏特征的矩阵。函数eye产生一个完全存储方式的单位矩阵。MATLAB还有一个产生稀疏存储方式的单位矩阵的函数,这就是speye。函数speye(m,n)返回一个m × n的稀疏存储单位矩阵。 s = (1,1) 1 (2,2) 1 (3,3) 1
§2.5 稀疏矩阵的处理 2.5.3 稀疏矩阵应用举例 稀疏存储矩阵只是矩阵的存储方式不同,它的运算规则与普通矩阵是一样的。当参与运算的对象不全是稀疏存储矩阵时,所得结果一般是完全存储形式。例如: A=[0,0,3;0,5,0;0,0,9]; B=sparse(A); B*B ans = (2,2) 25 (1,3) 27 (3,3) 81 rand(3)*B ans = 0 1.7643 2.4808 0 4.0658 4.5058 0 0.0493 1.9622
§2.5 稀疏矩阵的处理 【例2.17】求下列三对角线性代数方程组的解。
§2.5 稀疏矩阵的处理 B=[1,1,2,1,0;2,4,6,6,1;0,3,1,4,2]'; %取A对角线上元素构成B d=[-1,0,1]’; %产生带状位置向量 A=spdiags(B,d,5,5); %产生稀疏存储的系数矩阵 b=[0,3,2,1,5]’; %方程右边参数向量 x=(inv(A)*b)’ %求解 x = -0.1667 0.1111 2.7222 -3.6111 8.6111
§2.5 稀疏矩阵的处理 >> A=full(A) A = 2 3 0 0 0 1 4 1 0 0 0 1 6 4 0 0 0 2 6 2 0 0 0 1 1 >> x=(inv(A)*b)' x = -0.1667 0.1111 2.7222 -3.6111 8.6111
§2.6 数据统计处理 2.6.1 最大值和最小值 1.求最大值和最小值 ● max(A):如果A是向量,则返回向量A的最大值。如果A中包含复数元素,则按模取最大值。如果A是矩阵,则返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。 ● [Y,U]=max(A):如果A是向量,则返回向量A的最大值存入Y,最大值的序号存入U。如果A中包含复数元素,则按模取最大值。如果A是矩阵,则Y向量记录A的每列的最大值,U向量记录每列最大值的行号。 ● max(A,[],dim):仅用于矩阵。dim取1或2。dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值。
§2.6 数据统计处理 【例2.18】分别求矩阵 中各列和各行元素中的最大值。 x=[54,86,453,45;90,32,64,54;-23,12,71,18]; [y,l]=max(x) %求矩阵x中各列元素的最大值及其这些元素的行下标 y = 90 86 453 54 l = 2 1 1 2
§2.6 数据统计处理 y=max(x,[ ],2) %命令中dim=2,故查找操作在各行中进行 y = 453 90 71 求矩阵最小值的函数是min,其用法和max完全相同。
§2.6数据统计处理 2.两个向量或矩阵对应元素的比较 函数max和min还能对两个同型的向量或矩阵进行比较。max函数调用格式如下。 ● max(A,B):A、B是两个同型的向量或矩阵,返回值是与A、B同型的向量或矩阵,其中的每个元素等于A、B对应元素的较大者。 ● max(A,n):n是一个标量,返回值是与A同型的向量或矩阵,其中的每个元素等于A对应元素和n中的较大者。
§2.6 数据统计处理 【例2.19】已知 , 求矩阵x、y所有同一位置上的较小元素构成的新矩阵p。 x=[443,45,43;67,34,-43]; y=[65,73,34;61,84,326]; p=min(x,y) p = 65 45 34 61 34 -43
§2.6 数据统计处理 Matlab还允许对一个矩阵和一个常数或单变量操作。例如,仍然用上例的矩阵x和已赋值为45的变量f,操作如下: x=[443,45,43;67,34,-43]; f=45; P=min(x,f) p = 45 45 43 45 34 -43
§2.6 数据统计处理 2.6.2 求和与求积 数据序列求和的函数是sum。sum函数的调用格式如下。 ● sum(A):如果A是一个向量,则返回向量各元素的和。如果A是一个矩阵,则返回一个行向量,其第i个元素是A的第i列的元素和。 ● sum(A,dim):当dim为1时,该函数等同于sum(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的各元素之和。 数据序列求积的函数是prod,其用法和sum完全相同。
§2.6 数据统计处理 【例2.20】已知 ,求矩阵A的每行元素 的乘积和全部元素的乘积。 >> A=[1:4;5:8;9:12]; >> S=prod(A,2) S = 24 1680 11880 >> p=prod(S) p = 479001600
§2.6 数据统计处理 5.1.3 平均值和中值 数据序列的平均值指的是算术平均值。中值是指在数据序列中其值的大小恰好处在中间的元素。例如数据序列2,5,7,9,12的中值为7;如果数据为偶数个,则中值等于中间的两项之平均值。例如,数据序列2,5,6,7,9,12中,处于中间的数是6和7,故其中值为此两数之平均值6.5。
§2.6 数据统计处理 求数据序列平均值的函数是mean,mean函数的调用格式如下。 ● mean(A):如果A是一个向量,则返回向量的算术平均值。如果A是一个矩阵,则返回一个行向量,其第i个元素是A的第i列的算术平均值。 ● mean(A,dim):当dim为1时,该函数等同mean(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的算术平均值。 求数据序列中值的函数是median,其用法和mean完全相同。
§2.6 数据统计处理 【例2.21】分别求向量x=[9 4 7 -8 2]与y=[9 4 7 -8 2 10] 的平均值和中值。 >> x=[9 4 7 -8 2]; >> mean(x) ans = 2.8000 >> median(x) ans = 4
§2.6 数据统计处理 >> y=[9 4 7 -8 2 15]; >> mean(y) ans = 4.8333 >> median(y) ans = 5.5000
§2.6 数据统计处理 5.1.4 累加和与累乘积 所谓累加和或累乘积,是指从数据序列的第1个元素开始直到当前元素进行累加或累乘,作为结果序列的当前元素值。 在MATLAB中,使用cumsum和cumprod函数求得向量和矩阵元素的累加和与累乘积向量。
§2.6 数据统计处理 cumsum函数的调用格式如下。 ● cumsum(A):如果A是一个向量,则返回向量的累加和。如果A是一个矩阵,则返回一个矩阵,其第i列是A的第i列的累加和向量。 ● cumsum(A,dim):当dim为1时,该函数等同于cumsum(A);当dim为2时,返回一个矩阵,其第i行是A的第i行的累加和向量。 求累乘积的函数是cumprod,其用法和cumsum完全相同
§2.6 数据统计处理 【例2.22】求 的值。 >> x=[1,ones(1,10)*2] x = 1 2 2 2 2 2 2 2 2 2 2 >> y=cumprod(x) y = Columns 1 through 7 1 2 4 8 16 32 64 Columns 8 through 11 128 256 512 1024 >> s=sum(y) s = 2047
§2.6 数据统计处理 2.6.5 标准方差与相关系数 1.求标准方差 方差描述了一组数据波动的大小,方差越小,数据波动越小。对于具有n个元素的数据序列 标准方差的计算公式如下: 或 其中
§2.6 统计数据处理 在MATLAB中,提供了计算数据序列的标准方差的函数std。对于向量X,std(X)返回一个标准方差。对于矩阵A,std(A)返回一个行向量,它的各个元素便是矩阵A各列或各行的标准方差。
§2.6 数据统计处理 std函数的一般调用格式为 Y=std(A,flag,dim) 其中flag取0或1,当flag=0时,按σ1所列公式计算标准方差;当flag=1时,按σ2所列公式计算标准方差。dim取1或2,当dim=1时,求各列元素的标准方差;当dim=2时,则求各行元素的标准方差。默认flag=0,dim=1。
§2.6 统计数据处理 例2.23 a=[7,4,9,8,10,7,8,7,8,7;7,6,10,5,9,8,10,9,5,6]'; mean(a) ans = 7.5000 7.5000 std(a) ans = 1.5811 1.9579 两人成绩的平均值相同,但小明的成绩的标准方差较小,说明小明的成绩波动较小,成绩更稳定。
§2.6 统计数据处理 >> a=[7,4,9,8,10,7,8,7,8,7;7,6,10,5,9,8,10,9,5,6] a = 7 4 9 8 10 7 8 7 8 7 7 6 10 5 9 8 10 9 5 6 >> mean(a,2) ans = 7.5000 7.5000 >> std(a,0,2) ans = 1.5811 1.9579
§2.6 统计数据处理 2.相关系数 相关系数用来衡量两组数据之间的线性相关程度。对于两组数据序列 ,可由下式计算出两组数据的相关系数。 相关系数的绝对值越接近1,说明两组数据相关程度越高。
§2.6 统计数据处理 corrcoef函数用于求数据的相关系数矩阵。 ● corrcoef(X,Y):求向量X和Y的相关系数。 ● corrcoef(X):返回从矩阵X形成的一个相关系数矩阵。它把矩阵X的每列作为一个变量,然后求它们的相关系数。
§2.6 统计数据处理 【例2.24】随机抽取15名健康成人,测定血液的凝血酶浓度及凝血时间,数据如下表所示。分析凝血酶浓度与凝血时间之间的相关性。 凝血酶浓度及凝血时间
§2.6 统计数据处理 X=[1.1,1.2,1.0,0.9,1.2,1.1,0.9,0.6,1.0,0.9,1.1,0.9,1.1,1,0.7]'; Y=[14,13,15,15,13,14,16,17,14,16,15,16,14,15,17]'; R=corrcoef(X,Y) R = 1.0000 -0.9265 -0.9265 1.0000
§2.6 统计数据处理 2.6.6 排序 MATLAB提供了对向量X进行排序的函数sort(X),函数返回一个对X中的元素按升序排列的新向量。sort函数也可以对矩阵A的各列或各行重新排序,其调用格式为 [Y,I]=sort(A,dim,mode) 其中Y是排序后的矩阵,而I记录Y中的元素在A中的位置。dim指明对A的列还是行进行排序,若dim=1,则按列排;若dim=2,则按行排。mode指明按升序还是降序排序,'ascend'为升序,'descend'为降序。dim默认取1,mode默认取'ascend'。
§2.6 统计数据处理 【例2.25】 对三维矩阵 做各种排序。 A=[1,-8,5;4,12,6;13,7,-13]; sort(A,2,‘descend’) %对A的每行按降序排序 Ans= 5 1 -8 12 6 4 13 7 -13
§2.6 统计数据处理 [X,I]=sort(A) %对A按列排序,并将每个元素 所在行号送矩阵I X = 1 -8 -13 4 7 5 13 12 6 I = 1 1 3 2 3 1 3 2 2
§2.7 多项式计算 2.7.1 多项式的四则运算 1.多项式的加减运算 在MATLAB中,多项式的加减运算就是其所对应的系数向量的加减运算。如果多项式的次数不同,则应该把低次的多项式系数不足的高次项用0补足,使同式中的各多项式具有相同的次数。例如,计算(x32x2+5x+3)+(6x1),命令如下: a=[1,-2,5,3]; b=[0,0,6,-1]; c=a+b c = 1 -2 11 2
§2.7 多项式计算 2.多项式乘除运算 函数conv(P1,P2)用于求多项式的乘积,其中P1、P2是两个多项式的系数向量。 函数[Q,r]=deconv(P1,P2)用于对多项式作除法运算,其中P1、P2是两个多项式的系数向量,返回值Q是商式的系数向量,r是余式的系数向量。 【例2.26】求 和
§2.7 多项式计算 >> a=[1 8 0 0 -10]; >> b=[2 -1 3]; >> c=conv(a,b) c = 2 15 -5 24 -20 10 -30 >> [p r]=deconv(a,b) p = 0.5000 4.2500 1.3750 r = 0 0 0 -11.3750 -14.1250
§2.7 多项式计算 从上面的运行可知,两个多项式的乘积是一个6次多项式: 多项式A除以多项式B的商式P为 ,余式r为11.375x14.125。 deconv与conv是互逆的。 conv(B,p)+r ans = 1 8 0 0 -10