ch02数值数组及向量化运算.docx
- 文档编号:11189673
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:34
- 大小:120.26KB
ch02数值数组及向量化运算.docx
《ch02数值数组及向量化运算.docx》由会员分享,可在线阅读,更多相关《ch02数值数组及向量化运算.docx(34页珍藏版)》请在冰豆网上搜索。
ch02数值数组及向量化运算
第2章数值数组及向量化运算
本章集中讲述两个数据类型(数值数组和逻辑数组)、两个特有概念变量(非数和空)、以及MATLAB的数组运算和向量化编程。
值得指出:
本章内容是读者今后编写各种科学计算M码的基本构件。
数值数组(NumericArray)是MATLAB最重要的数据类型数组。
在各种维度的数值数组中,二维数组为最基本、最常用。
本章对二维数组创建、标识、寻访、扩充、收缩等方法进行了详尽细腻的描述,并进而将这些方法推广到高维数组。
本章讲述的逻辑数组主要产生于逻辑运算和关系运算。
它是MATLAB援引寻访数据、构成数据流控制条件、、编写复杂程序所不可或缺的重要构件。
数组运算是MATLAB区别于其它程序语言的重要特征,是MATLAB绝大多数函数指令、Simulink许多库模块的本性,是向量化编程的基础。
为此,本章专辟第2.2节用于阐述MATLAB的这一重要特征。
在此提醒读者注意:
随书光盘mbook目录上保存着本章相应的电子文档“ch02_数值数组及向量化运算.doc”。
该文档中有本章全部算例的可执行指令,以及相应的运算结果。
.1数值数组的创建和寻访
.1.1一维数组的创建
1递增/减型一维数组的创建
(1)“冒号”生成法
(2)线性(或对数)定点法
2其他类型一维数组的创建
(1)逐个元素输入法
(2)运用MATLAB函数生成法
【例2.1-1】一维数组的常用创建方法举例。
a1=1:
6
a2=0:
pi/4:
pi
a3=1:
-0.1:
0
a1=
123456
a2=
00.78541.57082.35623.1416
a3=
Columns1through8
1.00000.90000.80000.70000.60000.50000.40000.3000
Columns9through11
0.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=
2.00001.57081.73213.0000+5.0000i
rngdefault
c2=rand(1,5)
c2=
0.81470.90580.12700.91340.6324
〖说明〗
●
x1=(1:
6)',x2=linspace(0,pi,4)'
y1=rand(5,1)
z1=[2;pi/2;sqrt(3);3+5i]
.1.2二维数组的创建
1小规模数组的直接输入法
【例2.1-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
2中规模数组的数组编辑器创建法
【例2.1-3】试用变量编辑器,把如下
的数组输入MATLAB内存,并命名为A18。
0.81470.91340.27850.96490.95720.1419
0.90580.63240.54690.15760.48540.4218
0.12700.09750.95750.97060.80030.9157
图2.1-1利用数组编辑器创建中规模数组
中规模数组的M文件创建法
【例2.1-4】为数组AM,创建一个exm020104_Matrix.m文件。
以后每当需要AM数组时,只要运行exm020104_Matrix文件,就可在内存生成AM。
图2.1-2利用M文件创建数组
利用MATLAB函数创建数组
【例2.1-5】利用MATLAB指令产生数组。
(1)
ao=ones(2,4)
az=zeros(2,5)
ae=eye(3)
am=magic(4)
ad=diag(am)
add=diag(diag(am))
ao=
1111
1111
az=
00000
00000
ae=
100
010
001
am=
162313
511108
97612
414151
ad=
16
11
6
1
add=
16000
01100
0060
0001
(2)
%
rngdefault
Au=rand(1,5)
Ai=randi([-3,4],2,8)
As=randsrc(3,12,[-3,-1,1,3],1)
Ap=randperm(8)
Au=
0.81470.90580.12700.91340.6324
Ai=
-31440-244
-14-243032
As=
-1-1-31-31-333-3-31
1-3-1-13-1-3-13-3-11
-3-3-11-3131-333-1
Ap=
17846523
%
rng(0,'v5normal')
randn(2,6)
ans=
-0.43260.1253-1.14651.18920.3273-0.1867
-1.66560.28771.1909-0.03760.17460.7258
(3)
n=5;lambda=2;
A=gallery('jordbloc',n,lambda)
A=
21000
02100
00210
00021
00002
rng(11,'v5normal')
n=6;
kappa=1e8;
mode=2;
B=gallery('randsvd',n,kappa,mode)
Bsv=svd(B)'
Bc=cond(B)
B=
-0.2402-0.6286-0.6241-0.14130.2258-0.2410
-0.57610.27030.2092-0.1420-0.2454-0.4657
0.5168-0.13110.0244-0.6882-0.4403-0.2138
0.56130.2022-0.12600.27810.3097-0.1772
-0.07440.04890.3518-0.55180.74730.0709
-0.1044-0.28990.1391-0.0840-0.20100.7394
Bsv=
1.00001.00001.00001.00001.00000.0000
Bc=
1.0000e+008
.1.3二维数组元素的标识和寻访
1数组的维数和大小
(1)数组的维数(Dimension)
(2)数组的大小(Size)
【例2.1-6】数组的维数、大小和长度
clear
A=reshape(1:
24,2,3,4);
dim_A=ndims(A)
size_A=size(A)
L_A=length(A)
dim_A=
3
size_A=
234
L_A=
4
2数组的标识和寻访
【例2.1-7】本例演示:
数组元素及子数组的各种标识和寻访格式;冒号的使用;end的作用。
(1)
A=zeros(2,6)
A(:
)=1:
12
a8=A(8)
a311=A([3,11])
A=
000000
000000
A=
1357911
24681012
a8=
8
a311=
311
(2)
A(3,7)=37
a13=A(:
[1,3])
aend=A([2,3],4:
end)
A=
13579110
246810120
00000037
a13=
15
26
00
aend=
810120
00037
(3)
L=A<3
A(L)=NaN
L=
1000001
1000001
1111110
A=
NaN357911NaN
NaN4681012NaN
NaNNaNNaNNaNNaNNaN37
.1.4数组的扩缩和特殊操作
数组的扩充和收缩
【例2.1-8】二维数组的扩充和收缩。
(1)
a=1:
5;b=6:
10;c=11:
15;
a_b=[a,b]
ab=[a;b;c]
a_b=
12345678910
ab=
12345
678910
1112131415
(2)
AB1=repmat(ab,[1,2])
AB2=repmat(ab,[2,1])
AB1=
1234512345
678910678910
11121314151112131415
AB2=
12345
678910
1112131415
12345
678910
1112131415
(3)
AB2([2,3,5,6],:
)=[]
AB2(:
1:
3)=[]
AB2=
12345
12345
AB2=
45
45
数组的特殊操作
【例2.1-9】本例演示:
reshape的数组变形功能;数组的翻转指令flipud,fliplr,flipdim,以及它们体现的矩阵变换;数组绕“左上元素”反时针旋转指令rot90;数组上下左右平移回绕指令circshift。
(1)
clear
a=1:
24;
A=reshape(a,3,8)
B=reshape(A,2,4,3)
A=
1471013161922
2581114172023
3691215182124
B(:
:
1)=
1357
2468
B(:
:
2)=
9111315
10121416
B(:
:
3)=
17192123
18202224
(2)
Aud=flipud(A)
Alr=fliplr(A)
B1=flipdim(A,1)
B2=flipdim(A,2)
At=A'
Aud=
3691215182124
2581114172023
1471013161922
Alr=
2219161310741
2320171411852
2421181512963
B1=
3691215182124
2581114172023
1471013161922
B2=
2219161310741
2320171411852
2421181512963
At=
123
456
789
101112
131415
161718
192021
222324
(3)
A90=rot90(A)
A180=rot90(A,2)
A90=
222324
192021
161718
131415
101112
789
456
123
A180=
2421181512963
2320171411852
2219161310741
(4)
A
CR=circshift(A,1)
CL=circshift(A,[0,-1])
A=
1471013161922
2581114172023
3691215182124
CR=
3691215182124
1471013161922
2581114172023
CL=
4710131619221
5811141720232
6912151821243
数组操作函数汇总
.2数组运算
.2.1数组运算的由来和规则
1函数关系数值计算模型的分类
2提高程序执行性能的三大措施
3数组运算规则
4数组运算符及数组运算函数
.2.2数组运算和向量化编程
【例2.2-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%<7>
sr=0;%<8>
fork=1:
L
sr=sr+r(k);
end
rm=sr/L%<12>
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%<16>
rm=mean(r)%<17>
r=
Columns1through8
31.785730.000030.900029.448330.678029.883730.066930.8171
Columns9through10
31.493530.1739
rm=
30.5247
【例2.2-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])
图2.2-1指定域上的二元函数图形
.2.3数组特殊运算指令汇总
【例2.2-3】数组元素的“和”、“积”、“累和”、“累积”运算。
clear
rngdefault
a=[(1:
5)',randi(5,[5,3]),randn(5,2)]
cs=cumsum(a)
s=sum(a)
cp=cumprod(a)
p=prod(a)
a=
1.00005.00001.00001.0000-0.20500.6715
2.00005.00002.00005.0000-0.1241-1.2075
3.00001.00003.00005.00001.48970.7172
4.00005.00005.00003.00001.40901.6302
5.00004.00005.00005.00001.41720.4889
cs=
1.00005.00001.00001.0000-0.20500.6715
3.000010.00003.00006.0000-0.3291-0.5360
6.000011.00006.000011.00001.16060.1812
10.000016.000011.000014.00002.56961.8115
15.000020.000016.000019.00003.98682.3004
s=
15.000020.000016.000019.00003.98682.3004
cp=
1.00005.00001.00001.0000-0.20500.6715
2.000025.00002.00005.00000.0254-0.8108
6.000025.00006.000025.00000.0379-0.5816
24.0000125.000030.000075.00000.0534-0.9481
120.0000500.0000150.0000375.00000.0757-0.4635
p=
120.0000500.0000150.0000375.00000.0757-0.4635
【例2.2-4】向量的点击和叉积
(1)
rng(50,'v5normal')
a=randn(1,3),b=randn(1,3),
c=dot(a,b)
d=cross(a,b)
a=
2.3846-0.29980.7914
b=
-1.7490-1.70620.2231
c=
-3.4826
d=
1.2835-1.9162-4.5930
(2)
ab=[a;b];
dd
(1)=det(ab(:
[2,3]));
dd
(2)=-det(ab(:
[1,3]));
dd(3)=det(ab(:
[1,2]));
dd
dd=
1.2835-1.9162-4.5930
(3)
plot3([0;a
(1)],[0;a
(2)],[0;a(3)],'b--','LineWidth',3)
holdon
plot3([0;b
(1)],[0;b
(1)],[0;b(3)],'g-.','LineWidth',3)
plot3([0;d
(1)],[0;d
(2)],[0;d(3)],'r','LineWidth',3)
holdoff
gridon
boxon
view([131,-4])
legend('\bfa','\bfb','\bfd={\bfa}{\times}{\bfb}')
图2.2-2三维空间中两根向量的叉积图示
.3高维数组
.3.1高维数组的创建
【例2.3-1】“全下标”元素赋值方式创建高维数组演示。
(1)
A(2,4,2)=1
A(:
:
1)=
0000
0000
A(:
:
2)=
0000
0001
(2)
C=ones(2,3);C(:
:
2)=ones(2,3)*2;C(:
:
3)=ones(2,3)*3
C(:
:
1)=
111
111
C(:
:
2)=
222
222
C(:
:
3)=
333
333
(3)
rng(1111)
D=rand(2,4,3)
DS=reshape(D,[2,6,2])
D(:
:
1)=
0.09550.34360.00200.2378
0.92500.31050.23560.7359
D(:
:
2)=
0.49550.12650.46610.4352
0.78440.60660.23710.2437
D(:
:
3)=
0.38380.65520.63910.6109
0.83840.14840.63740.9300
DS(:
:
1)=
0.09550.34360.00200.23780.49550.1265
0.92500.31050.23560.73590.78440.6066
DS(:
:
2)=
0.46610.43520.38380.65520.63910.6109
0.23710.24370.83840.14840.63740.9300
(4)
E=eye(2,3);
E3=repmat(E,[1,2,2])
E3(:
:
1)=
100100
010010
E3(:
:
2)=
100100
010010
.3.2高维数组的孤维删除
【例2.3-2】本例演示:
squeeze指令对孤维的删除;shiftdim指令的平移,及该指令对平移数组中孤维的删除作用;“空阵”使维度的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ch02 数值 数组 量化 运算