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 , b , n ),a、b 分别是生成数组的第一个各最后一个元素
3、,n 是采样总点数,该指令生成(1n)数组。二维数组是由实数或复数排列成矩形而构成的。从数据结构上看,矩形和二维数组没有什么区别。当二维数组带有线性变换含义时,该二维数组就是矩阵。二维数组的创建也可采用直接输入法,或者利用构造M 文件创建和保存数组。除此以外,还可以采用MATLAB 提供的标准函数生成我们需要的数组,诸如zeros、ones、rand、eye、diag、magic 等,详请见附录。一维数组元素的寻访和标识采用X(index)方法,只是要注意MATLAB 中第一个元素下标index 是1,而不是C 语言中的0。二维数组元素的标识和寻访可分为“全下标”标识和“单下标”标识,“全下标
4、”标识,即指出是“第几行,第几列”的元素,如A(3,5)表示二维数组A 的第三行第五列元素。该标识法的优点是几何概念清楚,引述简单,在MATLAB 的寻址和赋值中最为常用。“单下标”标识,顾名思义就是只用一个下标来指明元素在数组中的位置,首先对二维数组的所有元素进行“一维编号”。“一维编号”是指:先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列”,然后自上往下对元素未知进行编号,其优点是简洁、方便,特别是如果碰到对二维数组进行诸如for 循环操作时可以减少循环次数,提高编程效率。“全下标”标识和“单下标”标识可以通过sub2ind 和ind2sub注意:此题为本人自做,非标准
5、答案,仅供参考。指令进行转换,详见帮助。另外,不论二维数组还是一维数组还可以采用“逻辑1”标识,这种方法常用于寻找数组中所有大于或小于某值的元素的问题中。比如X(abs(X)3)可以找出数组X 中所有绝对值大于3 的元素。另外还可以借助ones, zeros, rand, randn 和cat,repmat, reshape 等函数直接或间接构作高维数组,详见附录或MATLAB 帮助。Matlab 中的许多函数可以直接对任意维的数组直接运算,相当于对数组中的每个元素分别进行运算。比如Y=sin(X)可以直接得到与数组X 中每一个元素相对应的的正弦值,这大大简化了编程。可以执行数组运算的常用函数
6、已经列表于附录中,以供参考。但值得注意的是,虽然从外观形状和数据结构上看,二维数组和(数学中的)矩阵)没有区别,但矩阵作为一种变换或映射算子的体现,矩阵运算有着明确而严格的数学规则。数组运算是MATLAB软件所定义的规则,其目的是为了数据管理方便、操作简单、指令形式自然和执行计算的有效。为了区别数组和矩阵运算,在易混淆的地方,数组运算在运算符前加一小黑点“.”以示区别,比如Y=A.*B,代表的示数组A 和数组B 对应元素相乘,而Y=A*B,则表示内维相同的矩阵A 和B 的乘积。由此也可看出,在执行数组与数组的运算时,参与运算的数组必须同维,运算所得结果也总与原数组同维。本节只涉及数组可视化方法
7、的简单实现。通常,对于离散数据可采用stem 命令或者使用plot 绘点的方法,而对于连续函数可直接采用plot 指令来实现。实验内容一数组的创建和寻访1一维数组在命令窗口执行下面指令,观察输出结果,体味数组创建和寻访方法,%号后面的为注释,不用输入。rand(state,0) %把均匀分布伪随机发生器置为0 状态rand(state,0) x=rand(1,5) %产生(1 5) 的均布随机数组x=rand(1,5) x =0.0579 0.3529 0.8132 0.0099 0.1389 x(3) %寻访数组x 的第三个元素。a=x(3) a =0.8132 x(1 2 5) %寻访数组
8、x 的第一、二、五个元素组成的子数组。b=x(1 2 5) b =0.0579 0.3529 0.1389 x(1:3) %寻访前三个元素组成的子数组c=x(1:3) c =0.0579 0.3529 0.8132 x(3:end) %寻访除前2 个元素外的全部其他元素。end 是最后一个元素的下标。d=x(3:end) d =0.8132 0.0099 0.1389 x(3:-1:1) %由前三个元素倒排构成的子数组f=x(3:-1:1) f =0.8132 0.3529 0.0579 x(find(x0.5) %由大于0.5 的元素构成的子数组g=x(find(x0.5) g =0.813
9、2 x(1 2 3 4 4 3 2 1) %对元素可以重复寻访,使所得数组长度允许大于原数组。h=x(1 2 3 4 4 3 2 1) h =Columns 1 through 60.0579 0.3529 0.8132 0.0099 0.0099 0.8132Columns 7 through 80.3529 0.0579 x(3) = 0 %把上例中的第三个元素重新赋值为0x(3) = 0 x =0.0579 0.3529 0 0.0099 0.1389 x(1 4)=1 1 %把当前x 数组的第一、四个元素都赋值为1x(1 4)=1 1 x =1.0000 0.3529 0 1.0000
10、 0.1389 %空数组的赋值操作a= a = 2二维数组(1)在命令窗口执行下面指令,观察输出结果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 %这指令用于创建二维数%组CM_r=1,2,3;4,5,6,M_i=11,12,13;14,15,16 %创建复数数组的另一种方法CN=M_r+i*M_i %由实部、虚部数组构成复数数组a=2.7358; b=33/79;C=1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i M_r=1,2,3;4,
11、5,6,M_i=11,12,13;14,15,16 CN=M_r+i*M_i C =1.0000 5.4716 + 0.4177i 0.6909 0.7071 4.8244 3.5000 + 1.0000iM_r =1 2 34 5 6M_i =11 12 1314 15 16CN =1.0000 +11.0000i 2.0000 +12.0000i 3.0000 +13.0000i4.0000 +14.0000i 5.0000 +15.0000i 6.0000 +16.0000i (2)利用M 文件创建和保存下面的数组(分号后面是一个空格后加3 个小数点,表示换行续写)AM=101,102,
12、103,104,105,106,107,108,109;.201,202,203,204,205,206,207,208,209;.301,302,303,304,305,306,307,308,309;AM=101,102,103,104,105,106,107,108,109;.201,202,203,204,205,206,207,208,209;.301,302,303,304,305,306,307,308,309; (3)仿照问题1 中方法找出数组 A 中所有绝对值大于3 的5134204A元素。A=-4,-2,0,2,4;-3,-1,1,3,5;B=A(find(A3)C=A(f
13、ind(A0.5);C=2*B-1;首先预测(C*C)/100 的运行结果,然后再在机器上验证。(本方法提供了产生通信等仿真中常需若干独立的双随机码的方法原型。)rand(state,11)A=rand(3,10000);B=(A0.5);C=2*B-1;(C*C)/100 ans =100.0000 0.8600 -0.48000.8600 100.0000 -0.1800-0.4800 -0.1800 100.0000 (6)在命令窗口执行下面指令,体味数组运算与矩阵运算的区别clear;A=zeros(2,3);A(:)=1:6; %全元素赋值法A=A*(1+i) %运用标量与数组乘产生
14、复数矩阵A_A=A. %数组转置,即非共轭转置,其中单引号实现转置功能A_M=A %矩阵转置,即共轭转置clear;A=zeros(2,3);A(:)=1:6; %全元素赋值法A=A*(1+i) %运用标量与数组乘产生复数矩阵A_A=A. %数组转置,即非共轭转置,其中单引号实现转置功能A_M=A %矩阵转 置,即共轭转置 A =1.0000 + 1.0000i 3.0000 + 3.0000i 5.0000 + 5.0000i2.0000 + 2.0000i 4.0000 + 4.0000i 6.0000 + 6.0000iA_A =1.0000 + 1.0000i 2.0000 + 2.0
15、000i3.0000 + 3.0000i 4.0000 + 4.0000i5.0000 + 5.0000i 6.0000 + 6.0000iA_M =1.0000 - 1.0000i 2.0000 - 2.0000i3.0000 - 3.0000i 4.0000 - 4.0000i5.0000 - 5.0000i 6.0000 - 6.0000i 二编写如图所示波形的MATLAB 脚本文件,图中虚线为正弦波,要求它分别在 及 处削顶。21图1可能用到的额外指令: find、hold on、hold off、 legend,具体使用方法使用help指令名来解答。clc; clear all; c
16、lose all;t = linspace(0, 3*pi);y = sin(t);figure; hold on; box on;plot(t, y, k:);y(find(ysqrt(2)/2) = sqrt(2)/2;plot(t, y, b-);ylabel(z=f(t)xlabel(t)legend(char(y = sin(t),char(z=f(t),location,southeast);hold off;axis(0,10,-1,1)axis square 0 2 4 6 8 10-1-0.8-0.6-0.4-0.200.20.40.60.81z=f(t)ty = sin(t)z=f(t)