一维数组及其应用
This presentation is the property of its rightful owner.
Sponsored Links
1 / 66

一维数组及其应用 PowerPoint PPT Presentation


  • 124 Views
  • Uploaded on
  • Presentation posted in: General

一维数组及其应用. 一、一维数组简介 二、创建一维数组 三、一维数组的访问和赋值 四、数组运算 五、与一维数组相关的一些常用函数 六、一维数组在二维绘图中的应用 七、一维数组在向量运算中的应用 八、一维数组在一元多项式运算中的应用. n 个元素排成一行,又称为 行向量 ( row vector ) 常被 看作为 1 X n 矩阵(二维数组). 一、一维数组简介. 1 、行数组. n 个元素排成一列,又称为 列向量 (column vector ) ,常看作为 n X1 矩阵(二维数组)   在 Matlab 中提到 向量 ,一般都是指的列向量.

Download Presentation

一维数组及其应用

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


5805040

一维数组及其应用

一、一维数组简介

二、创建一维数组

三、一维数组的访问和赋值

四、数组运算

五、与一维数组相关的一些常用函数

六、一维数组在二维绘图中的应用

七、一维数组在向量运算中的应用

八、一维数组在一元多项式运算中的应用


5805040

n个元素排成一行,又称为行向量(row vector)

常被 看作为 1 X n 矩阵(二维数组)

一、一维数组简介

1、行数组


5805040

n个元素排成一列,又称为列向量(column vector),常看作为 n X1 矩阵(二维数组)

  在Matlab中提到向量,一般都是指的列向量

2、列数组


5805040

3、标量(scalar)

一个数,称为标量,在Matlab中看作为 1 X 1 矩阵(二维数组)

a =

在matlab中,使用a(1)和a(1,1)都可以访问变量a

Matlab中,标量和向量一般用小写字母表示


5805040

二、创建一维数值数组

1、用方括号[ ]创建一维数组

  • 整个数组放在方括号里

  • 行数组元素用空格或逗号分隔

    x = [ 2, pi/2, sqrt(3), 3+5i ]

  • 列数组元素用分号分隔,分号起换行

    y = [ 2; pi; 3/4; j ]

  • 标点符号一定要在英文状态下输入


5805040

2、用[ ]由小数组生成大数组

(1)执行如下赋值语句:

(3)再执行如下赋值语句:

a = [ 1, 3 ]

b = [ 2, 4 ]

c = [ 3; 5 ]

g = [ c; c ]

h = [ g; g ]

(2)然后执行如下赋值语句:

此时:

g = ? h = ?

d = [ a, a ]

f = [ d,b ]

此时:d = ? f = ?


5805040

3、用[ ]生成空数组

x = [ ]

  方括号内无字符,或只包含空格,则生成空数组。此时在matlab内部生成一个double类型的变量x,其内容为空,占用0字节。空数组在进行数组并置操作(二个小数组合并为一个大数组)时,经常用到。

(1)执行如下赋值语句:

(2)然后执行如下赋值语句:

x = [ ]

a = [ 2, 4 ]

b = [ 3,5 ]

x = [ x, a ]

x = [ x, b ]

此时:x = ?


5805040

4、用冒号:创建一维数组

x = a:b

x = a:inc:b

a,b必须为实数,若未提供inc的数值,则inc = 1

a是数组x中的第一个元素,b不一定是数组x的最后一个元素。

  若inc取的不合适,可能会生成空数组。

生成如下数组

x = [a, a+inc, a+2*inc, … ]

x = 1:10 y = 10:-2:-10 z = [ 1:2:99, 2:2:100 ] w = 2:3:-10

x = ? y = ?

z = ? w = ?


5 linspace

5、用linspace()函数创建一维数组

x = linspace(a,b)

a,b可以为复数

x = linspace(a,b,n)

  在a和b之间,均匀生成 n (未提供n时,n=100)个数据,包括a和b在内。

若a,b为实数,等效于:

执行如下赋值语句后,x = ? y = ?

x = linspace(0, 8, 17)

y = linspace(1+i, 4+4*i, 7)


6 logspace

6、用logspace()函数创建一维数组

x = logspace(a,b)

x = logspace(a,b,n)

  先在a和b之间均匀生成n个数据,包括a和b,然后以这n个数据为指数,生成一维数组x。

例:x = logspace(1,2,6)生成的数组为:

x=[101, 101.2, 101.4, 101.6, 101.8, 102 ]

=[10.0000, 15.8489, 25.1189, 39.8107, 63.0957, 100.0000]

x = logspace(a,pi,n)


5805040

三、一维数组的访问和赋值

b = x(end)

end是数组x的最后一个元素的下标

引用数组 x 中的最后一个元素,将其赋值给变量 b

1、引用一维数组中的单个元素

x = 1:5

k = 2

a = x(k)

引用数组 x 中的第 k 个元素,将其赋值给变量 a

Matlab中数组元素的下标从 1 开始

c = x(8)会出现什么结果?


5805040

2、一维数组中单个元素的赋值

x = 1:5

a = 1.5

k = 3

x(k) = 0

将 0 赋值给数组 x 中的第 k 个元素

x(end) = a

将 a 赋值给数组 x 中的最后一个元素

x(8) = 6.5 会出现什么结果?


5805040

3、引用一维数组中的子数组

引用一维数组x中的第2、5、9个元素,将其赋值给变量 a

x = linspace(1,5)

s = [2,5,9]

a = x(s)

x = linspace(1,5)

a = x([2,5,9])

b = x(end:-1:1)

c = x(1:2:end)

d = x(2:2:end)

b = ? c = ? d = ?


5805040

4、一维数组中子数组的赋值

x = linspace(1,5)

s = [1,4]

a = [2,7]

x(s) = a

x = linspace(1,5)

x([1,4]) = [2,7]

将2、7分别赋值给x的第1、4个元素


5805040

5、利用空数组进行赋值可以修改数组的大小

(1)执行如下赋值语句:

x = 10:10:70

x(2) = [ ]

此时:x = ?

(2)再执行如下赋值语句:

x([2,4]) = [ ]

此时:x = ?


5805040

四、数组运算

数组运算是Matlab软件定义的运算规则,其目的是为了数据管理方便、操作简单、指令形式自然和执行计算的有效。

无论在数组上施加什么运算(加减乘除或函数),总认定那种运算对被运算数组中的每个元素(Element)进行运算。


5805040

1、一维数组的转置运算

x.’

x’

对x做转置(行→列,列→行)

对x做共轭转置

若x的元素均为实数,则x.’与x’的结果相同

y = x.’

对数组x做转置运算,将运算结果赋值给变量y,内存中数组x的内容并没有任何变化。

x1 = (1:10).’

y1 = (1:10)’

x2 = linspace(i,10*i).’

y2 = linspace(i,10*i)’


5805040

2、一维数组的数学运算

(1) 两个一维数组之间的数学运算

  • x + y:加,对应位置的数组元素相加

  • x - y:减,对应位置的数组元素相减

  • x.*y:点乘,对应位置的数组元素相乘

  • x./y:右点除,对应位置的数组元素相除

  • x.\y:左点除

  • x.^y:点幂,对应位置的数组元素做幂运算

一维数组x、y 维数相同 时,可以进行如下如下的数组运算:

运算结果为与x、y同维的数组


5805040

(2)一维数组与标量 之间的数学运算

x+c :x的每个元素加c

x-c: x的每个元素减c

x.*c 或 x*c:x的每个元素乘c,

x./c 或 x/c: x的每个元素除以c

x.\c 或 x\c:c除以x的每个元素

x.^c:点幂, x的每个元素做幂运算

c.^x:点幂,c做幂运算

x为一维数组,c为一个数(标量),x和c之间可以进行:

运算结果为与x同维的数组


Matlab matlab

练习:试写出下列matlab语句的输出结果,并在matlab中进行验证。

a = [1,1, 1]

b = [1, 0, 0]

c = [ 0, 0, 0]

d = (a+b).*(a-b)

e = (d + 1) + (d - 1)*i

f = e.’./e’ + e.’.\e’

g = b.^d + d.^b


5805040

3、一维数组的关系运算

(1)两个一维数组之间的关系运算

进行比较的两个数组必须维数相同,比较在两数组相同位置上的元素间进行,返回一个由0和1组成的“逻辑数组” 。


5805040

(2)一维数组和标量之间的关系运算

标量可以与任何维数组进行比较。比较在此标量与数组每个元素之间进行,因此比较结果与被比数组同维,返回一个由0和1组成的“逻辑数组” 。


5805040

(3)关系运算中的注意事项

比较两个数是否相等的关系运算符是“ == ”,单个的等号“ = ” 是变量赋值符号。

不等于的关系运算符是“ ~= ”,不要与 C 语言的不等于符号“ != ” 混淆。

比较两个浮点数是否相等时需要注意,由于浮点数的存储时的误差的存在,在程序设计中要避免直接比较两个浮点数是否相等,而是采用大于、小于的比较运算将待确定值限制在一个满足需要的区间之内。

3<x<7这样的数学表达式必须用逻辑“与”运算才能正确表示。


5805040

4、一维数组的逻辑运算

逻辑运算可以在标量与标量,数组与数组,标量与数组间进行

a = [0, 1, 2, 0, 3], b = [4, 5, 0, 0, 6], c = 7

在逻辑表达式中,作为输入的任何非 0 实数都被看作是“逻辑真”,只有 0 才被认为是“逻辑假”。

  标量(一个数)可以与任何维数组进行逻辑运算。运算在标量与数组每个元素间进行。

  当两个数组进行逻辑运算时,参与运算的数组必须维数相同,运算在两数组相同位置上的元素间进行。


5805040

5、逻辑数组用作 “逻辑索引”

A = 1:10

L = logical([0 1 0 1])

A(L)

逻辑索引:通过逻辑数组 L 中“逻辑1”所在的位置,指出数组 A 中元素的的位置,从而可以对A 数组中的元素(子数组)进行访问或赋值。

L 的元素个数应等于或小于 A 的元素个数,一般情况下,L 应是与 A 同维的逻辑数组


5805040

6、函数作用在数组上的运算规则

Matlab中的很多函数都可以直接以数组作为输入参数,函数会作用在数组的每个元素上。

输入为行数组,则输出也为行数组

输入为列数组,则输出也为列数组


5805040

关系、逻辑运算举例

  在100, 103, 106, 109, ... , 148, 151这些整数中,能被 7 整除的数有哪些?

A = 100:3:151

B = rem(A,7)

L = B==0

r = A(L)

100以内的哪些正整数满足:0.7 < sin(n) < 0.75 ?

n = 1:100

L1 = sin(n)>0.7

L2 = sin(n)<0.75

L = L1&L2

r = n(L)


5805040

五、与一维数组相关的一些常用函数

当函数的输入参数为一维数组x时(x为行或列):


5805040

六、一维数组在二维绘图中的应用

x,y为同维的一维数组,二维绘图函数plot(x,y)的绘图原理:分别以x,y对应位置的元素为横坐标和纵坐标,得到n个数据点,描点,然后依次将第1,2,…,n点连线,绘制出二维图形。


5805040

x = 0:0.1:10*pi

y = sin(2*x).*cos(x/2)

plot(x,y)

数组乘法


5805040

七、一维数组在向量运算中的应用


5805040

1、向量的模(长度)

a = [4,3,1]

d = sqrt(sum(a.*a))

或:

d = sqrt(sum(a.^2))


5805040

2、两点之间的距离

a = [4,3,1]

b = [5,2,3]

AB = sqrt(sum((a - b).^2))


5805040

3、向量的方向角与方向余弦,单位向量

a = [4,3,1]

d = sqrt(sum(a.^2))

e0 = a./d


5805040

4、向量的线性运算

直接利用matlab的数组运算规则即可进行运算

a = [4,3,1]

b = [5,2,3]

c = 1.6

p = a + b

s = a – b

d = c*a


5805040

5、两向量的数量积(内积/点积/点乘)

Matlab中提供了 dot()函数实现两向量的数量积

= dot(a,b)

= sqrt(dot(a,a))


5805040

6、两个向量之间的夹角

tmp = dot(a,b)/sqrt(dot(a,a))/sqrt(dot(b,b))

theta = acos(tmp)


5805040

7、两向量的向量积(叉乘)

Matlab中提供了 cross()函数实现两向量的向量积

= cross(a,b)


5805040

8、向量的混合积:

= dot(cross(a,b),c)


5805040

上机练习:


5805040

3.以A(1,2,3),B(2,0,5),C(4,2,-1)为顶点的三角形的面积。

4.求以A(0,0,2),B(3,0,5),C(1,1,0),D(4,1,2)为顶点的四面体的体积。


5805040

八、一维数组在一元多项式运算中的应用

  借助matlab提供的函数,处理多项式是一件非常简单的事情,很容易对多项式进行积分、微分以及求根的操作。

一元多项式在代数中占有非常重要的地位。在实际应用中如对实验数据的插值、微商和曲线拟合等,都要大量用到多项式;在矩阵分析时,也要用到一元多项式的概念。多项式函数是形式最简单的函数,也是最容易计算的函数,从理论上讲,它可以表示绝大多数复杂函数。在许多计算机的计算和编程中,很多函数值如sin(x),cos(x)等的计算都是先将函数进行Tailor展开为多项式进行逼近计算的,并且都能达到很高的精度。


5805040

在matlab中,一个一元多项式用一个行向量来表示的,向量元素为多项式系数的降幂排列,其中最后一个元素代表多项式中的0幂项。

1、多项式的表示和创建

p = [1,-12,0,25,116]


5805040

2、多项式的符号表示

poly2sym() 把系数向量表示的多项式转为符号表示

poly2sym(p)用默认字符’x’来表示多项式的变量

poly2sym(p,’v’)用字符‘v’来表示多项式的便量

p = [1,-12,0,25,116]

px = poly2sym(p)

pt = poly2sym(p,’t’)


5805040

3、计算多项式的值

p = [1,-12,0,25,116];

x1 = 2.3;

x2 = [-1,3,7];

计算多项式p在x处的值,x可以是标量,或数值数组

y = polyval(p,x)

p1 = polyval(p,x1);

p2 = polyval(p,x2);


5805040

4、求多项式的根

r = roots(p)此函数返回多项式p的根组成的向量

p = [1,-12,0,25,116]

r = roots(p)

  多项式和多项式的根都是用向量表示的,为加以区别,多项式的根表示成列向量。

  对于系数为实数的多项式,如果其根出现复数,则复数必是成对出现的。


5805040

5、由根创建相应的多项式

r = [1;2;-1;3;7]

p = poly(r)

p = poly(r)r是一个向量,构造一个多项式,其根为r

由根构造多项式时,所得到的多项式的第一项为1

由于matlab在进行数据处理时存在截断误差,因此,poly函数的返回值有可能在该出现0的位置出现了一个非常接近0的数,有时还会使某些系数带有一个很小的虚部。因此建议对poly函数的输出结果再进行一次处理,从而消除有可能出现的数据错误。例如,可以通过比较将绝对值极小的数强制置0,或利用real函数将实部从结果中提取出来,取消错误虚部的影响。


5805040

练习


5805040

6、多项式的加法和减法

当两个多项式的阶次不同时,其系数向量的长度也不同,这时需要先将低阶多项式的系数向量前边补上足够的0,以便使它和高阶多项式具有相同的长度,然后再执行加法(减法)运算。

Matlab没有专门的函数执行多项式加法(减法)

如果两个多项式的阶次相同,其系数向量的长度相等,多项式的加法就是将两个多项式向量直接相加(相减)。


5805040

7、多项式的乘法

y1 = [1,2,3,4]

y2 = [1,4,9,16]

y = conv(y1,y2)

y = poly2sym(y)

w = conv(u,v)此函数返回多项式u和v的乘积

多项式的乘法就是多项式系数向量之间的卷积(convolution)

如果要执行多个多项式之间的乘法运算,需要重复使用conv()函数


5805040

练习:利用多项式乘法完成下面的计算

  用matlab的conv()函数求出的是具体的双精度数值数值,不是解析表达式。


5805040

8、多项式的除法

q:存储b/a的商多项式,

r:存储b/a的余数多项式

[q,r] = deconv(b,a )

此函数表示多项式b除以多项式a得到商多项式q和余数多项式r,如果r的元素全部为0,则表示多项式b可以整除多项式a。

余数通常都与除数和被除数中较长的那个向量等长,因此r的前面一般有若干个0


5805040

9、多项式的微分(求导)

polyder( )多项式微分

k = polyder(p)求多项式p的微分多项式

k = polyder(a,b)求a x b的微分

[q,d] = polyder(b,a):求有理分式b/a的微分

q:分子多项式

d:分母多项式


5805040

10、多项式的积分

p = [1,6,20,48,69,72,44]

h = polyder(p)

q = polyint(h,44)

q = polyint(p,k)对多项式p积分,k为积分常数

q = polyint(p)对多项式p积分,积分常数为0


5805040

11、部分分式展开(留数计算)

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


5805040

若已知r,p,k的值, residue()函数还可以求出分子多项式b(x)和分母多项式a(x),调用格式为:

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


5805040

Matlab求解方法:

b=[2,-1]

a=[1,-5,6]

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


5805040

有重根的例子

练习:用residue函数确定A、B、C的值。


5805040

12、多项式拟合

p = polyfit(x,y,n)多项式曲线拟合(最小二乘法)

n=1就是进行线性拟合


5805040

多项式拟合时的注意事项

在进行曲线拟合时对多项式阶次的选择是任意的。

从数学原理上,n+1个数据点可以惟一定义一个n次曲线(或n阶多项式)。

虽然高阶的多项式可以更准确地拟合数据(仅指该曲线与给定的数据之间的均方误差最小),但在进行曲线拟合时,并不需要采用太高阶的多项式,这主要基于以下原因:

1、越是高阶的多项式其数值特性越差,计算起来也越耗时;

2、随着多项式阶次的升高,拟合的曲线变的越来越不平滑,通常会出现用户不愿意看到的局部波形;

3、由于数据本身的近似性,因此在进行数据拟合时没有必要仅仅考虑使拟合的曲线无限接近数据点,而要在曲线的阶次合均方误差之间综合考虑,因为越是高阶的多项式在物理实现时越困难。


  • Login