MATLAB编程及应用-第5章 多项式与数据分析

第5章 多项式与数据分析

本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

本章将介绍如何使用MATLAB来解决一些基本的数学运算问题,主要包括多项式的相关计算,数据插值,曲线拟合以及数据统计处理等相关的内容。本章的主要内容如下:

  • 多项式
  • 数据插值
  • 曲线拟合
  • 数据统计处理
  • 离散傅立叶变换

5.1 多项式

在MATLAB中,多项式是以行向量的形式存放的,并且约定多项式以降幂的形式出现,如果多项式中缺少某幂次项,则该幂次项的系数为0。例如,多项式p_1(x)=x^3+21x^2+20x可以表示为:p1=[1 21 20 0],其中常数项为0。

本节将全面介绍与多项式有关的各种计算,包括多项式的四则运算、导函数运算、求值、求根以及分部展开。

5.1.1 多项式的四则运算

多项式的加减运算并无特别,可以使用向量的加减运算实现。多项式的乘除运算比较复杂,为此MATLAB提供了专门的运算函数convdeconv
函数conv用于求多项式P1和P2的乘积,它的调用格式如下:

conv(P1,P2)

其中,P1、P2是两个多项式系数向量。
函数deconv用于对多项式P1和P2作除法运算,它的调用格式如下:

[Q,r]=deconv(P1,P2)

其中,Q返回多项式P1除以P2的商式,r返回P1除以P2的余式。返回的Q和r仍是多项式系数向量。

可以将除法运算deconv看作是乘法运算conv的逆运算,即有P1=conv(P2,Q)+r。

下面通过示例介绍多项式的表示和多项式的四则运算。

【例5.1】多项式的表示及其乘法运算
在命令窗口中输入两个多项式的系数向量p1和p2,如下所示:
>> p1=[1 8 0 0 -10]
>> p2=[2 -1 3]
上面两个系数向量表示的多项式并不直观,为了比较直观的查看多项式MATLAB提供了函数poly2str,该函数的功能是以用户比较习惯的方式显示多项式。

例如使用函数poly2str显示系数向量p1和p2所代表的多项式。在命令窗口中输入以下内容:
>> poly2str(p1,'x') %以比较习惯的方式显示多项式
返回p1代表的多项式的形式如下:
ans =
x^4 + 8 x^3 – 10
同样,在命令窗口中输入以下内容:
>> poly2str(p2,'x') %以比较习惯的方式显示多项式
返回p2代表的多项式的形式如下:
ans =
2 x^2 - 1 x + 3

熟悉多项式的表示方法后,接着使用函数conv求多项式p1和p2的乘积。在命令窗口输入以下内容:
>>y= conv(p1,p2)
函数conv计算的结果如下:
y =
2 15 -5 24 -20 10 -30

使用函数poly2str显示多项式p1和p2相乘后生成的新多项式,如下所示:
>> poly2str(y,'x') %以比较习惯的方式显示多项式
ans =
2 x^6 + 15 x^5 - 5 x^4 + 24 x^3 - 20 x^2 + 10 x - 30

【例5.2】多项式的除法运算
在命令窗口中输入多项式系数向量p3和p4,如下所示:
>> p3=[2 6 8 0 5 9 4];
>> p4=[4 8 0 0 0 3 6];
对多项式p3和p4作除法运算,其中多项式p3除以p4的商式保存在Q中,p3除以p4的余式保存在r中。返回的Q和r仍是多项式系数向量。在命令窗口中输入以下内容:
>> [Q,r]=deconv(p3,p4) %多项式的除法运算
返回结果如下:
Q =
0.5000
r =
0 2.0000 8.0000 0 5.0000 7.5000 1.0000

5.1.2 多项式的导函数

MATLAB提供了polyder函数,用于求多项式的导函数。该函数的格式如下:

p=polyder(P) 求多项式P的导函数多项式

p=polyder(P,Q) 求多项式P与多项式Q乘积的导函数多项式

[p,q]=polyder(P,Q) 求多项式P与多项式Q相除的导函数,导函数的分子存入p,分母存入q

其中,参数P和Q是多项式的系数向量,返回结果p和q也是多项式的系数向量。

【例5.3】求多项式的导函数多项式
在命令窗口中输入多项式系数向量p3和p4,如下所示:
>> p3=[2 6 8 0 5 9 4];
>> p4=[4 8 0 0 0 3 6];
①求多项式p3的导函数多项式。在命令窗口中输入以下内容:
>> p=polyder(p3) %多项式p3的导函数多项式
返回系数向量如下:
p =
12 30 32 0 10 9
②求多项式p3与p4乘积的导函数多项式。在命令窗口中输入以下内容:
>> k=polyder(p3,p4) %多项式p3与p4乘积的导函数多项式
返回系数向量如下:
k =
96 440 800 576 160 574 708 460 192 45 114 66
③求多项式p3与p4相除的导函数多项式。在命令窗口中输入以下内容:
>> [g,h]=polyder(p3,p4) %多项式p3与p4相除的导函数多项式
返回系数向量g和h如下:
g =
-8 -64 -64 -80 -270 -240 92 192 15 60 42
h =
16 64 64 0 0 24 96 96 0 0 9 36 36

5.1.3 多项式的求值

MATLAB提供了两种求多项式值的函数:polyval与polyvalm,它们的输入参数均为多项式系数向量P和自变量x,但是两者是有很大区别的,前者是按数组运算规则对多项式求值,而后者是按矩阵运算规则对多项式求值。具体的调用格式如下所示。

Y=polyval(P,x) 若x为一数值,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵中的每个元素求其多项式的值

Y=polyvalm(P,x) 要求x为方阵或数值,它以方阵为自变量求多项式的值

注意:(1)polyvalm函数用来求矩阵多项式的值,其调用格式与polyval相同,但含义不同。例如,设A为方阵,P代表多项式x^3-5x^2+8,那么polyvalm(P,A)的含义是:AAA-5AA+8eye(size(A)),而polyval(P,A)的含义是:A.A.A-5A.A+8*ones(size(A))。
(2)函数polyvalm的参数x必须为方阵或数值,否则计算会提示错误信息,无法计算。

【例5.4】多项式的求值
在命令窗口中输入多项式的系数向量p3和矩阵A,如下所示:

>> p3=[2 6 8 0 5 9 4] %生成多项式系数
>> A=rand(3) %生成随机矩阵
①使用函数polyval按数组运算规则求A中的每个元素对于多项式p3的值。在命令窗口中输入如下内容:
>> Y=polyval(p3,A)
运算结果如下:
Y =
7.2917 15.2885 5.4763
5.8986 7.2672 15.8387
5.9409 11.3612 8.3376
②使用函数polyvalm按矩阵运算规则求以方阵A为自变量的多项式p3的值。在命令窗口中输入如下内容:
>> Y1=polyvalm(p3,A)
运算结果如下:
Y1 =
13.6694 21.1448 16.7431
8.7641 22.5846 21.5403
8.4161 19.5396 22.2629
③如果函数polyval和polyvalm的第二个参数为数值,仍然可以按照数组和矩阵的运算规则计算求多项式在该参数下的结果。在命令窗口中输入如下内容:
>> A=3
分别使用函数polyval和polyvalm计算多项式的值,具体操作及返回结如下:
>> Y=polyval(p3,A)
Y =
3640
>> Y1=polyvalm(p3,A)
Y1 =
3640
④如果函数ployval和ployvalm的第二个参数为一向量,前者按照数组运算规则仍然可以计算求多项式在该参数下的结果,但是后者按矩阵运算规则计算则会提示错误信息。在命令窗口中输入如下内容:
>> p4=[4 8 0 0 0 3 6]
分别使用函数polyval和polyvalm计算多项式的值,具体操作及返回结果如下:
>> Y=polyval(p3,p4) %第二个参数为向量
Y =
16504 754060 4 4 4 3640 150574
>> Y1=polyvalm(p3,p4) %第二个参数必须为方阵或数值
??? Error using ==> polyvalm
Matrix must be square.

5.1.4 多项式求根

n次多项式具有n个根,这些根可能是实根,也可能含有若干对共轭复根。MATLAB提供了roots函数用于求多项式的全部根,该函数的调用格式为:

x=roots(P)

其中,P为多项式的系数向量,返回向量x为多项式的根,即x(1),x(2),…,x(n)分别代表多项式的n个根。

另外,如果已知多项式的全部根,MATLAB还提供了函数poly用来建立该多项式,该函数的调用格式为:

P=poly(x)

其中,x为多项式的根,返回向量P为多项式的系数向量。

对于一个方阵s,可以用函数poly来计算矩阵的特征多项式的系数。特征多项式的根即为特征值,可以用roots函数来计算。

【例5.5】多项式求根操作
>> p5=[1 8 0 0 -10]
在命令窗口中输入以上内容,生成多项式的系数向量。
①用函数roots求系数向量为p5的多项式的根,输入如下内容:
>> x=roots(p5) %使用函数roots求系数向量为p5的多项式的根
返回结果如下:
x =
-8.0194
1.0344
-0.5075 + 0.9736i
-0.5075 - 0.9736i
②可以通过函数poly建立以x为其根的多项式来验证求得根是否正确。具体操作如下,返回的结果显示使用roots求得向量正是多项式的根。
>> P=poly(x) %建立以x为根的多项式
P =
1.0000 8.0000 -0.0000 -0.0000 -10.0000

【例5.6】使用函数poly和roots求方阵的特征多项式及特征值。
>> d=rand(4) %生成4阶的随机阵
①使用函数poly计算方阵的特征多项式,具体操作如下:
>> f=poly(d) %使用函数poly计算方阵的特征多项式
f =
1.0000 -1.1277 -1.2433 -0.1407 0.0255
②使用函数roots计算方阵的特征值,在命令窗口中输入以下内容:
>> roots(f)’ %特征值求取,转置转化为行向量
运算结果如下:
ans =
1.8406 -0.5363 -0.2716 0.0950
使用函数eig计算方阵的特征值,在命令窗口中输入以下内容:
>> eig(d) %计算方阵的特征值
运算结果如下:
ans =
1.8406
0.0950
-0.2716
-0.5363

注意:用上例方法计算特征多项式时,输入量必须为方阵。

5.1.5 部分分式展开

MATLAB提供函数residue可以实现将分式表达式进行多项式的部分分式展开。
对于\frac{B(s)}{A(s)}=\frac{r_1}{s-p_1} +\frac{r_2}{s-p_2}+\cdots+\frac{r_n}{s-p_n}+k(s),函数的调用格式如下:

[r,p,k]=residue(b,a) 

其中,b和a分别是分子和分母多项式系数行向量;返回值r是[r1 r2 …rn]留数行向量,p为[p1 p2 …pn]极点行向量,k为直项行向量。下面通过示例来讲述该函数的使用。

【例5.7】将表达式\frac{100(s+2)}{s(s+1)(s+20)}进行部分分式展开
在命令窗口中输入多项式系数向量p1和p3,如下所示:
>> p1=[1 21 20 0]
>> p3=[100 200]
使用函数residue将多项式展开,p3和p1分别是分子和分母多项式系数行向量。在命令窗口输入:
>> [r,p,k]=residue(p3,p1)
返回值r是留数行向量,p为极点行向量,k为直项行向量。结果如下:
r =
-4.7368
-5.2632
10.0000
p =
-20
-1
0
k =
[]
由此可得表达式的展开结果为: \frac{-4.7368}{s+20} +\frac{-5.2632}{s+1}+\frac{10}{s}

5.1.6 多项式的微分和积分

多项式的微分MATLAB提供了函数polyder来实现,前面介绍多项式的导函数时已经介绍了该函数的具体使用。但是对于多项式的积分运算MATLAB没有提供专门的函数,但可以用[p./length(p):-1:1,k]的方法来完成积分,其中k为常数。下面通过示例讲解如何进行多项式的积分运算。

【例5.11】多项式的微分
>> A=[1 2 3 4 5 5 3 4] %生成多项式系数
使用函数polyder进行多项式微分计算,在命令窗口输入以下内容:
>> B=polyder(A) %微分计算
返回结果如下:
B =
7 12 15 16 15 10 3 c

5.2 数据插值

插值运算是根据数据点的规律,首先找到一个多项式连接这些已知的数据点,然后根据该多项式计算出要得到的与已知数据点相邻的点对应的数值。数据的插值运算在信号和图象处理等领域使用比较广泛。MATLAB提供了专用的函数来处理数据的插值问题,下面将详细的介绍使用这些插值函数的方法。

5.2.1 一维数据插值

一维插值是指对一个自变量的插值,实现一维数据插值的函数是interp1,该函数的调用格式为:

Y1=interp1(X,Y,X1,'method')

interp1函数的功能是根据X,Y的值,计算出在X1处的值,并返回给Y1。其中,X和Y是两个等长的已知向量,分别描述采样点和样本值;X1是一个向量或标量,描述欲插值的点,返回值Y1是与X1等长的插值结果;method是插值函数的类型,允许的取值有“linear”(线性插值)、“nearest”(用最接近的相邻点插值)、“cubic”(三次插值)和“spline”(三次样条插值),linear为默认值。

注意:X1的取值范围不能超出X的给定范围,否则,会给出“NaN”错误。

除此之外,MATLAB还提供了一个专门的用于3次样条插值的函数spline,功能与函数Y1=interp1(X,Y,X1,‘spline’)完全相同,使用方法也类似。该函数的调用格式如下:

Y1=spline(X,Y,X1)

【例5.8】一维数据插值
在命令窗口输入以下内容,生成用于一维插值运算的数据h和k。
>> h=0:0.3:5;
>> k=cos(h); %生成插值运算数据点
下面分别采用不同的插值函数类型进行插值,用户可以通过该示例对比以下插值的计算结果。参数method分别取值‘linear’、‘nearest’、‘cubic’、‘spline’时的具体操作如下,读者可自行比较采用不同插值方法的计算精度:
>> Y1=interp1(h,k,2,'linear') %采用线形函数插值
>> Y1=interp1(h,k,2,'nearest') %采用最近邻插值
>> Y1=interp1(h,k,2,'cubic') %采用三次多项式插值
>> Y1=interp1(h,k,2,'spline') %采用三次样条插值
>> Y1=spline(h,k,2) %三次样条插值

注意:不同的插值函数具有不同的计算特性,适用的场合也不同,用户使用时一定要根据具体的应用选用不同的插值函数。linear最常用,计算的速度也较快,是插值函数的缺省设置;cubic和spline插值效果的平滑性较好,插值的精度比较高,但是计算的速度也相应的减慢;nearst的计算速度最快,但是精度比较低,平滑性较差。

5.2.2 二维数据插值

除前面介绍的一维数据的插值,MATLAB还提供用于解决二维插值问题的函数interp2,该函数的调用格式为:

Z1=interp2(X,Y,Z,X1,Y1,'method')

其中,X和Y是两个向量,分别描述两个参数的采样点,Z是与参数采样点对应的函数值,X1,Y1是两个向量或标量,描述欲插值的点。返回值Z1是根据相应的插值方法得到的插值结果。method的取值与一维插值函数相同。X,Y,Z也可以是矩阵形式。

注意:X1,Y1的取值范围不能超出X,Y的给定范围,否则,会给出“NaN”错误。

【例5.9】二维数据插值
在命令窗口输入以下内容,生成用于二维插值运算的数据如下所示:
>> x=0:2.5:10
>> h=[0:30:60]'
>> T=[95,14,0,0,0;88,48,32,12,6;67,64,54,48,41]
>> xi=[0:10]
>> hi=[0:20:60]'
使用函数interp2进行插值运算,T必须为矩阵形式,即至少是2x2阶以上的矩阵。在命令窗口中输入如下内容:
>> TI=interp2(x,h,T,xi,hi) %使用函数interp2进行插值运算

注意:Z必须为矩阵形式,即至少是2x2阶以上的矩阵。

5.3 曲线拟合

多项式曲线拟合是用一个多项式来逼近一组给定的数据,拟合的准则是最小二乘法,即找出使\rm{min} \sum_{i=1}^n||f(x_i)-y_i||^2f(x).
在MATLAB中,用polyfit函数来求得最小二乘拟合多项式的系数,计算得到多项式后可以用polyval函数计算所给出点的近似值。polyfit函数的调用格式为:

[P,S]=polyfit(X,Y,m)

polyfit函数根据采样点X和采样点函数值Y,返回一个m次多项式P及供polyval使用的结构数组S,S有三个域:S.R给出QR分解后满足Q·R=V的矩阵R,S.df给出相应χ2量的自由度,S.normr给出拟合残数的2—范数。其中X,Y是两个等长的向量,P是一个长度为m+1的向量,P的元素为多项式系数。

【例5.10】曲线拟合
在命令窗口输入以下内容,生成用于曲线拟合的数据如下所示:
>> A=[1 2 3 4 5 5 3 4 8 5 6 8 7 6 9 2 6 8 2 1 2 7 9 3 9 ] %数据点X轴
>> B=[5 3 4 8 5 6 8 7 6 9 2 6 8 2 1 2 7 9 3 9 4 5 6 7 8 ] %数据点Y轴
>> x=1:1:10 %拟合数据点
①根据采样点A和采样点函数值B,产生一个2次多项式P及供polyval使用的结构数组S。在命令窗口输入:
>> [P,S]=polyfit(A,B,2) %产生一个2次多项式P
调用polyfit函数得到二次多项式各项系数如下:
P =
-0.0357 0.4527 4.4691
用ployval函数计算拟合多项式在给定点的函数值。在命令行窗口中输入以下命令:

>> Y=polyval(P,x) %根据多项式系数向量计算对应点x处的拟合函数值
即可计算得到拟合多项式在给定点的函数值。

注意:曲线拟合时正确选择所要拟合的多项式的阶是很重要的,并不是拟合多项式的阶越高精度越好,为了保证拟合的精度,一般拟合多项式的阶不超过5阶。

5.4 数据统计处理

本节介绍数据统计处理方法,包括最大(小)值运算、求和(积)运算、平均值(中值)运算、累加(乘)运算、标准方差、相关系数以及排序运算。

5.4.1 最大值和最小值

MATLAB提供的求数据序列的最大值和最小值的函数分别为max和min,两个函数的调用格式和操作过程类似,可以分别用来求向量或矩阵的最大值和最小值。

(1)求向量的最大值和最小值

求向量的最大值和最小值的函数调用格式见表5.1。

表5.1 求向量最大值、最小值函数

函数名 功能
y=max(X) 返回向量X的最大值存入y,若X中包含复数元素,则按模取最大值
[y,I]=max(X) 返回向量X的最大值存入y,最大值序号存入I,若X中包含复数元素,则按模取最大值
y=min(X) 返回向量X的最小值存入y,如果X中包含复数元素,则按模取最小值
[y,I]=min(X) 返回向量X的最小值存入y,最小值序号存入I,若X中包含复数元素,则按模取最小值

【例5.12】求向量的最大值
>> B=[5 3 4 8 5 6 8 7 6 9 2 6 8 2 1 2 7 9 3 9 4 5 6 7 8 ]
①求向量B的最大值存入y,最大值的序号存入I。在命令窗口中输入:
>> y=max(B) %向量B的最大值存入y
返回的向量B的最大值如下:
y =
9
在命令窗口中输入:
>> [y,I]=max(B) %返回最大值及最大值对应的序号
返回的向量B的最大值和最大值对应的序号如下:
y =
9
I =
10

(2)求矩阵的最大值和最小值
求矩阵的最大值和最小值的函数调用格式见表5.2。

表5.2 求矩阵的最大值、最小值函数

函数名 功能
max(A) 返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值
[Y,U]=max(A) 返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大值的行号
max(A,[],dim) dim取1或2。dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值
min(A) 返回一个行向量,向量的第i个元素是矩阵A的第i列上的最小值
[Y,U]=min(A) 返回行向量Y和U,Y向量记录A的每列的最小值,U向量记录每列最小值的行号
min(A,[],dim) dim取1或2。dim取1时,该函数和min(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最小值

【例5.13】求矩阵的最大值
>> A=rand(7); %创建7阶的随机矩阵
①返回矩阵A每列的最大值及对应行号。在命令窗口中输入:
>> max(A) %求取矩阵每列的最大值
返回的矩阵A每列的最大值如下:
ans =
0.8385 0.9797 0.8939 0.9883 0.5828 0.7833 0.7942
在命令窗口中输入:
>> [Y,U]=max(A) %返回矩阵A每列的最大值及对应行号
返回的矩阵A每列的最大值和最大值对应的序号如下:
Y =
0.8385 0.9797 0.8939 0.9883 0.5828 0.7833 0.7942
U =
1 7 7 7 1 6 3
还可以通过以下方式返回矩阵A每列的最大值,在命令窗口中输入:
>> max(A,[],1) %计算矩阵A每列的最大值
返回的矩阵A每列的最大值如下:
ans =
0.8385 0.9797 0.8939 0.9883 0.5828 0.7833 0.7942
如返回矩阵A每行的最大值,可以输入以下内容:
>> max(A,[],2) %计算矩阵A每行的最大值
②求矩阵最小值的操作与求矩阵最大值的操作完全相同,只需要将max命令换成min命令即可。

(3)两个向量或矩阵对应元素的比较

函数max和min还能对两个同型的向量或矩阵进行比较,函数调用格式见表5.3。

表5.3 最大值、最小值函数

函数名 功能
U=max(A,B) A,B是两个同型的向量或矩阵,结果U是与A,B同型的向量或矩阵,U的每个元素等于A,B对应元素的较大者
U=max(A,n) n是一个标量,结果U是与A同型的向量或矩阵,U的每个元素等于A对应元素和n中的较大者
U=min(A,B) A,B是两个同型的向量或矩阵,结果U是与A,B同型的向量或矩阵,U的每个元素等于A,B对应元素的较小者
U=min(A,n) n是一个标量,结果U是与A同型的向量或矩阵,U的每个元素等于A对应元素和n中的较小者

5.4.3 求和与求积

MATLAB提供的数据序列求和与求积的函数分别是sum和prod,这两个函数的使用方法类似,分别可以用来对向量和矩阵求和与求积。函数调用格式及功能见表5.4。
表5.4 求和与求积函数

函数名 功能
sum(X) 返回向量X各元素的和
sum(A) 返回一个行向量,其第i个元素是矩阵A的第i列的元素和
sum(A,dim) 当dim为1时,该函数等同于sum(A);当dim为2时,返回一个列向量,其第i个元素是矩阵A的第i行的各元素之和
prod(X) 返回向量X各元素的乘积
prod(A) 返回一个行向量,其第i个元素是矩阵A的第i列的元素乘积
prod(A,dim) 当dim为1时,该函数等同于prod(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的各元素乘积

【例5.15】向量和矩阵的求和与求积
在命令窗口输入以下内容,生成向量A和矩阵B如下:
>> A=[1 2 3 4 5 5 3 4 8 5 6]
>> B=rand(4) %生成4阶的随机矩阵
①计算向量A各列元素的和与向量A各列元素的乘积,在命令窗口中输入:
>> sum(A) %返回各列元素的和
计算得到的各列元素的和如下:
ans =
46
在命令窗口中输入:
>> prod(A) %返回各列元素的积
计算得到的各列元素的积如下:
ans =
1728000
②分别返回矩阵B各列元素的和与矩阵B各列元素的乘积,在命令窗口中输入:
>> sum(B) %返回各列元素的和
计算得到的各列元素的和如下:
ans =
2.2741 2.1284 2.6735 2.2420

在命令窗口中输入:
>> prod(B) %返回各列元素的积
计算得到的各列元素的积如下:
ans =
0.0648 0.0057 0.1780 0.0487
③可以采用下列的方式返回矩阵B各列元素的和与矩阵B各列元素的乘积,具体输入内容和计算返回结果如下:
>> sum(B,1) %返回各列元素的和
ans =
2.2741 2.1284 2.6735 2.2420
>> prod(B,1) %返回各列元素的积
ans =
0.0648 0.0057 0.1780 0.0487
④返回矩阵B各行所有元素的和与矩阵B各行所有元素的积,在命令窗口中输入:
>> sum(B,2) %返回各行元素的和
>> prod(B,2) %返回各行元素的积

5.4.4 平均值和中值

MATLAB提供了求数据序列平均值的函数mean与数据序列中值的函数median,函数调用格式及功能见表5.5。
表5.5 求平均值与中值函数

函数名 功能
mean(X) 返回向量X的算术平均值
mean(A) 返回一个行向量,其第i个元素是矩阵A的第i列的算术平均值
mean(A,dim) 当dim为1时,该函数等同于mean(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的算术平均值
median(X) 返回向量X的中值
median(A) 返回一个行向量,其第i个元素是矩阵A的第i列的中值
median(A,dim) 当dim为1时,该函数等同于median(A);当dim为2时,返回一个列向量,其第i个元素是矩阵A的第i行的中值

【例5.16】求向量和矩阵的平均值与中值
在命令窗口输入以下内容,生成向量B和矩阵A如下:
>> B=[5 3 4 8 5 6 8 7 6 9 2 6]
>> A=rand(4) %生成4阶的随机矩阵
①求向量B的算术平均值与矩阵A的算术平均值,在命令窗口中输入:
>> mean(B) %向量B的算术平均值
计算得到的向量B的算术平均值如下:
ans =
5.7500
在命令窗口中输入:
>> mean(A) %矩阵A的算术平均值
计算得到的矩阵A的算术平均值如下:
ans =
0.7891 0.3084 0.2860 0.3083
②求向量B的中值与矩阵A的中值,在命令窗口中输入:
>> median(B) %向量B的中值
计算得到的向量B的中值如下:
ans =
6
在命令窗口中输入:
>> median(A) %矩阵A的中值
计算得到的矩阵A的中值如下:
ans =
0.9053 0.2054 0.2007 0.2355
③可以通过以下方式求矩阵A的算术平均值与中值,具体操作及返回结果如下:
> mean(A,1) %矩阵A每列的算术平均值
ans =
0.7891 0.3084 0.2860 0.3083
>> median(A,1) %矩阵A每列的中值
ans =
0.9053 0.2054 0.2007 0.2355

④求矩阵A的各行的算术平均值与中值,在命令窗口中输入:
>> mean(A,2) %计算得到矩阵A各行的算术平均值
>> median(A,2) %计算得到矩阵A各行的中值

5.4.5 累加和与累乘积

在MATLAB中,使用cumsum和cumprod函数能方便地求得向量和矩阵元素的累加和与累乘积向量,函数调用格式及功能见表5.6。
表5.6 累加和与累加积函数

函数名 功能
cumsum(X) 返回向量X累加和向量
cumsum(A) 返回一个矩阵,其第i列是矩阵A的第i列的累加和向量
cumsum(A,dim) 当dim为1时,该函数等同于cumsum(A);当dim为2时,返回一个矩阵,其第i行是矩阵A的第i行的累加和向量
cumprod(X) 返回向量X累乘积向量
cumprod(A) 返回一个矩阵,其第i列是矩阵A的第i列的累乘积向量
cumprod(A,dim) 当dim为1时,该函数等同于cumprod(A);当dim为2时,返回一个向量,其第i行是矩阵A的第i行的累乘积向量

【例5.17】求向量与矩阵的累加和与累乘积
在命令窗口输入以下内容,生成向量A和矩阵B如下:
>> A=[1 2 3 4 5 5 3 4 8 5 6 8 7 6 ]
>> B=rand(4) %生成四阶的随机阵
①计算向量A的累加和,返回为一向量,在命令窗口输入:
>> cumsum(A) %向量A的累加和
计算得到的向量A的累加和如下:
ans =
1 3 6 10 15 20 23 27 35 40 46 54 61 67
读者可以尝试使用以下命令,计算矩阵的累加和累乘积的结果,在MATLAB命令行窗口中输入:

>> cumsum(B) %计算矩阵B的累加和,返回一个矩阵
>> cumprod(A) %计算向量A的累乘积,返回为一向量
>> cumprod(B) %计算矩阵B累乘积,返回一个矩阵
>> cumsum(B,1) %计算矩阵的累加,按照列相加,返回一行向量
>> cumprod(B,1) %计算矩阵的累乘,按照列相乘,返回一行向量
>> cumsum(B,2) %计算矩阵的累加,按照行相加,返回一列向量
>> cumprod(B,2) %计算矩阵的累加,按照行相加,返回一列向量

5.4.6 标准方差

在MATLAB中,提供了计算数据序列的标准方差的函数std。该函数对于向量X返回一个标准方差;对于矩阵A返回一个行向量,它的各个元素便是矩阵A各列或各行的标准方差。调用格式为:
Y=std(A,flag,dim)
其中,dim可以取1或2。当dim=1时,求各列元素的标准方差;当dim=2时,则求各行元素的标准方差。flag可以取0或1,当flag=0时,置前因子为\frac{1}{n-1};否则置前因子为\frac{1}{n}。缺省flag=0和dim=1。

【例5.18】标准方差计算
在命令窗口输入以下内容,生成向量B和矩阵A如下:
>> B=[5 3 4 8 5 6 8 7 6 9 2 6]
>> A=rand(4)
①求矩阵A的各列元素的标准方差,flag=0。在命令窗口中输入以下内容:
>> Y=std(A,0,1) %矩阵A的各列元素的标准方差
计算得到的矩阵A的各列元素的标准方差如下:
Y =
0.2327 0.2437 0.2315 0.1809
②求矩阵A的各行元素的标准方差,flag=0。在命令窗口中输入以下内容:
>> Y=std(A,0,2) %矩阵A的各行元素的标准方差
计算得到的矩阵A的各行元素的标准方差如下:
Y =
0.0911
0.3302
0.3848
0.0464
③求矩阵A的各列元素的标准方差,flag=1。在命令窗口中输入以下内容:
>> Y=std(A,1,1)
计算得到的矩阵A的各列元素的标准方差如下:
Y =
0.2015 0.2110 0.2004 0.1566
④求矩阵A的各行元素的标准方差,flag=1。在命令窗口中输入以下内容:
>> Y=std(A,1,2)
计算得到的矩阵A的各行元素的标准方差如下:
Y =
0.0789
0.2860
0.3333
0.0402
⑤对数组进行标准方差计算与对矩阵可以计算标准方差类似。下面分别计算数组B在各种情况下的方差的值。具体操作及返回结果如下所示:
>> Y=std(B,0,1)
>> Y=std(B,0,2)
Y =
2.0944
>> Y=std(B,1,1)
>> Y=std(B,1,2)
Y =
2.0052

5.4.7 相关系数

MATLAB提供了corrcoef函数,可以求出数据的相关系数矩阵。调用格式为:

①corrcoef(X)

②corrcoef(X,Y)

corrcoef函数返回从矩阵X形成的一个相关系数矩阵。此相关系数矩阵的大小与矩阵X一样。它把矩阵X的每列作为一个变量,然后求它们的相关系数。其中X,Y是向量,与corrcoef([X,Y])的作用一样。

【例5.19】求解相关系数
在命令窗口中输入以下内容,生成随机矩阵A、向量B和向量C如下:
>> A=rand(4)
>> B=[5 3 4 8 5 6 8 7 6 9 2 6]
>> C=[1 2 3 4 5 5 3 4 8 5 6 8]
①矩阵A形成的一个相关系数矩阵。在命令窗口中输入以下内容:

>> corrcoef(A) % 求解矩阵A形成的一个相关系数矩阵
返回相关系数矩阵如下:
ans =
1.0000 -0.2608 0.5478 -0.7232
-0.2608 1.0000 -0.9397 0.2996
0.5478 -0.9397 1.0000 -0.3984
-0.7232 0.2996 -0.3984 1.0000
②可以求向量B形成的一个相关系数矩阵。在命令窗口中输入以下内容:
>> corrcoef(B) %求取向量B形成的一个相关系数矩阵
返回相关系数矩阵如下:
ans =
1

5.4.8 排序

MATLAB提供了sort函数来实现排序功能,调用格式如下:

sort(X)

[Y,I]=sort(A,dim)

函数返回一个对X中的元素按升序排列的新向量,Y是排序后的矩阵,而I记录Y中的元素在A中位置。其中,dim指明对矩阵A的列还是行进行排序。若dim=1,则按列排;若dim=2,则按行排。

【例5.20】排序
在命令窗口输入以上内容,生成向量A和矩阵B如下:
>> A=[1 2 5 3 4 8 5 6 8 7 6 9 2 6 ]
>> B=rand(4)
①对向量A按升序排列,返回一新向量。在命令窗口中输入以下内容:
>> sort(A) %向量A按升序排列
返回的向量如下:
ans =
1 2 2 3 4 5 5 6 6 6 7 8 8 9
②对矩阵B按列排序,返回排列后的矩阵Y,I记录Y中的元素在B中位置。在命令窗口中输入以下内容:
>> [Y,I]=sort(B,1) %矩阵B按列排序
对矩阵B按列排列后返回的矩阵Y和记录Y中的元素在B中位置的矩阵I如下:

Y =
0.5226 0.1730 0.0118 0.1991
0.7948 0.2523 0.1365 0.2987
0.8801 0.2714 0.7373 0.6614
0.9568 0.9797 0.8757 0.8939
I =
3 1 4 2
1 4 3 3

4 3 2 4
2 2 1 1
③对矩阵B按行排序,返回排列后的矩阵Y,I记录Y中的元素在B中位置。在命令窗口中输入以下内容:
>> [Y,I]=sort(B,2) %对矩阵B按行排序
④与对矩阵B的操作类似,对向量A也可以按列与按行排序,返回排列后的向量Y,I记录Y中的元素在A中位置排序。
对向量A按列排序,返回排列后的向量Y,I记录Y中的元素在A中位置。在命令窗口中输入以下内容:
>> [Y,I]=sort(A,1) %对向量A按列排序
对向量A按行排序,返回排列后的向量Y,I记录Y中的元素在A中位置。在命令窗口中输入以下内容:
>> [Y,I]=sort(A,2) %对向量A按行排序

5.5 本章小结

本章重点介绍了MATLAB提供的基本的数学运算功能,主要包括多项式的相关运算、数据的插值与拟合运算、数据统计处理运算以及傅立叶变换等内容。

多项式部分通过实例重点介绍了多项式运算相关的内容,主要包括多项式的表示方法、多项式的四则运算、多项式的求导运算、多项式的求值与求根运算、多项式的展开以及多项式的积分运算等内容。掌握多项式运算内容是深入学习MATLAB其他内容的基础。

数据插值部分和拟合部分通过实例介绍了MATLAB提供的数据处理时经常使用的数据插值和拟合运算函数,其中插值部分包括一维和二维数据的插值运算。曲线拟合运算时要正确的选择所要拟合的多项式的阶,并不是拟合多项式的阶越高精度越好,一般拟合多项式的阶不超过5阶。

数据统计处理部分通过实例详细介绍一些常用的数据统计处理方法,主要包括数据的最大值与最小值运算、求和与求积运算、平均值与中值运算、累加和与累乘积运算、标准方差、相关系数以及排序等运算。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容