实验二数值数组创建、应用及可视化[实验目的]1.掌握二维数组的创建、寻访,区分数组运算与矩阵运算的区别。2.掌握标准数组生成函数和数组构造技法。3.进一步熟悉M脚本文件编写的方法和技巧。[实验原理]数值数组和数组运算MATALB核心内容,是MATLAB最重要的一种内建数据类型。通常,数组是由一组实数或复数排成的长方阵列(Array),它可以是一维的“行”或“列”,可以是二维的“矩形”,也可是三维的若同维矩形的堆叠,甚至是更高的任意维。而数组运算是指无论在数组上施加什么运算(加减乘除或函数),总认定那种运算对被运算数组中的每个元素(Element)平等地时实施同样的操作。这使得计算程序简单、易读,使程序指令更接近教科书上的数学计算公式,并提高了程序的向量化程度,提高计算效率,节省计算机开销。一维数组的创建可采用逐个元素输入法,这是最简单,但又最通用的构造方法,如:x=[2pi/2sqrt(3)3+5i];另外有规律的产生数组可以采用冒号生成法,通用格式是x=a:inc:b,a是数组的第一个元素,inc是采样点之间的步长。若(b-a)是inc的整数倍,则生成数组的最后一个元素是b,否则小于b。或者采用定数线性采样法,该法是在设定“总点数”下,均匀采样生成一维“行”数组。格式为x=linspace(a,b,n),a、b分别是生成数组的第一个各最后一个元素,n是采样总点数,该指令生成(1×n)数组。二维数组是由实数或复数排列成矩形而构成的。从数据结构上看,矩形和二维数组没有什么区别。当二维数组带有线性变换含义时,该二维数组就是矩阵。二维数组的创建也可采用直接输入法,或者利用构造M文件创建和保存数组。除此以外,还可以采用MATLAB提供的标准函数生成我们需要的数组,诸如zeros、ones、rand、eye、diag、magic等,详请见附录。一维数组元素的寻访和标识采用X(index)方法,只是要注意MATLAB中第一个元素下标index是1,而不是C语言中的0。二维数组元素的标识和寻访可分为“全下标”标识和“单下标”标识,“全下标”标识,即指出是“第几行,第几列”的元素,如A(3,5)表示二维数组A的第三行第五列元素。该标识法的优点是几何概念清楚,引述简单,在MATLAB的寻址和赋值中最为常用。“单下标”标识,顾名思义就是只用一个下标来指明元素在数组中的位置,首先对二维数组的所有元素进行“一维编号”。“一维编号”是指:先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列”,然后自上往下对元素未知进行编号,其优点是简洁、方便,特别是如果碰到对二维数组进行诸如for循环操作时可以减少循环次数,提高编程效率。“全下标”标识和“单下标”标识可以通过sub2ind和ind2sub注意:此题为本人自做,非标准答案,仅供参考。指令进行转换,详见帮助。另外,不论二维数组还是一维数组还可以采用“逻辑1”标识,这种方法常用于寻找数组中所有大于或小于某值的元素的问题中。比如X(abs(X)3)可以找出数组X中所有绝对值大于3的元素。另外还可以借助ones,zeros,rand,randn和cat,repmat,reshape等函数直接或间接构作高维数组,详见附录或MATLAB帮助。Matlab中的许多函数可以直接对任意维的数组直接运算,相当于对数组中的每个元素分别进行运算。比如Y=sin(X)可以直接得到与数组X中每一个元素相对应的的正弦值,这大大简化了编程。可以执行数组运算的常用函数已经列表于附录中,以供参考。但值得注意的是,虽然从外观形状和数据结构上看,二维数组和(数学中的)矩阵)没有区别,但矩阵作为一种变换或映射算子的体现,矩阵运算有着明确而严格的数学规则。数组运算是MATLAB软件所定义的规则,其目的是为了数据管理方便、操作简单、指令形式自然和执行计算的有效。为了区别数组和矩阵运算,在易混淆的地方,数组运算在运算符前加一小黑点“.”以示区别,比如Y=A.*B,代表的示数组A和数组B对应元素相乘,而Y=A*B,则表示内维相同的矩阵A和B的乘积。由此也可看出,在执行数组与数组的运算时,参与运算的数组必须同维,运算所得结果也总与原数组同维。本节只涉及数组可视化方法的简单实现。通常,对于离散数据可采用stem命令或者使用plot绘点的方法,而对于连续函数可直接采用plot指令来实现。[实验内容]一.数组的创建和寻访1.一维数组在命令窗口执行下面指令,观察输出结果,体味数组创建和寻访方法,%号后面的为注释,不用输入。rand('state',0)%把均匀分布伪随机发生器置为0状态rand('state',0)x=rand(1,5)%产生(1×5)的均布随机数组x=rand(1,5)x=0.05790.35290.81320.00990.1389x(3)%寻访数组x的第三个元素。a=x(3)a=0.8132x([125])%寻访数组x的第一、二、五个元素组成的子数组。b=x([125])b=0.05790.35290.1389x(1:3)%寻访前三个元素组成的子数组c=x(1:3)c=0.05790.35290.8132x(3:end)%寻访除前2个元素外的全部其他元素。end是最后一个元素的下标。d=x(3:end)d=0.81320.00990.1389x(3:-1:1)%由前三个元素倒排构成的子数组f=x(3:-1:1)f=0.81320.35290.0579x(find(x0.5))%由大于0.5的元素构成的子数组g=x(find(x0.5))g=0.8132x([12344321])%对元素可以重复寻访,使所得数组长度允许大于原数组。h=x([12344321])h=Columns1through60.05790.35290.81320.00990.00990.8132Columns7through80.35290.0579x(3)=0%把上例中的第三个元素重新赋值为0x(3)=0x=0.05790.352900.00990.1389x([14])=[11]%把当前x数组的第一、四个元素都赋值为1x([14])=[11]x=1.00000.352901.00000.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,5,6],M_i=[11,12,13;14,15,16]CN=M_r+i*M_iC=1.00005.4716+0.4177i0.69090.70714.82443.5000+1.0000iM_r=123456M_i=111213141516CN=1.0000+11.0000i2.0000+12.0000i3.0000+13.0000i4.0000+14.0000i5.0000+15.0000i6.0000+16.0000i(2)利用M文件创建和保存下面的数组(分号后面是一个空格后加3个小数点,表示换行续写)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];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中方法找出数组5311342024AA中所有绝对值大于3的元素。A=[-4,-2,0,2,4;-3,-1,1,3,5];B=A(find(A3))C=A(find(A-3))B=45C=-4(4)在命令窗口执行下面指令,体会二维数组的子数组寻访和赋值A=zeros(2,4)%创建(2×4)的全零数组A(:)=1:8%全元素赋值方式s=[235];%产生单下标数组行数组A(s)%由“单下标行数组”寻访产生A元素组成的行数组Sa=[102030]’%Sa是长度为3的“列数组”A(s)=Sa%单下标方式赋值A(:,[23])=ones(2)%双下标赋值方式:把A的第2、3列元素全赋为1A=zeros(2,4)%创建(2×4)的全零数组A(:)=1:8%全元素赋值方式s=[235];%产生单下标数组行数组A(s)%由“单下标行数组”寻访产生A元素组成的行数组Sa=[102030]'%Sa是长度为3的“列数组”A(s)=Sa%单下标方式赋值A(:,[23])=ones(2)%双下标赋值方式:把A的第2、3列元素全赋为1A=00000000A=13572468ans=235Sa=102030A=12030710468A=111710118(5)运行指令rand(‘state’,11),A=rand(3,10000);B=(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')/100ans=100.00000.8600-0.48000.8600100.0000-0.1800-0.4800-0.1800100.0000(6)在命令窗口执行下面指令,体味数组运算与矩阵运算的区别clear;A=zeros(2,3);A(:)=1:6;%全元素赋值法A=A*(1+i)%运用标量与数组乘产生复数矩阵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.0000i3.0000+3.0000i5.0000+5.0000i2.0000+2.0000i4.0000+4.0000i6.0000+6.0000iA_A=1.0000+1.0000i2.0000+2.0000i3.0000+3.0000i4.0000+4.0000i5.0000+5.0000i6.0000+6.0000iA_M=1.0000-1.0000i2.0000-2.0000i3.0000-3.0000i4.0000-4.0000i5.0000-5.0000i6.0000-6.0000i二.编写如图所示波形的MATLAB脚本文件,图中虚线为正弦波,要求它分别在21及22处削顶。图1可能用到的额外指令:find、holdon、holdoff、legend,具体使用方法使用help+指令名来解答。clc;clearall;closeall;t=linspace(0,3*pi);y=sin(t);figure;holdon;boxon;plot(t,y,'k:');y(find(y-1/2))=-1/2;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