MatLab教程第3章数值数组及向量化运算.docx
《MatLab教程第3章数值数组及向量化运算.docx》由会员分享,可在线阅读,更多相关《MatLab教程第3章数值数组及向量化运算.docx(24页珍藏版)》请在冰豆网上搜索。
MatLab教程第3章数值数组及向量化运算
第3章数值数组及向量化运算
数值数组(NumericArray)和数组运算(ArrayOperations)始终是MATLAB的核心内容。
本书从第3章起,全部注意力将集中于数值数组及其运算。
本章系统阐述:
数组浮点算法的特点;一、二维数值数组的创建和寻访;数组运算和向量化编程;实现数组运算的基本函数;常用标准数组生成函数和数组构作技法;非数NaN、“空”数组概念和应用;关系和逻辑操作。
.1数值计算的特点和地位
【例3.1-1】已知
,求
。
(1)符号计算解法
symstx
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)
(2)数值计算解法
dt=0.05;
t=0:
dt:
5;
Ft=t.^2.*cos(t);
Sx=dt*cumtrapz(Ft);
t(end-4:
end)
Sx(end-4:
end)
plot(t,Sx,'.k','MarkerSize',12)
xlabel('x'),ylabel('Sx'),gridon
ans=
4.80004.85004.90004.95005.0000
ans=
-20.1144-19.9833-19.7907-19.5345-19.2131
图3.1-1在区间[0,5]采样点上算得的定积分值
【例3.1-2】已知
,求
。
(1)符号计算解法
symstx
ft=exp(-sin(t))
sx=int(ft,t,0,4)
ft=
exp(-sin(t))
Warning:
Explicitintegralcouldnotbefound.
>Insym.intat58
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)
plot(t,Ft,'*r','MarkerSize',4)
holdon
plot(t,Sx,'.k','MarkerSize',15)
holdoff
xlabel('x')
legend('Ft','Sx')
ans=
3.0632
图3.1-2在区间[0,4]中间的被积函数及其原函数的离散计算结果
.2数值数组的创建和寻访
.2.1一维数组的创建
10一递增/减型一维数组的创建
10二通用型一维数组的创建
【例3.2-1】一维数组的常用创建方法举例。
a1=1:
6
a2=0:
pi/4:
pi
a3=1:
-0.1:
0
a1=
123456
a2=
00.78541.57082.35623.1416
a3=
Columns1through6
1.00000.90000.80000.70000.60000.5000
Columns7through11
0.40000.30000.20000.10000
b1=linspace(0,pi,4)
b2=logspace(0,3,4)
b1=
01.04722.09443.1416
b2=
1101001000
c1=[2pi/2sqrt(3)3+5i]
c1=
Columns1through3
2.00001.57081.7321
Column4
3.0000+5.0000i
rand('state',0)
c2=rand(1,5)
c2=
0.95010.23110.60680.48600.8913
.2.2二维数组的创建
10一小规模数组的直接输入法
【例3.2-2】在MATLAB环境下,用下面三条指令创建二维数组C。
a=2.7358;b=33/79;
C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i]
C=
1.00005.4716+0.4177i0.6909
0.70714.82443.5000+1.0000i
10二中规模数组的数组编辑器创建法
【例3.2-3】根据现有数据创建一个
的数组。
图3.2-1利用数组编辑器创建中规模数组
10三中规模数组的M文件创建法
【例3.2-4】创建和保存数组AM的MyMatrix.m文件。
(1)打开文件编辑调试器,并在空白填写框中输入所需数组(见图3.2-2)。
(2)最好,在文件的首行,编写文件名和简短说明,以便查阅(见图3.2-2)。
(3)保存此文件,并且文件起名为MyMatrix.m。
(4)以后只要在MATLAB指令窗中,运行MyMatrix.m文件,数组AM就会自动生成于MATLAB内存中。
图3.2-2利用M文件创建数组
10四利用MATLAB函数创建数组
【例3.2-5】标准数组产生的演示。
ones(2,4)
ans=
1111
1111
randn('state',0)
randn(2,3)
ans=
-0.43260.1253-1.1465
-1.66560.28771.1909
D=eye(3)
D=
100
010
001
diag(D)
ans=
1
1
1
diag(diag(D))
ans=
100
010
001
randsrc(3,20,[-3,-1,1,3],1)
ans=
Columns1through13
313-1-33-3-3-13-1-1-3
1313-111111113
3-1-3-11-13-1-111-1-3
Columns14through20
11-33-113
-1-1-3-1-11-3
3-1-13-133
.2.3二维数组元素的标识和寻访
【例3.2-6】本例演示:
数组元素及子数组的各种标识和寻访格式;冒号的使用;end的作用。
A=zeros(2,6)
A(:
)=1:
12
A=
000000
000000
A=
1357911
24681012
A(2,4)
A(8)
ans=
8
ans=
8
A(:
[1,3])
A([1,2,5,6]')
ans=
15
26
ans=
1
2
5
6
A(:
4:
end)
ans=
7911
81012
A(2,1:
2:
5)=[-1,-3,-5]
A=
1357911
-14-38-512
B=A([1,2,2,2],[1,3,5])
B=
159
-1-3-5
-1-3-5
-1-3-5
L=A<3
A(L)=NaN
L=
100000
101010
A=
NaN357911
NaN4NaN8NaN12
.2.4数组构作技法综合
【例3.2-7】数组操作函数reshape,diag,repmat的用法;空阵[]删除子数组的用法。
a=1:
8
A=reshape(a,4,2)
A=reshape(A,2,4)
a=
12345678
A=
15
26
37
48
A=
1357
2468
b=diag(A)
B=diag(b)
b=
1
4
B=
10
04
D1=repmat(B,2,4)
D1=
10101010
04040404
10101010
04040404
D1([1,3],:
)=[]
D1=
04040404
04040404
【例3.2-8】函数flipud,fliplr,rot90对数组的操作体现着“矩阵变换”。
A=reshape(1:
9,3,3)
A=
147
258
369
B=flipud(A)
B=
369
258
147
C=fliplr(A)
C=
741
852
963
D=rot90(A,2)
D=
963
852
741
.3数组运算
.3.1数组运算的由来和规则
10一函数关系数值计算模型的分类
10二提高程序执行性能的三大措施
10三数组运算规则
10四数组运算符及数组运算函数
.3.2数组运算和向量化编程
【例3.3-1】欧姆定律:
,其中
分别是电阻(欧姆)、电压(伏特)、电流(安培)。
验证实验:
据电阻两端施加的电压,测量电阻中流过的电流,然后据测得的电压、电流计算平均电阻值。
(测得的电压电流具体数据见下列程序)。
(1)非向量化程序
clear
vr=[0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41];
ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];
%--------------------
L=length(vr);
fork=1:
L
r(k)=vr(k)/ir(k);
end
%---------------------------
sr=0;
fork=1:
L
sr=sr+r(k);
end
rm=sr/L
rm=
30.5247
(2)向量化程序
clear
vr=[0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41];
ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];
r=vr./ir
rm=mean(r)
r=
Columns1through7
31.785730.000030.900029.448330.678029.883730.0669
Columns8through10
30.817131.493530.1739
rm=
30.5247
【例3.3-2】用间距为0.1的水平线和垂直线均匀分割
的矩形域,在所有水平线和垂直线交点上计算函数
的值,并图示。
(1)
clear
x=-5:
0.1:
5;
y=(-2.5:
0.1:
2.5)';
N=length(x);
M=length(y);
forii=1:
M
forjj=1:
N
X0(ii,jj)=x(jj);
Y0(ii,jj)=y(ii);
Z0(ii,jj)=sin(abs(x(jj)*y(ii)));
end
end
(2)
[X,Y]=meshgrid(x,y);
Z=sin(abs(X.*Y));
(3)
norm(Z-Z0)
ans=
0
(4)
surf(X,Y,Z)
xlabel('x')
ylabel('y')
shadinginterp
view([190,70])
图3.3-1指定域上的二元函数图形
.4“非数”和“空”数组
.4.1非数NaN
【例3.4-1】非数的产生和性质演示。
(1)非数的产生
a=0/0,b=0*log(0),c=inf-inf
a=
NaN
b=
NaN
c=
NaN
(2)非数的传递性
0*a,sin(a)
ans=
NaN
ans=
NaN
(3)非数的属性判断
class(a)
isnan(a)
ans=
double
ans=
1
【例3.4-2】非数元素的寻访。
rand('state',0)
R=rand(2,5);R(1,5)=NaN;R(2,3)=NaN
R=
0.95010.60680.89130.4565NaN
0.23110.4860NaN0.01850.4447
LR=isnan(R)
LR=
00001
00100
si=find(LR)
[ri,ci]=ind2sub(size(R),si)
[rj,cj]=find(LR)
disp('非数在二维数组R中的位置')
disp(['单下标时的第',int2str(si
(1)),'和第',int2str(si
(2)),'个元素'])
si=
6
9
ri=
2
1
ci=
3
5
rj=
2
1
cj=
3
5
非数在二维数组R中的位置
单下标时的第6和第9个元素
.4.2“空”数组
【例3.4-3】关于“空”数组的算例。
(1)创建“空”数组的几种方法
a=[]
b=ones(2,0),c=zeros(2,0),d=eye(2,0)
f=rand(2,3,0,4)
a=
[]
b=
Emptymatrix:
2-by-0
c=
Emptymatrix:
2-by-0
d=
Emptymatrix:
2-by-0
f=
Emptyarray:
2-by-3-by-0-by-4
(2)“空”数组的属性
class(a)
isnumeric(a)
isempty(a)
ans=
double
ans=
1
ans=
1
whicha
ndims(a)
size(a)
aisavariable.
ans=
2
ans=
00
(3)“空”数组用于子数组的删除和大数组的大小收缩
A=reshape(-4:
5,2,5)
A=
-4-2024
-3-1135
A(:
[2,4])=[]
A=
-404
-315
.5关系操作和逻辑操作
.5.1关系操作
【例3.5-1】关系运算示例。
A=1:
9,B=10-A
r0=(A<4)
r1=(A==B)
A=
123456789
B=
987654321
r0=
111000000
r1=
000010000
【例3.5-2】关系运算应用。
t=-3*pi:
pi/10:
3*pi;
y=sin(t)./t;
tt=t+(t==0)*eps;
yy=sin(tt)./tt;
subplot(1,2,1),plot(t,y),axis([-9,9,-0.5,1.2]),
xlabel('t'),ylabel('y'),title('残缺图形')
subplot(1,2,2),plot(tt,yy),axis([-9,9,-0.5,1.2])
xlabel('tt'),ylabel('yy'),title('正确图形')
图3.5-1采用近似极限处理前后的图形对照
.5.2逻辑操作
【例3.5-3】逻辑操作和关系操作。
本例演示:
逻辑、关系操作的组合;xor的作用。
(1)逻辑、关系操作的组合
A=[-2,-1,0,0,1,2,3]
L1=~(A>1)%判断A中,哪些元素不大于1
L2=(A>0)&(A<2)%判断A中,哪些元素大于0且小于3
A=
-2-100123
L1=
1111100
L2=
0000100
(2)xor的作用
A,B=[0,-1,1,0,1,-2,-3]
C=xor(A,B)%当A,B数组中,两个对应元素中仅一个为0时,给出1。
否则为0。
【例3.5-4】试绘制如图3.5-2最下那幅子图所示的“正弦波
的削顶半波整流波形”,削顶发生在每个周期的
之间。
clear,t=linspace(0,3*pi,500);y=sin(t);
z1=((t2*pi)).*y;
w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);
wn=~w;
z2=w*sin(pi/3)+wn.*z1;
subplot(4,1,1),plot(t,y,':
r'),axis([0,10,-1.5,1.5])
ylabel('y'),gridon
subplot(4,1,2),plot(t,z1,':
r'),axis([0,10,-0.2,1.5]),ylabel('z1')
subplot(4,1,3),plot(t,wn,':
r'),axis([0,10,-0.2,1.5]),ylabel('wn')
subplot(4,1,4),plot(t,z2,'-b'),axis([0,10,-0.2,1.5]),ylabel('z2')
xlabel('t')
图3.5-2逐段解析函数的产生
.5.3常用逻辑函数
习题3
1.要求在闭区间
上产生具有10个等距采样点的一维数组。
试用两种不同的指令实现。
2.由指令rand('state',0),A=rand(3,5)生成二维数组A,试求该数组中所有大于0.5的元素的位置,分别求出它们的“全下标”和“单下标”。
〖答案〗
大于0.5的元素的全下标
行号132332312
列号112234455
大于0.5的元素的单下标
1356911121314
3.在使用123作为rand随机数发生器的初始化状态的情况下,写出产生长度为1000的“等概率双位(即取-1,+1)取值的随机码”程序指令,并给出-1码的数目。
〖答案〗
Na=
490
4.已知矩阵
,运行指令B1=A.^(0.5),B2=A^(0.5),可以观察到不同运算方法所得结果不同。
(1)请分别写出根据B1,B2恢复原矩阵A的程序。
(2)用指令检验所得的两个恢复矩阵是否相等。
5.在时间区间[0,10]中,绘制
曲线。
要求分别采取“标量循环运算法”和“数组运算法”编写两段程序绘图。
〖答案〗
6.先运行clear,formatlong,rand('state',1),A=rand(3,3),然后根据A写出两个矩阵:
一个对角阵B,其相应元素由A的对角元素构成;另一个矩阵C,其对角元素全为0,而其余元素与对应的A阵元素相同。
7.先运行指令x=-3*pi:
pi/15:
3*pi;y=x;[X,Y]=meshgrid(x,y);warningoff;Z=sin(X).*sin(Y)./X./Y;产生矩阵Z。
(1)请问矩阵Z中有多少个“非数”数据?
(2)用指令surf(X,Y,Z);shadinginterp观察所绘的图形。
(3)请写出绘制相应的“无裂缝”图形的全部指令。
〖答案〗
NumOfNaN=
181
8.下面有一段程序,企图用来解决如下计算任务:
有矩阵
,当
依次取10,9,8,7,6,5,4,3,2,1时,计算矩阵
“各列元素的和”,并把此求和结果存放为矩阵Sa的第k行。
例如
时,A阵为
,此时它各列元素的和是一个
行数组
,并把它保存为Sa的第3行。
问题:
该段程序的计算结果对吗?
假如计算结果不正确,请指出错误发生的根源,并改正之。
fork=10:
-1:
1
A=reshape(1:
10*k,k,10);
Sa(k,:
)=sum(A);
end
Sa