数值数组及向量化运算

  • 格式:doc
  • 大小:383.50 KB
  • 文档页数:30

第三章 数值数组及向量化运算

数值数组(Numeric Array)和数组运算(Array Operations)始终是MATLAB的核心内容。本书从第3章起,全部注意力将集中于数值数组及其运算。

本章系统阐述:数组浮点算法的特点;一、二维数值数组的创建和寻访;数组运算和向量化编程;实现数组运算的基本函数;常用标准数组生成函数和数组构作技法;非数NaN、“空”数组概念和应用;关系和逻辑操作。

3.1 数值计算的特点和地位

【例3.1-1】已知tttfcos)(2,求dttfxsx

0 )()(。

(1)符号计算解法

syms t x %定义符号变量

ft=t^2*cos(t) %定义函数

sx=int(ft,t,0,x) %符号积分

ft =

t^2*cos(t)

sx =

x^2*sin(x)-2*sin(x)+2*x*cos(x)

说明:

1. 符号计算可以得到和手工数学推导相同的结果;

2. 可以得到精确的解析结果

(2)数值计算解法

dt=0.05; %定义采样间隔

t=0:dt:5; %定义数值积分的计算区域,数值计算只在有限的区间的采样点进行

Ft=t.^2.*cos(t); %定义计算的函数

Sx=dt*cumtrapz(Ft); %数值积分,计算从0开始到每个采样点位置的区间内,Ft曲线 %下的面积,此面积由宽度为t的小梯形面积累加而成;

%下面分步看一下计算结果:

whos

bar(t,Ft) %Ft函数的数值

hold on

plot(t,Sx,'.r','MarkerSize',12) %数值积分结果

axis(0,6,-25,10)

hold off

Name Size Bytes Class

Ft 1x101 808 double array

Sx 1x101 808 double array

dt 1x1 8 double array

t 1x101 808 double array xqxqxq1234 1x1 1 logical array

Grand total is 305 elements using 2433 bytes

-10123456-25-20-15-10-50510

说明:

1. 进行数值计算,必须首先确定一组自变量采样点,即确定一个自变量的取值区间,并设定取样间隔;

2. 数值计算的表达式都是在意志的数值采样点进行计算;

3. 数值计算的结果也是离散的;

4. 再将数值计算的结果扩展到更大的计算区域时不一定成立;

5. 直接观察计算结果的离散数值难以看出函数关系,但图形有利于加深对函数的认识。

【例3.1-2】已知)sin()(tetf,求4

0 )()(dttfxs。

(1)符号计算解法

syms t x

ft=exp(-sin(t))

sx=int(ft,t,0,4)

ft =

exp(-sin(t))

Warning: Explicit integral could not be found.

> In sym.int at 58

sx =

int(exp(-sin(t)),t = 0 .. 4)

说明:符号计算的能力有限,不是在任何情况下都可以得到计算结果;

(2)数值计算解法

dt=0.05;

t=0:dt:4;

Ft=exp(-sin(t));

Sx=dt*cumtrapz(Ft);

Sx(end)

bar(t,Ft)

hold on

plot(t,Sx,'.r','MarkerSize',15)

hold off

xlabel('x')

legend('Ft','Sx')

hold off

ans =

3.0632

-0.500.511.522.533.544.500.511.522.533.5xFtSx

说明:数值计算的应用非常广泛,只要给定计算区间、采用点和计算表达式,总是可以得到数值计算的结果。

3.2 数值数组的创建和寻访

3.2.1 一维数组的创建

1递增/减型一维数组的创建

主要特征:

(1)数组元素值的大小按照递增或者递减的顺序排列,元素之间的“差”是固定的或者“等步长”的。

(2)主要用作函数的自变量,for循环中的自变量等。

创建方法:

(1)“冒号”生成法

格式: x = a : inc :b

说明:x----变量名称;

a/ b-----起点/终点

inc -----步长(正数或者负数)

例子:

(1)i = 0:1:10

i =

0 1 2 3 4 5 6 7 8 9 10

(2) i = 0:10

i =

0 1 2 3 4 5 6 7 8 9 10

说明: 缺省的步长是1;

(3) i = 0:1:8.5

ans =

0 1 2 3 4 5 6 7 8

(4) i = 0.5:1:10

i =

0.5000 1.5000 2.5000 3.5000 4.5000 5.5000 6.5000

7.5000 8.5000 9.5000

说明: 当abs(b-a)不能被inc整除,生成的最后一个元素将小于b;

(5) i = 10:-1:0

i =

10 9 8 7 6 5 4 3 2 1 0

(6) i = 10:-1:20

i =

Empty matrix: 1-by-0

说明:步长可以为负数,但此时前面的元素必须大于后面的。

(2)线性(或者对数)定点法

格式:

x=linspace(a,b,n) %以a,b为左右端点,产生线性等间隔的(1*n)行数组;

x=logspace(a,b,n) %以10^a,10^b为左右端点,产生对数等间隔的(1*n)行数组;

xl=linspace(0,10,9)

xl =

0 1.2500 2.5000 3.7500 5.0000 6.2500 7.5000

8.7500 10.0000

说明:x=linespace(a,b,n) <===> x=a:(b-a)/(n-1):b

xl=logspace(1,4,4)

xl =

10 100 1000 10000

说明:logspace(x1,x2,N)用于在10^x1 and 10^x2之间产生N个对数均匀间隔的点。

2 通用型一维数组的创建

(1)逐个元素输入法,最简单而通用的方法。如:

y=[1,2, sin(pi/5),-exp(-3)]

y =

1.0000 2.0000 0.5878 -0.0498

(2)使用Matlab函数生成,如rand(1,n), ones(1,n)

rand(1,10) %在[0,1]之间产生(1*10)的向量;

ans =

0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565

0.0185 0.8214 0.4447

rand(5,5)

ans =

0.6154 0.4057 0.0579 0.2028 0.0153

0.7919 0.9355 0.3529 0.1987 0.7468

0.9218 0.9169 0.8132 0.6038 0.4451

0.7382 0.4103 0.0099 0.2722 0.9318

0.1763 0.8936 0.1389 0.1988 0.4660

rand(5,5)

ans =

0.5548 0.2731 0.9084 0.6408 0.9943

0.1210 0.2548 0.2319 0.1909 0.4398

0.4508 0.8656 0.2393 0.8439 0.3400

0.7159 0.2324 0.0498 0.1739 0.3142

0.8928 0.8049 0.0784 0.1708 0.3651

补充说明:为了让前面出现过的随机数再次重复出现,需要对随机数生成器的“状态state”或者“种子seed”进行设置。

rand('state',0) %设置随机数生成器的状态

rand(1,5)

ans =

0.9501 0.2311 0.6068 0.4860 0.8913

rand('state',0) %设置随机数生成器的状态

rand(1,5)

ans =

0.9501 0.2311 0.6068 0.4860 0.8913

ones(3,8)

ans =

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

思考题、练习题:

(1)如何生成在(60,100)之间均匀随机分布的(5*8)的矩阵?如何取整数呢?

(2)产生列数组 x2 = (1:6)' x2 = linspace(0,pi,4)'