第 2 章 数值数组及向量化运算本章集中讲述两个数据类型(数值数组和逻辑数组)、两个特有概念变量(非数和空)、以及MATLAB的数组运算和向量化编程。
值得指出:本章内容是读者今后编写各种科学计算M码的基本构件。
数值数组(Numeric Array)是MATLAB最重要的数据类型数组。
在各种维度的数值数组中,二维数组为最基本、最常用。
本章对二维数组创建、标识、寻访、扩充、收缩等方法进行了详尽细腻的描述,并进而将这些方法推广到高维数组。
本章讲述的逻辑数组主要产生于逻辑运算和关系运算。
它是MATLAB 援引寻访数据、构成数据流控制条件、、编写复杂程序所不可或缺的重要构件。
数组运算是MATLAB区别于其它程序语言的重要特征,是MATLAB绝大多数函数指令、Simulink许多库模块的本性,是向量化编程的基础。
为此,本章专辟第2.2节用于阐述MATLAB的这一重要特征。
在此提醒读者注意:随书光盘mbook目录上保存着本章相应的电子文档“ch02_数值数组及向量化运算.doc”。
该文档中有本章全部算例的可执行指令,以及相应的运算结果。
2.1数值数组的创建和寻访2.1.1一维数组的创建1递增/减型一维数组的创建(1)“冒号”生成法(2)线性(或对数)定点法2其他类型一维数组的创建(1)逐个元素输入法(2)运用MATLAB函数生成法【例2.1-1】一维数组的常用创建方法举例。
a1=1:6a2=0:pi/4:pia3=1:-0.1:0a1 =1 2 3 4 5 6a2 =0 0.7854 1.5708 2.3562 3.1416a3 =Columns 1 through 81.0000 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000 0.3000Columns 9 through 110.2000 0.1000 0b1=linspace(0,pi,4)b2=logspace(0,3,4)b1 =0 1.0472 2.0944 3.1416b2 =1 10 100 1000c1=[2 pi/2 sqrt(3) 3+5i]c1 =2.0000 1.5708 1.73213.0000 + 5.0000i rng defaultc2=rand(1,5)c2 =0.8147 0.9058 0.1270 0.9134 0.6324〖说明〗x1=(1:6)' , x2=linspace(0,pi,4)'y1=rand(5,1)z1=[2; pi/2; sqrt(3); 3+5i]2.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.0000 5.4716 + 0.4177i 0.69090.7071 4.8244 3.5000 + 1.0000i2中规模数组的数组编辑器创建法3(×的数组输入MATLAB内存,并命名为A18。
【例2.1-3】试用变量编辑器,把如下)60.8147 0.9134 0.2785 0.9649 0.9572 0.14190.9058 0.6324 0.5469 0.1576 0.4854 0.42180.1270 0.0975 0.9575 0.9706 0.8003 0.9157图2.1-1 利用数组编辑器创建中规模数组3中规模数组的M文件创建法【例2.1-4】为数组AM,创建一个 exm020104_Matrix.m 文件。
以后每当需要AM数组时,只要运行exm020104_Matrix文件,就可在内存生成AM。
图2.1-2 利用M文件创建数组4利用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 =1 1 1 11 1 1 1az =0 0 0 0 00 0 0 0 0ae =1 0 00 1 00 0 1am =16 2 3 135 11 10 89 7 6 124 14 15 1ad =161161add =16 0 0 00 11 0 00 0 6 00 0 0 1(2)%rng defaultAu=rand(1,5)Ai=randi([-3,4],2,8)As=randsrc(3,12,[-3,-1,1,3],1)Ap=randperm(8)Au =0.8147 0.9058 0.1270 0.9134 0.6324Ai =-3 1 4 4 0 -2 4 4-1 4 -2 4 3 0 3 2As =-1 -1 -3 1 -3 1 -3 3 3 -3 -3 1 1 -3 -1 -1 3 -1 -3 -1 3 -3 -1 1 -3 -3 -1 1 -3 1 3 1 -3 3 3 -1 Ap =1 7 8 4 6 52 3%rng(0,'v5normal')randn(2,6)ans =-0.4326 0.1253 -1.1465 1.1892 0.3273 -0.1867-1.6656 0.2877 1.1909 -0.0376 0.1746 0.7258(3)n=5;lambda=2;A = gallery('jordbloc',n,lambda)A =2 1 0 0 00 2 1 0 00 0 2 1 00 0 0 2 10 0 0 0 2rng(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.1413 0.2258 -0.2410-0.5761 0.2703 0.2092 -0.1420 -0.2454 -0.46570.5168 -0.1311 0.0244 -0.6882 -0.4403 -0.21380.5613 0.2022 -0.1260 0.2781 0.3097 -0.1772-0.0744 0.0489 0.3518 -0.5518 0.7473 0.0709-0.1044 -0.2899 0.1391 -0.0840 -0.2010 0.7394Bsv =1.0000 1.0000 1.0000 1.0000 1.0000 0.0000Bc =1.0000e+0082.1.3二维数组元素的标识和寻访1数组的维数和大小(1)数组的维数(Dimension)(2)数组的大小(Size)【例2.1-6】数组的维数、大小和长度clearA=reshape(1:24,2,3,4);dim_A=ndims(A)size_A=size(A)L_A=length(A)dim_A =3size_A =2 3 4L_A =42数组的标识和寻访【例2.1-7】本例演示:数组元素及子数组的各种标识和寻访格式;冒号的使用;end的作用。
(1)A=zeros(2,6)A(:)=1:12a8=A(8)a311=A([3,11])A =0 0 0 0 0 00 0 0 0 0 0A =1 3 5 7 9 112 4 6 8 10 12a8 =8a311 =3 11(2)A(3,7)=37a13=A(:,[1,3])aend=A([2,3],4:end)A =1 3 5 7 9 11 02 4 6 8 10 12 00 0 0 0 0 0 37a13 =1 52 60 0aend =8 10 12 00 0 0 37(3)L=A<3A(L)=NaNL =1 0 0 0 0 0 11 0 0 0 0 0 11 1 1 1 1 1 0A =NaN 3 5 7 9 11 NaNNaN 4 6 8 10 12 NaNNaN NaN NaN NaN NaN NaN 372.1.4数组的扩缩和特殊操作1数组的扩充和收缩【例 2.1-8】二维数组的扩充和收缩。
(1)a=1:5;b=6:10;c=11:15;a_b=[a,b]ab=[a;b;c]a_b =1 2 3 4 5 6 7 8 9 10ab =1 2 3 4 56 7 8 9 1011 12 13 14 15(2)AB1=repmat(ab,[1,2])AB2=repmat(ab,[2,1])AB1 =1 2 3 4 5 1 2 3 4 56 7 8 9 10 6 7 8 9 1011 12 13 14 15 11 12 13 14 15AB2 =1 2 3 4 56 7 8 9 1011 12 13 14 151 2 3 4 56 7 8 9 1011 12 13 14 15(3)AB2([2,3,5,6],:)=[]AB2(:,1:3)=[]AB2 =1 2 3 4 51 2 3 4 5AB2 =4 54 52数组的特殊操作【例 2.1-9】本例演示:reshape的数组变形功能;数组的翻转指令flipud, fliplr, flipdim,以及它们体现的矩阵变换;数组绕“左上元素”反时针旋转指令rot90;数组上下左右平移回绕指令circshift。
(1)cleara=1:24;A=reshape(a,3,8)B=reshape(A,2,4,3)A =1 4 7 10 13 16 19 222 5 8 11 14 17 20 233 6 9 12 15 18 21 24B(:,:,1) =1 3 5 72 4 6 8B(:,:,2) =9 11 13 1510 12 14 16B(:,:,3) =17 19 21 2318 20 22 24(2)Aud=flipud(A)Alr=fliplr(A)B1=flipdim(A,1)B2=flipdim(A,2)At=A'Aud =3 6 9 12 15 18 21 24 25 8 11 14 17 20 23 1 4 7 10 13 16 19 22 Alr =22 19 16 13 10 7 4 123 20 17 14 11 8 5 224 21 18 15 12 9 6 3 B1 =3 6 9 12 15 18 21 24 25 8 11 14 17 20 23 1 4 7 10 13 16 19 22 B2 =22 19 16 13 10 7 4 123 20 17 14 11 8 5 224 21 18 15 12 9 6 3 At =1 2 34 5 67 8 910 11 1213 14 1516 17 1819 20 2122 23 24(3)A90=rot90(A)A180=rot90(A,2)A90 =22 23 2419 20 2116 17 1813 14 1510 11 127 8 94 5 61 2 3A180 =24 21 18 15 12 9 6 3 23 20 17 14 11 8 5 2 22 19 16 13 10 7 4 1 (4)ACR=circshift(A,1)CL=circshift(A,[0,-1])A =1 4 7 10 13 16 19 222 5 8 11 14 17 20 233 6 9 12 15 18 21 24CR =3 6 9 12 15 18 21 241 4 7 10 13 16 19 222 5 8 11 14 17 20 23CL =4 7 10 13 16 19 22 15 8 11 14 17 20 23 26 9 12 15 18 21 24 33数组操作函数汇总 2.2数组运算 2.2.1 数组运算的由来和规则1 函数关系数值计算模型的分类2 提高程序执行性能的三大措施3 数组运算规则4 数组运算符及数组运算函数2.2.2 数组运算和向量化编程【例 2.2-1】欧姆定律:i u r =,其中i u r , ,分别是电阻(欧姆)、电压(伏特)、电流(安培)。