1、1,第三章 数值数组及向量化运算,2,3.1 数值计算的特点和地位,符号运算优点:可以对包含变量字符、参数字符和数字的表达式进行推理、运算,并给出符号结果,与高校教科书中的解析表达式接近。,不足:有很多问题无法解,有些问题求解时间过长,现代主流计算机都只能表示、保存、运算和输出有限精度的数字,处理离散的信息。数值计算正好适应了现代计算机的这种特点,它计算速度快,能处理各种复杂的函数关系。但数值计算是以有限精度数字为基本操作元素,只能用有限长度的数据,以有限的精度表现有限时间和范围内的函数关系。,3,例 3.1-1 已知,求,(1) 符号计算解法,syms t; ft=exp(sin(t); s
2、x=int(ft, t, 0, 4),Warning: Explicit integral could not be found. sx = int(exp(sin(t),t = 0 4),(2) 数值计算解法,delt=0.01; x=0:delt:4; y=exp(-sin(x); sx=delt*cumtrapz(y); plot(x,y, r, LineWidth, 6); hold on; plot(x, sx, .b, MarkerSize, 15); plot(x, ones(size(x), k);,4,3.2 引导,数值数组(Numeric Array)和数组运算(Array
3、 Operations)是matlat的核心内容.,数组:一组实数或复数排成的长方阵列. 可以是一维的行或列,二维的矩形, 也可以是三维的若干同维矩形的堆叠,甚至更高维.,数组运算:无论在数组上施加什么运算(加减乘除或函数),总认为那种运算对被运算数组中的每个元素平等地实施同样的操作,matlab 设计数组和数组运算的目的:,1) 使程序简单易读,使程序指令更接近教科书上的数学计算公式.,2) 提高程序的向量化程度, 提高计算效率, 节省计算机开销,数组运算符: .opr+, -, .* , ./ , . , . , fun,5,3.3 一维数组的创建和寻访,1. 一维数组的创建:,(1) 逐
4、个元素输入法:,如:array=2, pi/2, sqrt(3), 3+5i,使用场合及特点,使用场合: 数据元素比较少并都已知.如对少量实验数据的处理可用此种方法.,x=1,2,3,4,5,行向量,列向量,6,(2) 冒号生成法:,array=a: inc: b a-数组的第一个元素 inc-采样点之间的间隔, 即步长. 最后一个元素不一定等于b,其大小为b=a +inc*(b-a)/inc; 步长可以省略, 默认为1; inc可以取正数或负数, 但要注意当取正时,要保证ba, 数组最后一个元素不超过b, 取负时ba, 最后一个元素不小于b.,特点: 等差数列,方便对数据之间的间隔(步长)进
5、行控制.但要注意三个数值之间的关系,可能得到空数组另外要注意生成的数组的元素的个数如x=a: (b-a)/n :b (ba)得到n+1个元素的数组.,a,b,inc0,a,b,inc0,7,x=1:5x=1,2,3,4,5 y=5:-1:1y=5, 4, 3, 2, 1 Z=1:2:7z=1,3,5,7 u=1:2:8u=1,3,5,7,x=31 , 32 , 33 , 34 , 35 ,36 , 37 , 38, 39,输出一个等比数列:,a=1:1:9; x=3.a,8,A=1: -1 :9 A=Empty matrix: 1-by-0 B=9: 1 : 1B =Empty matrix:
6、 1-by-0 B=1: 2 :8B=1, 3, 5, 7 C=8: -2 :1C=8, 6, 4, 2,9,(3) 定数线性采样法,在设定的总点数下, 均匀采样生成一维行数组格式为:x=linspace (a, b, n),a-数组初始值,b-数组最后值,n-数组总个数,特点:方便对数组的元素的总个数进行控制,最后一个元素肯定是设定之值三个参数之间不必满足一定条件,增量的计算-inc=(b-a)/(n-1),等效于: x=a: (b-a)/(n-1) :b,10,2. 一维数组的子数组寻访和赋值,x=1 2 3 4 5;x(3)x(1 2 3), x(1 2 3)x(1:3)=x(1,2,3
7、) % 1:3=1,2,3x(3:end) % end表示最后一个下标x(3:-1:1)x( find (x2) ) x(1 2 3 4 5 5 4 3 2 1),注意: 数组的第一个元素为x(1), 与C语言中第一个元素为x0不同,11,3.4二维数组的创建,二维数组是由实数或复数排列成矩形而构成的.从数据结构上看,矩阵和二维数组没区别.当二维数组带有线性变换含义时,该二维数组就是矩阵,2. 利用文件创建和保存数组,1.直接输入法:对于较小数组,从键盘直接输入最简便.二维数组必须有以下三个要素:1) 整个输入数组必须以方括号“”为其首尾;2) 数组的行与行之间必须用分号或回车键隔离;3) 数
8、组元素必须有逗号或空格分隔,12,例3.1 用直接输入法创建数组,a=pi, b=5; array=1, 2*pi, 2+3i ; sqrt(b), sin(pi/4)+i, 6;,例3.2 利用文件创建和保存数组,1. 编写M文件并运行 AM=100,101,102;103,104,105;106,107,108,保存为文件名MyMatrix .m,2. 在命令窗中输入MyMatrix,13,3.5 二维数组的标识 (mxn, m1, n1),2) 单下标标识,数组名(行下标m, 列下标n)-数组的第m行n列的元素.,A=1,2,3; 4,5,6 A(2,3),只用一个下标来指定元素在数组中
9、的位置将数组中所有的元素按照从上到下(列), 从左到右的方法从开始编号, 其编号就是单下标,1) 全下标标识,| 1 2 3 | A= | 4 5 6 | 7 8 9 |,A(:)按单下标方式列出全部元素 A(:)=1,4,7,2,5,8,3,6,9,14,4) 全下标与单下标间的转换函数 sub2ind-全下标单下标 ind2sub-单下标全下标,3) 单下标与全下标之间的转换 对数组A (m, n)来说,若元素A (r, c)与A (s)是同一元素,则有: s=m*(c-1)+r,5) 逻辑1标示,A=1,2,3,4,5; TRUE=10; FALSE=01; L=TRUE, FALSE,
10、 TRUE, FALSE, TRUE A(L)=1,3,5,15,3.6 二维数组的子数组寻访和赋值,1) 寻访某一个元素,array (r, c)-数组中的第r行c列的元素,array (r,:)-数组的第r行全部元素 array (:,c)-数组的第c列的全部元素 array (r1,r2,:)-数组的第r1,r2行的全部元素,array (x)-按单下标寻访数组,从第一个元素按列数第x个元素,2) 寻访某一列或一行的元素,3) 单下标寻访,4) 寻访全部元素,array (:,:), array(:),16,A=1,2,3;4,5,6;7,8,9; A(2,3)=6 A(3)=7 A(:
11、,:)=1,2,3;4,5,6;7,8,9; A(:)=1,4,7,2,5,8,3,6,9 A(1,3,5)=1,7,5,A= 1, 2, 34, 5, 67, 8, 9,例3.6.1二维数组的寻访,x(2,:) = x(2,:) + 1,17,3.7 执行数组运算的常用函数,函数数组运算规则的定义,| x11 x12 x1n | x21 x22 x2n | 对于(m x n)数组X | | =xij m x n| | | xm1 xm2 xmn | 函数f(.)的数组运算规则是指:f(X)=f(xij)m x n 也就是对数组中每个元素都实施同样的操作,例2.1 x=30, 45, 60;
12、90, 105, 120, 计算sin( pi/180*x ),18,常用函数:,三角函数和双曲函数,19,指数函数,复数函数,20,坐标变换函数,圆整函数与求余函数,21,3.8 数组运算与矩阵运算,数组运算是指每个对应元素之间的运算,比如对应元素相加,相减,相乘,相除等,而矩阵运算则服从线性代数中的矩阵运算规则 数组运算符是 .opr, opr为运算符,可以是 , *, /, , 矩阵运算则没有在操作符左边加., matlab中矩阵的运算是按照线性代数中的定义进行的 数组运算函数:sqrt, exp, log. 矩阵运算函数:sqrtm, expm, logm,22,数组(矩阵)的点乘和乘
13、法的区别,乘法: 是矩阵相乘, 必须满足矩阵相乘的定义, 即只有Amxn*Bnxk才有意义, 行向量和行向量之间不能相乘,点乘: 是数组对应元素间的乘法,必须满足相乘的两个数组的维数完全相同,如Amxn.*Bmxn,例 将函数y=xsinx在区间0,2离散化,x=0: 2*pi/100: 2*pi; y=x.*sin(x);,x= 0, 2*pi/100, 2*2*pi/100 , 2*pi,sin(x)=sin(0), sin(2*pi/100), sin(2*2*pi/100) , sin(2*pi) ,23,例2.2 a=1,2,3;4,5,6;7,8,9, b=2,4,6;8,10,1
14、2;14,16,18, 计算a + b, a.*b, a*b, sqrt(a), sqrtm(a),+,-相同位置的元素相加,减 .*相同位置的元素相乘 *矩阵相乘, 满足矩阵相乘的条件 .点幂, 数组(矩阵)中每个元素进行幂运算 矩阵的运算,24,3.9 标准数组生成函数和数组操作函数,1) 标准数组生成函数,例2.3 diag, eye, zeros, ones 的演示,eye(3), eye(2,3), zeros(3), zeros(2,3), ones(3), ones(2,3) a=1,2,3;4,5,6;7,8,9, x=1:1:9; diag(a), diag(x),25,2)
15、 数组操作函数,26,矩阵的常用操作,(1) 转置,共轭转置-A, z 共轭-conj (A) 转置-conj (A)-复数=A.,(2) + - * / ,A=1,2,3;,4,5,6; 7,8,9; C=2,4,6; 8,10,12;14,16,18 b=12; 15; 20 z=1+i, 2+3i, 5; 2, 3i, 4+i; 4+3i, 5, i,(3) tril, triu, reshape,a=1,2,3;4,5,6;7,8,9, x=1:1:9; tril(a), triu(a); reshape(x,3,3),27,数组的组合:,x1=1,2,3; x2=4,5,6; x3=
16、7,8,9; a=x1,x2,x3, b=x1;x2;x3 y1=x1, y2=x2, y3=x3 c=y1,y2,y3, d=y1;y2;y3,a=1 2 3 4 5 6 7 8 9,b= 1 2 34 5 67 8 9,c= 1 4 72 5 83 6 9,d=a,增加列,要保证行数相等 ;增加行,要保证列数相等,28,3) 矩阵分析,29,例 解多元一次方程,x + 3y + z =15 已知: 2x + y + 3z =20 求 x, y, z之值x + y =4,1) 将方程化为矩阵与矢量相乘的形式:AX=b,写出,解题步骤:,2) 判断方程组是否有解计算矩阵和其增广矩阵的,3)如果
17、有解,则解为:X=A-1*b =A(-1)*b=inv (A)*b或 X=Ab,A,b,秩 r (A), r (A | b),A=1,3,1; 2,1,3; 1,1,0;,b=15,20,4;,rank(A); rank(A,b);,30,3.11 非数和空数组,按IEEE规定, 0/0, /, 0*等运算都会产生非数, 在matlab 中记为nan. 它具有以下性质:,1) nan参与运算所得结果也是nan,即具有传递性,2) 非数没有大小概念,因此不能比较两个非数的大小,功能: 真实记述0/0, / , 0* 运算的后果; 避免可能因以上运算而造成的程序执行的中断;在数据可视化中,用来裁减
18、图形,31,例2.11-1 非数的产生和性质演示,(1) 非数的产生,a=0/0, b=0*log(0), c=inf - inf,(2) 非数的传递性,0*a, sin (a);,(3) 非数的属性判断,class (a), isnan (a),isnan-唯一能正确判断非数的指令,32,3.11.2 空数组,空数组的功能:,在没有空数组参与运算时,计算结果中的空可以合理地解释所得结果的含义(如在某数组中寻找满足一定条件的数据,结果没有,得到空数组,表示没有满足条件的元素);运用空数组对其他非空数组赋值,可以改变数组的大小,但不能改变数组的维数,空数组的创建,array1= ; array2
19、=zeros(2,0); array3=1:-5;a=1,2,3; array4=find (a0),空数组的判断,isempty(array1),33,3.12 关系操作和逻辑操作,matlab 的约定,1) 在所有关系表达式和逻辑表达式中,作为输入的任何非0数都被看作逻辑真,只有0才被认为是逻辑假.,2) 所有关系表达式和逻辑表达式的计算结果,即输出,是一个由0和作成的逻辑数组. 其中表示真, 0表示假.,3) 逻辑数组是一种特殊的,它表示着对事物的判断结论“真”与”假“,34,关系操作,说明: 1) 标量可以与任何维数的数组进行比较,比较在此标量和数组 每个元素之间进行,因此比较结果为与
20、被比数组同维的数组. 2) 数组进行比较时,两数组必须是同维的, 结果也得到一个同维的数组,35,| 2, 4, 6 | | 1, 3, 5 | A=| 3, 5, 7 | B= | 4, 6, 8 | 1, 8, 9 | | 2, 7, 9 |1, 1, 1| |0, 0, 1| AB= |0, 0, 0| A5= |0, 0, 1|0, 1, 0| |0, 1, 1|,find(A5)=6,7,8,9 % 得到数组下标,单下标 A(find(A5)=8,6,7,9,36,例3.12-1 求近似极限,修补图形缺口sin (t)/t t-2,2,t=-2*pi : pi/10 : 2*pi;
21、y=sin(t)./t; %除还是点除 tt=t+(t=0)*eps ; % 处理分母为的点 yy=sin(tt)./tt; subplot(1,2,1),plot(t,y); axis(-7,7,-0.5,1.2); xlabel(t),ylabel(y),title(残缺图形); subplot(1,2,2),plot(tt,yy); axis(-7,7,-0.5,1.2); xlabel (t), ylabel(yy), title(完整图形),37,38,逻辑操作,说明:,1) 标量可以与任何维的数组运算.逻辑运算在标量与数组每个元素间进行, 因此运算结果是与参与运算的数组维数相同的数
22、组.,2) 数组之间也可以进行逻辑运算,参与运算的必须维数相同.此时运算在两数组同位置上的元素之间进行.因此运算结果是与参与运算的数组维数相同的数组,39,关系,逻辑函数,1) 特殊数据判断指令,40,2) 数据类型判断指令,41,例3.12-1 正弦函数y=sint (t0,3 ) 的半波整流.,0, pi, 2pi, 3pi,t2pi, z=sin(t)*1 否则 z=sin(t)*0,42,t=linspace(0, 3*pi, 500); y=sin (t); z=( (t2*pi) ) .*y; subplot(1,2,1),plot(t,y),ylabel(y); subplot(1,2,2),plot(t,z),axis(0 10 -1 1);,x=1, 2, 3, 4, 5, 6, 7, 8, 9 y=x6y=1, 1, 1, 0, 0, 0, 1, 1, 1 z=x.*y=1, 2, 3, 0, 0, 0, 7, 8, 9,z=y.*(y0);,