1、实验二 数值数组创建、应用及可视化实验目的1 掌握二维数组的创建、寻访,区分数组运算与矩阵运算的区别。2 掌握标准数组生成函数和数组构造技法。 3 进一步熟悉 M 脚本文件编写的方法和技巧。实验原理数值数组和数组运算 MATALB 核心内容,是 MATLAB 最重要的一种内建数据类型。通常,数组是由一组实数或复数排成的长方阵列 (Array ), 它可以是一维的“行”或“列”,可以是二维的“矩形 ”,也可是三维的若同维矩形的堆叠,甚至是更高的任意维。而数组运算是指无论在数组上施加什么运算 ( 加减乘除或函数 ), 总认定那种运算对被运算数组中的每个元素 (Element) 平等地时实施同样的操
2、作。这使得计算程序简单、易读,使程序指令更接近教科书上的数学计算公式,并提高了程序的向量化程度,提高计算效率,节省计算机开销。一维数组的创建可采用逐个元素输入法,这是最简单,但又最通用的构造方法,如: x=2 pi/2 sqrt(3) 3+5i; 另外有规律的产生数组可以采用冒号生成法,通用格式是 x = a : inc : b,a 是数组的第一个元素, inc 是采样点之间的步长。若( b-a )是 inc 的整数倍,则生成数组的最后一个元素是 b, 否则小于 b 。或者采用定数线性采样法,该法是在设定“总点数”下,均匀采样生成一维“ 行 ”数组。格式为 x = linspace ( a ,
3、b ,n ) , a 、 b 分别是生成数组的第一个各最后一个元素 ,n 是采样总点数,该指令生成( 1n )数组。二维数组是由实数或复数排列成矩形而构成的。从数据结构上看,矩形和二维数组没有什么区别。当二维数组带有线性变换含义时,该二维数组就是矩阵。二维数组的创建也可采用直接输入法,或者利用构造 M 文件创建和保存数组。除此以外,还可以采用 MATLAB 提供的标准函数生成我们需要的数组,诸如 zeros 、 ones 、 rand 、 eye 、 diag 、 magic 等,详请见附录。一维数组元素的寻访和标识采用 X(index) 方法,只是要注意 MATLAB 中第一个元素下标 in
4、dex 是 1 ,而不是 C 语言中的 0 。二维数组元素的标识和寻访可分为“全下标”标识和“单下标 ”标识, “全下标 ”标识,即指出是“第几行,第几列”的元素,如 A(3,5) 表示二维数组 A 的第三行第五列元素。该标识法的优点是几何概念清楚,引述简单,在 MATLAB 的寻址和赋值中最为常用。 “单下标”标识,顾名思义就是只用一个下标来指明元素在数组中的位置,首先对二维数组的所有元素进行“一维编号”。 “一维编号”是指:先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列”,然后自上往下对元素未知进行编号,其优点是简洁、方便,特别是如果碰到对二维数组进行诸如 for 循环
5、操作时可以减少循环次数,提高编程效率。 “全下标”标识和“单下标”标识可以通过 sub2ind 和 ind2sub 指令进行转换,详见帮助。另外,不论二维数组还是一维数组还可以采用 “逻辑 1 ”标识,这种方法常用于寻找数组中所有大于或小于某值的元素的问题中。比如 X(abs(X)3) 可以找出数组 X 中所有绝对值大于 3 的元素。另外还可以借助 ones, zeros, rand, randn 和 cat, repmat, reshape 等函数直接或间接构作高维数组,详见附录或 MATLAB 帮助。Matlab 中的许多函数可以直接对任意维的数组直接运算,相当于对数组中的每个元素分别进行
6、运算。比如 Y=sin(X) 可以直接得到与数组 X 中每一个元素相对应的的正弦值,这大大简化了编程。可以执行数组运算的常用函数已经列表于附录中,以供参考。但值得注意的是,虽然从外观形状和数据结构上看,二维数组和(数学中的)矩阵)没有区别,但矩阵作为一种变换或映射算子的体现,矩阵运算有着明确而严格的数学规则。数组运算是 MATLAB 软件所定义的规则,其目的是为了数据管理方便、操作简单、指令形式自然和执行计算的有效。为了区别数组和矩阵运算,在易混淆的地方,数组运算在运算符前加一小黑点“ . ”以示区别,比如 Y=A.*B ,代表的示数组 A 和数组 B 对应元素相乘,而 Y=A*B ,则表示内
7、维相同的矩阵 A 和 B 的乘积。由此也可看出,在执行数组与数组的运算时,参与运算的数组必须同维,运算所得结果也总与原数组同维。本节只涉及数组可视化方法的简单实现。通常,对于离散数据可采用 stem 命令或者使用 plot 绘点的方法,而对于连续函数可直接采用 plot 指令来实现。实验内容一数组的创建和寻访 1 一维数组在命令窗口执行下面指令,观察输出结果,体味数组创建和寻访方法,%号后面的为注释,不用输入。 rand(state,0) % 把均匀分布伪随机发生器置为 0 状态 x=rand(1,5) % 产生(1*5)的均布随机数组 x(3) % 寻访数组 x 的第三个元素。 x(1 2
8、5) % 寻访数组 x 的第一、二、五个元素组成的子数组。 x(1:3) % 寻访前三个元素组成的子数组 x(3:end) % 寻访除前 2 个元素外的全部其他元素。end 是最后一个元素的下标。 x(3:-1:1) % 由前三个元素倒排构成的子数组 x(find(x0.5) % 由大于 0.5 的元素构成的子数组 x(1 2 3 4 4 3 2 1) % 对元素可以重复寻访,使所得数组长度允许大于原数组。x(3) = 0 % 把上例中的第三个元素重新赋值为 0。x(1 4)=1 1 % 把当前 x 数组的第一、四个元素都赋值为 1。 x3= % 空数组的赋值操作 2 二维数组 (1) 在命令
9、窗口执行下面指令,观察输出结果 a=2.7358; b=33/79; % 这两条指令分别给变量 a , b 赋值。C=1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i % 这指令用于创建二维组 C M_r=1,2,3;4,5,6,M_i=11,12,13;14,15,16 % 创建复数数组的另一种方法 CN=M_r+i*M_i % 由实部、虚部数组构成复数数组 (2) 利用 M 文件创建和保存下面的数组(分号后面是一个空格后加 3 个小数点,表示换行续写) AM=101,102,103,104,105,106,107,108,109;. 201,202,203
10、,204,205,206,207,208,209;. 301,302,303,304,305,306,307,308,309; (3) 仿照问题 1 中方法找出数组 中所有绝对值大于 3 的元素。5314204A(4)在命令窗口执行下面指令,体味二维数组的子数组寻访和赋值 A=zeros(2,4) % 创建( 2*4)的全零数组 A(:)=1:8 % 全元素赋值方式 s=2 3 5; % 产生单下标数组行数组 A(s) % 由“单下标行数组”寻访产生 A 元素组成的行数组 Sa=10 20 30 %Sa 是长度为 3 的“ 列数组”A(s)=Sa % 单下标方式赋值 A(:,2 3)=ones
11、(2) % 双下标赋值方式:把 A 的第 2 、3 列元素全赋为 1 (5) 运行指令 rand(state ,11),A=rand(3,10000);B=(A0.5);C=2*B-1; 首先预测( C*C)/100 的运行结果,然后再在机器上验证。 (本方法提供了产生通信等仿真中常需若干独立的双随机码的方法原型。 )(6) 在命令窗口执行下面指令,体味数组运算与矩阵运算的区别 clear ;A=zeros(2,3); A(:)=1:6; % 全元素赋值法 A=A*(1+i) % 运用标量与数组乘产生复数矩阵 A_A=A. % 数组转置,即非共轭转置,其中单引号实现转置功能 A_M=A % 矩阵转置,即共轭转置二编写如图所示波形的 MATLAB 脚本文件,图中虚线为正弦波,要求它分别在及 处削顶。21图 1 可能用到的额外指令: find 、 hold on 、 hold off 、 legend ,具体使用方法使用 help指令名来解答。