ch3 数值数组及向量化运算Word文档下载推荐.docx
《ch3 数值数组及向量化运算Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ch3 数值数组及向量化运算Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
t(end-4:
end)%end指示最后一个元素的位置
Sx(end-4:
end)
plot(t,Sx,'
.k'
'
MarkerSize'
12)
xlabel('
x'
),ylabel('
Sx'
),gridon
图3.1-1在区间[0,5]采样点上算得的定积分值
【例3.1-2】已知
(1)符号计算解法无解
symstx
ft=exp(-sin(t))
sx=int(ft,t,0,4)
4;
Ft=exp(-sin(t));
Sx(end)
plot(t,Ft,'
*r'
4)
holdon
15)
holdoff
)
legend('
Ft'
)
.2数值数组的创建和寻访
.2.1一维数组的创建
x=[1,3,5,7,9]逐个元素输入法
x=a:
inc:
b冒号生成法,inc缺省时步长为1
x=linspace(a,b,n)线性定点法,以a,b为左右端点,产生1*n行数组
x=logspace(a,b,n)对数定点法,以a,b为左右端点,产生1*n行数组
运用diag,eye等标准数组生成函数。
【例3.2-1】一维数组的常用创建方法举例。
a1=1:
6
a2=0:
pi/4:
pi
a3=1:
-0.1:
0
b1=linspace(0,pi,4)
b2=logspace(0,3,4)%创建数组[100101102103]
c1=[2pi/2sqrt(3)3+5i]
.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]
三个要素:
整个输入数组“[]”
行与行间“;
”或“Enter”
同行中元素间“,”或“空格”
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)%产生(2×
4)全1数组
randn('
state'
0)%把正态随机数发生器置0
randn(2,3)%产生正态随机阵
D=eye(3)%产生3×
3的单位阵
diag(D)%取D阵的对角元
diag(diag(D))%外diag利用一维数组生成对角阵
randsrc(3,20,[-3,-1,1,3],1)%在[-3,-1,1,3]上产生3×
20均布随机数组,随机发生器的状态设置为1
.2.3二维数组元素的标识和寻访
【例3.2-6】本例演示:
数组元素及子数组的各种标识和寻访格式;
冒号的使用;
end的作用。
A=zeros(2,6)
A(:
)=1:
12%单下标法:
单下标全元素寻访
A(2,4)%全下标法:
指定行、指定列
A(8)%单下标法:
单下标寻访
[1,3])%全下标法:
全部行、指定列
A([1,2,5,6])%单下标法:
生成指定的一维行(或列)数组
4:
end)%全下标法:
全部行、指定列,end表示最后一列。
A(2,1:
2:
5)=[-1,-3,-5]%全下标法:
B=A([1,2,2,2],[1,3,5])%全下标法:
.2.4数组操作技法综合
【例3.2-7】数组操作函数reshape,diag,repmat的用法;
空阵[]删除子数组的用法。
a=1:
8
A=reshape(a,4,2)
A=reshape(A,2,4)%改变行数和列数
b=diag(A)%提取对角元素,。
B=diag(b)%生成对角阵
D1=repmat(B,2,4)%排列B模块repmat(A,m,n)createsalargematrixBconsistingofanm-by-ntilingofcopiesofA.
D1([1,3],:
)=[]%删除指定行
【例3.2-8】函数flipud,fliplr,rot90对数组的操作体现着“矩阵变换”。
A=reshape(1:
9,3,3)
B=flipud(A)%上下对称交换
C=fliplr(A)%左右对称交换
D=rot90(A,2)%逆时针旋转90度,2次
.3数组运算
MATLAB面向数组/矩阵编程和运算:
Ø
用“数组或矩阵运算”模式去处理那些“借助循环而反复执行的标量运算”
●显著提高程序执行速度
●书写简洁、便于阅读
数组运算和向量化编程
尽可能用“数组或矩阵运算”指令
【例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;
sr=sr+r(k);
end
rm=sr/L
(2)向量化程序
r=vr./ir%注意:
运算发生在两数组相同位置元素间
rm=mean(r)%MATLAB现成的求平均函数
【例3.3-2】用间距为0.1的水平线和垂直线均匀分割
的矩形域,在所有水平线和垂直线交点上计算函数
的值,并图示。
(1)非向量化编程
x=-5:
0.1:
y=(-2.5:
2.5)'
;
N=length(x);
M=length(y);
forii=1:
M
forjj=1:
N
X0(ii,jj)=x(jj);
%所有格点的x坐标
Y0(ii,jj)=y(ii);
%所有格点的y坐标
Z0(ii,jj)=sin(abs(x(jj)*y(ii)));
%所有格点的函数值
(2)向量化编程
0.01:
[X,Y]=meshgrid(x,y);
%指定矩形域内所有格点的(x,y)坐标
Z=sin(abs(X.*Y));
%数组运算计算矩形域所有格点坐标(x,y)对应的函数值
%注意:
函数f(·
)对数组的逐个元素起作用。
(3)比较二维双精度数是否相等
norm(Z-Z0)%范数接近eps,认为相等。
(4)绘图
surf(X,Y,Z)
ylabel('
y'
shadinginterp
view([190,70])
图3.3-1指定域上的二元函数图形
.4“非数”和“空”数组
✧MATLAB中特有的两个概念和“预定义变量”
.4.1非数NaN(或记为nan)
由
,
等运算产生。
NaN的性质:
●NaN参与运算所得的结果也是NaN,即具有传递性;
●NaN没有“大小”概念,不能比较两个NaN的大小。
NaN的功用:
●真实记述
,
等运算的后果;
●避免可能因
等运算而造成程序执行的中断;
●在测量数据处理中,可以用来标识“野点(非正常点)”;
●在数据可视化中,可以裁剪图形。
【例3.4-1】非数的产生和性质演示。
(1)非数的产生
a=0/0,b=0*log(0),c=inf-inf
a=
NaN
b=
c=
NaN
(2)非数的传递性
0*a,sin(a)
(3)非数的属性判断
class(a)
isnan(a)%唯一判断非数的指令
ans=
double
1
【例3.4-2】非数元素的寻访。
rand('
0)%将随机发生器置0
R=rand(2,5);
R(1,5)=NaN;
R(2,3)=NaN
R=
Columns1through3
0.95010.60680.8913
0.23110.4860NaN
Columns4through5
0.4565NaN
0.01850.4447
LR=isnan(R)%对数组元素是否非数进行判断
LR=
00001
00100
si=find(LR)%确定非零数的“单下标”标