1、1第 2 章 MATLAB 数值计算MATLAB 的数学计算数值计算符号计算其中符号计算是指使用未定义的符号变量进行运算,而数值计算不允许使用未定义的变量。2.1 变量和数据2.1.1 数据类型数据类型包括:数值型、字符串型、元胞型、结构型等数值型双精度型、单精度型和整数类整数类无符号类(uint8、uint16、uint32、uint64)和符号类整数(int8、int16、int32、int64)。2.1.2 数据1. 数据的表达方式 可以用带小数点的形式直接表示 用科学计数法2 数值的表示范围是 10-30910 309。以下都是合法的数据表示:-2、5.67、2.56e-56(表示 2
2、.5610-56)、4.68e204(表示 4.6810204)2. 矩阵和数组的概念在 MATLAB 的运算中,经常要使用标量、向量、矩阵和数组,这几个名称的定义如下: 标量:是指 11 的矩阵,即为只含一个数的矩阵。 向量:是指 1n 或 n1 的矩阵,即只有一行或者一列的矩阵。 矩阵:是一个矩形的数组,即二维数组,其中向量和标量都是矩阵的特例,00 矩阵为空矩阵()。 数组:是指 n 维的数组,为矩阵的延伸,其中矩阵和向量都是数组的特例。3. 复数 复数由实部和虚部组成,MATLAB 用特殊变量“i” 和“j”表示虚数的单位。复数运算不需要特殊处理,可以直接进行。3复数可以有几种表示:z
3、=a+b*i 或 z=a+b*jz=a+bi 或 z=a+bj(当 b 为标量时)z=r*exp(i*theta)可以用函数 real, image,abs,angle 得出一个复数的实部、虚部、幅值和相角。a=real(z) %计算实部b=imag(z) %计算虚部r=abs(z) %计算幅值theta=angle(z) %计算相角说明:复数 z 的实部 a=r*cos();复数 z 的虚部 b=r*sin();复数 z 的幅值 ;2bar复数 z 的相角 theta=arctg(b/a),以弧度为单位。Exa: 在命令窗口中输入复数 a=1-2ia=1-2*i a =1.0000 - 2.
4、0000i real(a) ans =41 imag(a) ans =-2 abs(a) ans =2.2361 angle(a)*180/pi %以角度为单位计算相角ans =-63.4349 2.1.3 变量1. 变量的命名规则 变量名区分字母的大小写。例如, “a”和“ A”是不同的变量。 变量名不能超过 63 个字符,第 63 个字符后的字符被忽略,对于 MATLAB6.5 版以前的变量名不能超过 31 个字符。 变量名必须以字母开头,变量名的组成可以是任意字母、数字或者下划线,但不能含有空5格和标点符号(如, 。%等)。例如, “6ABC”、 “AB%C”都是不合法的变量名。 关键字
5、(如 if、while 等)不能作为变量名。2. 特殊变量MATLAB 有一些自己的特殊变量,当 MATLAB 启动时驻留在内存。表 2.1 特殊变量表特殊变量 取值ans 运算结果的默认变量名pi 圆周率 eps 计算机的最小数flops 浮点运算数inf 无穷大,如 1/0NaN 或 nan 非数,如 0/0、 /、 0i 或 j i=j=nargin 函数的输入变量数目nargout 函数的输出变量数目realmin 最小的可用正实数realmax 最大的可用正实数6在 MATLAB 中系统将计算的结果自动赋给名为“ans”的变量。例如:在命令窗口输入计算 22*pi ans =6.28
6、32 2.2 矩阵和数组MATLAB 最基本也是最重要的功能就是进行实数或复数矩阵的运算。2.2.1 矩阵输入在 MATLAB 中矩阵的表示应遵守以下原则:(1) 矩阵元素应用方括号()括住;(2) 每行内的元素间用逗号或空格隔开;(3) 行与行之间用分号或回车键隔开;(4) 元素可以是数值或表达式。1. 通过显式元素列表输入矩阵c=1 2;3 4;5 3*2 % 表示构成矩阵,分号分隔行 ,空格分隔元素c =71 23 45 6 也可以: c=1,2;3,4;5,6 %逗号分隔元素也可用回车键代替分号分隔行: c=1 23 45 6 1 23 45 6 2. 通过语句生成矩阵(1) 使用 f
7、rom:step:to 方式生成向量语法:from:tofrom:step:to8说明:from、step 和 to 分别表示开始值、步长和结束值。当 step 省略时则默认为 step=1;当 step 省略或 step0 而 fromto 时为空矩阵,当 step1 %得出逻辑向量 b b =0 1 01 1 01 1 1 a(b) %按单下标顺序排成长列 ans =352469 3. 矩阵的赋值19矩阵的赋值有三种方式:全下标方式、单下标方式、全元素方式。 全下标方式:a(i,j)=b,给 a 矩阵的部分元素赋值则 b 矩阵的行列数必须等于 a 矩阵的行列数。clear a a(1:2,
8、1:3)=1 1 1;1 1 1 %给第一、二行元素赋值为全 1a =1 1 11 1 1 单下标方式:a(s)=b,b 为向量,元素个数必须等于 a 矩阵的元素个数。a(5:6)=2 3 %给第 5、6 元素赋值a =1 1 21 1 3 全元素方式:a(:)=b,给 a 矩阵的所有元素赋值则 b 矩阵的元素总数必须等于 a 矩阵的元素总数,但行列数不一定相等。20a=1 2;3 4;5 6 a =1 23 45 6 b=1 2 3;4 5 6 b =1 2 34 5 6 a(:)=b %按单下标方式给 a 赋值a =1 54 32 6 4. 矩阵元素的删除删除操作就是简单地将其赋值为空矩阵
9、(用表示)。a=1 2 0;3 4 0;5 6 9 a =1 2 03 4 05 6 9 21a(:,3)= %删除一列元素a =1 23 45 6 a(1)= %删除一个元素,则矩阵变为行向量a =3 5 2 4 6 a= %删除所有元素为空矩阵a = 5. 生成大矩阵在 MATLAB 中,可以通过方括号“” 实现将小矩阵联接起来生成一个较大的矩阵。a=1 2 0;3 4 0;5 6 9 a =1 2 03 4 05 6 9 a;a %联接成 63 的矩阵ans =221 2 03 4 05 6 91 2 03 4 05 6 9 a=1 2 0;3 4 0;5 6 9 a a %联接成 36
10、 的矩阵ans =1 2 0 1 2 03 4 0 3 4 05 6 9 5 6 9 a=1 2 0;3 4 0;5 6 9 a(1:2,1:2) 10*a(1:2,2:3) %计算并联接ans =1 2 20 03 4 40 0 6. 矩阵的翻转可通过强大的矩阵翻转函数对矩阵进行翻转a =231 2 03 4 05 6 9表 2.3 常用矩阵翻转函数例子函数名 功能 输入 结果triu(X) 产生 X矩阵的上三角矩阵,其余元素补 0。triu(a) ans =1 2 00 4 00 0 9 tril(X) 产生 X矩阵的下三角矩阵,其余元素补 0。tril(a) ans =1 0 03 4
11、05 6 9 flipud(X) 使矩阵X 沿水平flipud(a) ans =5 6 24轴上下翻转93 4 01 2 0 fliplr(X) 使矩阵X 沿垂直轴左右翻转fliplr(a) ans =0 2 10 4 39 6 5 flipdim(X,dim) 使矩阵X 沿特定轴翻转。dim=1,按行维翻转;dim=2,按列维翻转。flipdim(a,1) ans =5 6 93 4 01 2 0 rot90(X) 使矩阵X 逆时针旋转 900rot90(a) ans =0 0 9252 4 61 3 5 2.2.3 字符串在 MATLAB 中,字符串是作为字符数组来引入的;一个字符串由多个
12、字符组成,用单引号来界定;字符串是按行向量进行存储的,每一字符(包括空格)是以其 ASCII 码的形式存放。clear str1=Hello str1 =Hello str2=I like MATLAB %重复单引号来输入含有单引号的字符串str2 =I like MATLAB str3=你好! %支持中文26str3 =你好! 1. 字符串占用的字节在存储字符串时,每一个字符占 2byte,可以用whos 来查看所占的存储空间whos Name Size Bytes Classstr1 1x5 10 char arraystr2 1x15 30 char arraystr3 1x3 6 ch
13、ar arrayGrand total is 23 elements using 46 bytes 2. 字符串函数字符串可以用以下函数来运算: length:用来计算字符串的长度(即组成字符的个数)。 double:用来查看字符串的 ASCII 码储存内容,包括空格(ASCII 码为 32)。 char:用来将 ASCII 码转换成字符串形式。 class 或 ischar:用来判断某一个变量是27否为字符串。class 函数返回 char 则表示为字符串,而 ischar 函数返回 1 表示为字符串。 strcmp(x,y):比较字符串 x 和 y 的内容是否相同。返回值如果为 1 则相同
14、,为 0 则不同。 findstr(x,x1):寻找在某个长字符串 x中的子字符串 x1,返回其起始位置。 deblank(x ):删除字符串尾部的空格。由于 MATLAB 将字符串以其相对应的 ASCII 码储存成一个行向量,因此如果字符串直接进行数值运算,则其结果就变成一般数值向量的运算,而不再是字符串的运算。例:使用字符串函数和进行字符串数值运算 str1=Hello str1 =Hellolength(str1) %字符串长度ans =5 28x1=double(str1) %查看字符串的 ASCII 码x1 =72 101 108 108 111 x2=str1+1 %字符串的数值运
15、算x2 =73 102 109 109 112 char(x1) %将 ASCII 码转换成字符串形式ans =Hello char(x2) ans =Ifmmp class(str1) %判断变量类型 ans =char class(x1) ans =double ischar(str1) ans =1 293. 使用一个变量来储存多个字符串(1) 多个字符串组成一个新的行向量将多个字符串变量直接用“,”连接,构成一个行向量,就可以得到一个新字符串变量。clear str1=Hello; str2=I like MATLAB; str3=你好! str4=str1,! ,str2 %多个字符
16、串并排成一个行向量str4 =Hello! I like MATLAB (2) 使用二维字符数组将每个字符串放在一行,多个字符串可以构成一个二维字符数组,但必须先在短字符串结尾补上空格符,以确保每个字符串(即每一行)的长度一样。否则 MATLAB 会提示出错:str5=str1;str3 ? Error using = vertcat30All rows in the bracketed expression must have the same number of columns. 如果将短字符补上空格就不会出错str5=str1;str3, %将 str3 添加两个空格str5 =Hello你好! (3) 使用 str2mat、strvcat 和 char 函数使用专门的 str2mat、strvcat 和 char 函数可以构造出字符串矩阵,而不必考虑每行的字符数是否相等,总是按最长的设置,不足的末尾用空格补齐。str1=Hello;str2=I like MATLAB ;str3=你好! ;