数值数组及向量化运算
- 格式: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)'