4 运算符和表达式 (I)经典教科书上的算术运算符(Arithmetic Operations)在MATLAB中的表达方式,见 表13-2。 表1.3-2 MATLAB表达式的基本运算符 数学表达式 矩阵运算符 数组运算符 加 a+b a+b a+b 减 a-b a-b a-b 乘 axb a*b a.*b 除 a÷b a/b或bIa a./b或bla 幂 ab a^b a.^b 圆括号 () () () 〖说明〗 ● 因为MATLAB面向复数设计,其所有运算定义在复数域上。所以对于方根问题,运算 只返还一个“主解”。要得复数的全部方根,必须专门编写程序(见例13-6)。 ● 因为MATLAB面向矩阵/数组设计,标量被看作(1×1)的矩阵/数组。 ● 数组运算的“乘、除、幂”规则与相应矩阵运算根本不同。前者的算符比后者多一个“小 黑点”。(参见例1.3-9,例1.3-10。更详细说明请看第3章) ● MATLAB用左斜杠或右斜杠分别表示“左除”或“右除”运算。对标量而言,“左除” 和“右除”的作用结果相同。但对矩阵来说,“左除”和“右除”将产生不同的结果。 ● 关于它们的更详细的帮助信息,可在MATLAB帮助浏览器左侧Contents页的 <MATLAB/User Guide/Programming Fundamentals/Basic Program Components/ Operators/Arithmetic Operations>节点找到。 关于它们的帮助信息,也可在MATLAB帮助浏览器左上方的搜索栏中输入Arithmetic Operations,经搜索获得。 (2)MATLAB书写表达式的规则与“手写算式”几乎完全相同。 表达式由变量名、运算符和函数名组成。 ● 表达式将按与常规相同的优先级自左至右执行运算。 ● 优先级的规定是:指数运算级别最高,乘除运算次之,加减运算级别最低。 ● 括号可以改变运算的次序。 ● 书写表达式时,赋值符“=”和运算符两侧允许有空格,以增加可读性。 5 面向复数设计的运算一一MATLAB特点之一 MATLAB的所有运算都是定义在复数域上的。这样设计的好处是:在进行运算时,不 必像其他程序语言那样把实部、虚部分开处理。为描述复数,虚数单位用预定义变量ⅰ或j表 示。 复数z=a+bi=re直角坐标表示和极坐标表示之间转换的MATLAB指令如下。 real(z) 给出复数z的实部a=rcoS0。 imag(z) 给出复数z的虚部b=rsin。 abs(z) 给出复数z的模Va2+b2。 6 angle(z) 以弧度为单位给出复数z的幅角arctan a 【例13-4】复数1=4+31,52=1+2i,2?=26表达,及计算:=12。本例演示:正 23 确的复数输入法:涉及复数表示方式的基本指令。 (1)经典教科书的直角坐标表示法 z1=4+3i 合法,但建议少用或不用 6
6 4 运算符和表达式 (1)经典教科书上的算术运算符(Arithmetic Operations)在 MATLAB 中的表达方式,见 表 1.3-2。 表 1.3-2 MATLAB 表达式的基本运算符 数学表达式 矩阵运算符 数组运算符 加 a b a + b a + b 减 a b a - b a - b 乘 a b a * b a .* b 除 a b a / b 或 b \ a a ./ b 或 b .\ a 幂 b a a ^ b a .^ b 圆括号 ( ) ( ) ( ) 〖说明〗 因为 MATLAB 面向复数设计,其所有运算定义在复数域上。所以对于方根问题,运算 只返还一个“主解”。要得复数的全部方根,必须专门编写程序(见例 1.3-6)。 因为 MATLAB 面向矩阵/数组设计,标量被看作(11) 的矩阵/数组。 数组运算的“乘、除、幂”规则与相应矩阵运算根本不同。前者的算符比后者多一个“小 黑点”。(参见例 1.3-9,例 1.3-10。更详细说明请看第 3 章) MATLAB 用左斜杠或右斜杠分别表示“左除”或“右除”运算。对标量而言,“左除” 和“右除”的作用结果相同。但对矩阵来说,“左除”和“右除”将产生不同的结果。 关于它们的更详细的帮助信息,可在 MATLAB 帮助浏览器左侧 Contents 页的 <MATLAB/ User Guide/ Programming Fundamentals/ Basic Program Components/ Operators/ Arithmetic Operations>节点找到。 关于它们的帮助信息,也可在 MATLAB 帮助浏览器左上方的搜索栏中输入 Arithmetic Operations,经搜索获得。 (2)MATLAB 书写表达式的规则与“手写算式”几乎完全相同。 表达式由变量名、运算符和函数名组成。 表达式将按与常规相同的优先级自左至右执行运算。 优先级的规定是:指数运算级别最高,乘除运算次之,加减运算级别最低。 括号可以改变运算的次序。 书写表达式时,赋值符“=”和运算符两侧允许有空格,以增加可读性。 5 面向复数设计的运算——MATLAB 特点之一 MATLAB 的所有运算都是定义在复数域上的。这样设计的好处是:在进行运算时,不 必像其他程序语言那样把实部、虚部分开处理。为描述复数,虚数单位用预定义变量 i 或 j 表 示。 复数 i z a bi re 直角坐标表示和极坐标表示之间转换的 MATLAB 指令如下。 real(z) 给出复数 z 的实部 a r cos 。 imag(z) 给出复数 z 的虚部 b rsin 。 abs(z) 给出复数 z 的模 2 2 a b 。 angle(z) 以弧度为单位给出复数 z 的幅角 a b arctan 。 【例 1.3-4】复数 i z i z i z e 6 1 4 3 , 2 1 2 , 3 2 表达,及计算 3 1 2 z z z z 。本例演示:正 确的复数输入法;涉及复数表示方式的基本指令。 (1)经典教科书的直角坐标表示法 z1= 4 + 3i %合法,但建议少用或不用
z1= 4+ 3i 〖说明】 ·本书建议读者不要使用这种输入格式。因为这种书写格式,只适用于“数值标量”复数, 而不适用于“数值矩阵” ● 在这种书写格式中,4i是一个完整的虚数,在4和i之间不许“空格”存在。 (2)采用运算符构成的直角坐标表示法和极坐标表示法 z2=1+2★1 运算符构成的直角坐标表示法 z3=2*exp (i*pi/6) 运算符构成的极坐标表示法 z=z1*z2/z3 z2= 1+ 2i z3= 1.7321+ li 2= 1.884+ 5.2631i (3)复数的实虚部、模和幅角计算 real z=real(z) image z=imag(z) magnitude z=abs (z) angle_z_radian=angle(z) %弧度单位 angle_z_degree=angle(z)*180/pi 号度数单位 real_z 1.884 image_z= 5.2631 magnitude z 5.5902 angle z radian 1.2271 angle_z_degree= 70.305 【例1.3-5】图示复数21=4+3i,z)=1+2i的和(配图1.3-2)。本例演示:MATLAB的运 算在复数域上进行;指令后“分号”的作用:复数加法的几何意义:展示MATLAB的可视 化能力(让读者感受,但不要求理解)。 z1=4+3*i:z2=1+2*i: 号在一个物理行中,允许输入多条指令。 号但各指令间要用“分号”或“逗号”分开。 指令后采用“分号”,使运算结果不显示。 z12=z1+z2 号以下用于绘图 clf,hold on 号c1£清空图形窗。逗号用来分隔两个指令。 plot ([0,z1,z12],'-b','Linewidth',3) plot([0,z12],'-r','Linewidth',3) plot ([z1,z12],'ob','Markersize',8) hold off,grid on, axis equal axis([0,6,0,6]) text(3.5,2.3,'z11) text(5,4.5,'z2') text(2.5,3.5,'z12') xlabel('real') ylabel('image') z12= 5.0000+5.00001
7 z1 = 4 + 3i 〖说明〗 本书建议读者不要使用这种输入格式。因为这种书写格式,只适用于“数值标量”复数, 而不适用于“数值矩阵”。 在这种书写格式中,4i 是一个完整的虚数,在 4 和 i 之间不许“空格”存在。 (2)采用运算符构成的直角坐标表示法和极坐标表示法 z2 = 1 + 2 * i %运算符构成的直角坐标表示法 z3=2*exp(i*pi/6) %运算符构成的极坐标表示法 z=z1*z2/z3 z2 = 1 + 2i z3 = 1.7321 + 1i z = 1.884 + 5.2631i (3)复数的实虚部、模和幅角计算 real_z=real(z) image_z=imag(z) magnitude_z=abs(z) angle_z_radian=angle(z) %弧度单位 angle_z_degree=angle(z)*180/pi %度数单位 real_z = 1.884 image_z = 5.2631 magnitude_z = 5.5902 angle_z_radian = 1.2271 angle_z_degree = 70.305 【例 1.3-5】图示复数 z 4 3i,z 1 2i 1 2 的和(配图 1.3-2)。本例演示:MATLAB 的运 算在复数域上进行;指令后“分号”的作用;复数加法的几何意义;展示 MATLAB 的可视 化能力(让读者感受,但不要求理解)。 z1=4+3*i;z2=1+2*i; %在一个物理行中,允许输入多条指令。 %但各指令间要用“分号”或“逗号”分开。 %指令后采用“分号”,使运算结果不显示。 z12=z1+z2 %以下用于绘图 clf,hold on %clf 清空图形窗。逗号用来分隔两个指令。 plot([0,z1,z12],'-b','LineWidth',3) plot([0,z12],'-r','LineWidth',3) plot([z1,z12],'ob','MarkerSize',8) hold off,grid on, axis equal axis([0,6,0,6]) text(3.5,2.3,'z1') text(5,4.5,'z2') text(2.5,3.5,'z12') xlabel('real') ylabel('image') z12 = 5.0000 + 5.0000i
Z12 real 图1.3-2两个复数相加 【例1.3-6】用MATLAB计算-8能得到-2吗(配图1.3-3)?本例演示:MATLAB运 算定义在复数域的实质:指令后“分号”抑制运算结果的显示:MATLAB的方根运算规则: 更复杂指令的表示方式:展现MATLAB的图形表现力。(对于本例指令,读者能有体验就 可,不必强求理解。) (1)直接计算时,得到处于第一象限的方根。 a=-8; x_a=a^(1/3) 号求3次根 r a 1.0000+1.73211 (2)√-8的全部方根计算如下 号先构造一个多项式p()=r3-a p=[1,0,0,-a】;p是多项式p(r)的系数向量 号指令末尾的“英文状态分号”使该指令运行后,不显示结果。 R=roots (p) 求多项式的根 R= -2.0000 1.0000+1.7321i 1.0000-1.73211 (3)图形表示 MR=abs (R(1)); 号计算复根的模 t=0:pi/20:2*pi: 产生参变量在0到2*pi间的一组采样点 x=MR*sin (t); y=MR*cos (t); plot(x,y,'b:'),grid on 号画一个半径为R的圆 号注意“英文状态逗号”在不同位置的作用 hold on plot (R(2),'.','Markersize',30,'Color','r') 号画第一象限的方根 p1ot(R([1,3]),'o','MarkerSize',15,'Color','b')号画另两个方根
8 0 1 2 3 4 5 6 0 1 2 3 4 5 6 z1 z2 z12 real image 图 1.3-2 两个复数相加 【例 1.3-6】 用 MATLAB 计算3 8 能得到 –2 吗(配图 1.3-3)?本例演示:MATLAB 运 算定义在复数域的实质;指令后“分号”抑制运算结果的显示;MATLAB 的方根运算规则; 更复杂指令的表示方式;展现 MATLAB 的图形表现力。(对于本例指令,读者能有体验就 可,不必强求理解。) (1)直接计算时,得到处于第一象限的方根。 a=-8; r_a=a^(1/3) %求 3 次根 r_a = 1.0000 + 1.7321i (2)3 8 的全部方根计算如下 % 先构造一个多项式 p r r a 3 ( ) p=[1,0,0,-a]; %p 是多项式 p(r)的系数向量 %指令末尾的“英文状态分号”使该指令运行后,不显示结果。 R=roots(p) %求多项式的根 R = -2.0000 1.0000 + 1.7321i 1.0000 - 1.7321i (3)图形表示 MR=abs(R(1)); %计算复根的模 t=0:pi/20:2*pi; %产生参变量在 0 到 2*pi 间的一组采样点 x=MR*sin(t); y=MR*cos(t); plot(x,y,'b:'),grid on %画一个半径为 R 的圆 %注意“英文状态逗号”在不同位置的作用 hold on plot(R(2),'.','MarkerSize',30,'Color','r') %画第一象限的方根 plot(R([1,3]),'o','MarkerSize',15,'Color','b') %画另两个方根
axis([-3,3,-3,3]),axis square 名保证屏幕显示呈真圆 hold off 图1.3-3(-8)的全部三次方根分布 〖说明】 ●本例有助于理解MATLAB的计算特点。 ●对复数进行方根运算时,MATLAB只给出处于“第一象限”的那个根。 6 面向数组设计的运算一一MATLAB特点之二 在MATLAB中,标量数据被看作(1×I)的数组(Aray)数据。所有的数据都被存放在 适当大小的数组中。为加快计算速度(运算的向量化处理),MATLAB对以数组形式存储 的数据设计了两种基本运算:一种是所谓的数组运算:另一种是所谓的矩阵运算。在此仅以 算例展示MATLAB的计算特点,更详细的叙述请见第3章。 「13 【例1.3-7】实数数组AR= 的“一行”输入法。本例演示:二维数组的最基本、最 24 常用输入法:二维数组输入的三大要素。 (1)在键盘上输入下列内容 AR=[1,3;2,4] (2)按[Enter]键,指令被执行。 (3)在指令执行后,MATLAB指令窗中将显示以下结果: AR 3 2 4 〖说明】 在MATLAB中,不必事先对数组维数及大小做任何说明,内存将自动配置。 二维数组输入的三大要素:数组标识符“[]”:元素分隔符空格或逗号“,”:数组行间分 隔符分号“,”或“回车键”。注意:所有标点符号都是“英文状态的符号”。 MATLAB对字母大小写是敏感的。比如本例中的数组赋给了变量AR,而不是Ar,aR,或 9
9 axis([-3,3,-3,3]),axis square %保证屏幕显示呈真圆 hold off -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 图 1.3-3 (-8)的全部三次方根分布 〖说明〗 本例有助于理解 MATLAB 的计算特点。 对复数进行方根运算时,MATLAB 只给出处于“第一象限”的那个根。 6 面向数组设计的运算——MATLAB 特点之二 在 MATLAB 中,标量数据被看作(11) 的数组(Array)数据。所有的数据都被存放在 适当大小的数组中。为加快计算速度(运算的向量化处理),MATLAB 对以数组形式存储 的数据设计了两种基本运算:一种是所谓的数组运算;另一种是所谓的矩阵运算。在此仅以 算例展示 MATLAB 的计算特点,更详细的叙述请见第 3 章。 【例 1.3-7】实数数组 2 4 1 3 AR 的“一行”输入法。本例演示:二维数组的最基本、最 常用输入法;二维数组输入的三大要素。 (1)在键盘上输入下列内容 AR= [1,3;2,4] (2)按 [Enter] 键,指令被执行。 (3)在指令执行后,MATLAB 指令窗中将显示以下结果: AR = 1 3 2 4 〖说明〗 在 MATLAB 中,不必事先对数组维数及大小做任何说明,内存将自动配置。 二维数组输入的三大要素:数组标识符“[ ]”;元素分隔符空格或逗号“,”;数组行间分 隔符分号“;”或“回车键”。注意:所有标点符号都是“英文状态的符号”。 MATLAB 对字母大小写是敏感的。比如本例中的数组赋给了变量 AR,而不是 Ar, aR, 或 ar
在全部键入一个指令行内容后,必须按下[Enter]键,该指令才会被执行。请读者务必记住 此点。出于叙述简明的考虑,本书此后将不再重复提及此操作。 7 【例1.3-8】实数数组AI= 的“分行”输入法。 68 AI=[5,7 6,8] AI 5 7 6 8 〖说明】 本例采用这种输入法是为了视觉习惯。当然,对于较大的数组也可采用此法。 ● 在这种输入方法中,“回车”符用来分隔数组中的行。 [1-5i3-7i 【例1.3-9】对复数数组A= 进行求实部、虚部、模和幅角的运算。本例演 2-6i4-8i 示:复数数组的生成:MATLAB指令对数组元素“并行操作”的实质。 (1)创建复数数组 AR=[1,3;2,4]:AI=[5,7:6,8]; A=AR-AI*i %形成复数矩阵 A= 1.0000-5.0000i 3.0000-7.0000i 2.0000-6.0000i 4.0000-8.0000i (2)求复数数组的实部和虚部 A real=real(A) A image=imag (A) A real 1 3 2 4 A_image -5 -7 -6 -8 (3)求复数数组中各元素的模和幅角一一循环法(笨拙!) for m=1:2 for n=1:2 Am1 (m,n)=abs (A (m,n)); Aa1(m,n)=angle(a(m,n))*180/pi;号以度为单位计算幅角 end end Aml,Aal Am1 5.0990 7.6158 6.3246 8.9443 Aal -78.6901 -66.8014 -71.5651 -63.4349 (4)求复数数组中各元素的模和幅角一一直接法 Am2=abs (A) Aa2=angle(A)*180/pi Am2 5.0990 7.6158 6.3246 8.9443 9
10 在全部键入一个指令行内容后,必须按下 [Enter] 键,该指令才会被执行。请读者务必记住 此点。出于叙述简明的考虑,本书此后将不再重复提及此操作。 【例 1.3-8】实数数组 6 8 5 7 AI 的“分行”输入法。 AI=[5,7 6,8] AI = 5 7 6 8 〖说明〗 本例采用这种输入法是为了视觉习惯。当然,对于较大的数组也可采用此法。 在这种输入方法中,“回车”符用来分隔数组中的行。 【例 1.3-9】对复数数组 i i i i 2 6 4 8 1 5 3 7 A 进行求实部、虚部、模和幅角的运算。本例演 示:复数数组的生成;MATLAB 指令对数组元素“并行操作”的实质。 (1)创建复数数组 AR=[1,3;2,4];AI=[5,7;6,8]; A=AR-AI*i %形成复数矩阵 A = 1.0000 - 5.0000i 3.0000 - 7.0000i 2.0000 - 6.0000i 4.0000 - 8.0000i (2)求复数数组的实部和虚部 A_real=real(A) A_image=imag(A) A_real = 1 3 2 4 A_image = -5 -7 -6 -8 (3)求复数数组中各元素的模和幅角——循环法(笨拙!) for m=1:2 for n=1:2 Am1(m,n)=abs(A(m,n)); Aa1(m,n)=angle(A(m,n))*180/pi; %以度为单位计算幅角 end end Am1,Aa1 Am1 = 5.0990 7.6158 6.3246 8.9443 Aa1 = -78.6901 -66.8014 -71.5651 -63.4349 (4)求复数数组中各元素的模和幅角——直接法 Am2=abs(A) Aa2=angle(A)*180/pi Am2 = 5.0990 7.6158 6.3246 8.9443