740 likes | 1.03k Views
第 2 章 MATLAB 运算基础 (2). 2.4 稀疏数组. 2.4.1 数组元素的存储 数组元素有完全存储方式和稀疏存储方式两种存储方式。. 2.4.2 稀疏数组的建立. 1 转换函数. 转换函数 sparse 的格式为 : A=sparse(S) 功能: 将矩阵 S 转化为稀疏存储方式的矩阵 A 。当矩阵 S 是稀疏存储方式时,则函数调用相当于 A=S 。. sparse(m,n) 功能: 生成一个 m×n 的所有元素都是 0 的稀疏矩阵。. sparse(u,v,S)
E N D
2.4 稀疏数组 2.4.1 数组元素的存储 数组元素有完全存储方式和稀疏存储方式两种存储方式。 MALAB 7.X程序设计
2.4.2稀疏数组的建立 1 转换函数 转换函数sparse的格式为: A=sparse(S) 功能:将矩阵S转化为稀疏存储方式的矩阵A。当矩阵S是稀疏存储方式时,则函数调用相当于A=S。 MALAB 7.X程序设计
sparse(m,n) 功能:生成一个m×n的所有元素都是0的稀疏矩阵。 sparse(u,v,S) 功能:建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵,其中u,v,S是3个等长的向量,S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标。 MALAB 7.X程序设计
转换函数full的格式为: full(A) 功能:返回和稀疏存储矩阵A对应的完全存储方式矩阵。 MALAB 7.X程序设计
例2-28 演示sparse和full的功能。 u=1:4;v=3:6; S=[0.1 0.2 0.3 0.4]; spa=sparse(u,v,S) a=full(spa) MALAB 7.X程序设计
2 生成函数 稀疏矩阵的生成函数: spconvert,spdiags,speye spconvert函数的格式为: B=spconvert(A) 功能:将矩阵A所描述的一个稀疏矩阵转化为一个稀疏存储矩阵B 。 MALAB 7.X程序设计
例2-29演示spconvert的功能。 A=[1 2 3 ;3 4 5;6 7 8]; B=spconvert(A) %生成实数数组 A=[1 2 3 4;3 4 5 6 ;6 7 8 9]; B=spconvert(A) %生成复数数组 MALAB 7.X程序设计
spdiags的格式为: A=spdiags(B,d,m,n) 功能:返回带状稀疏矩阵A。 参数m,n为原带状矩阵的行数与列数。B为r×p阶矩阵,这里r=min(m,n),p为原带状矩阵所有非零对角线的条数,矩阵B的第i列即为原带状矩阵的第i条非零对角线,d为长度为p的向量。 MALAB 7.X程序设计
例2-30演示spdiags的功能。 B=[0.1 0 0;0 0.2 0;0 0 0.3]; m=3;n=4; d=[1 2 ]; A=spdiags(B,d,m,n) MALAB 7.X程序设计
函数eye,rand和 randn产生完全存储方式的矩阵,对应的稀疏矩阵函数是speye,sprand和sprandn。 MALAB 7.X程序设计
例2-31分析下列语句的功能。 spa=speye(4,4) %建立4×4的稀疏存储单位矩阵 spa(2,1)=-2 %增加元素spa(2,1) spa(2,2)=0 %删除元素spa(2,2) MALAB 7.X程序设计
2.5 矩阵和数组的运算 • 矩阵运算规则是按照矩阵作为运算要素定义的, • 数组运算是按照矩阵元素作为运算要素定义的。 • 标量运算是矩阵和数组的运算的特例。 MALAB 7.X程序设计
2.5.1 矩阵和数组的算术运算 1 矩阵和数组的加减运算 • 两个矩阵必须同型时才可以进行加减运算。如有一个是标量,则该标量与矩阵的每个元素进行加减运算。 • 数组的加减运算法则与矩阵的加减运算法则相同。 MALAB 7.X程序设计
例2-32设 求A-2B。 方法1: A=[4 -3 1;2 0 5];B=[1 2 0;-1 0 3]; A-2*B 方法2: A=[4 -3 1;2 0 5];B=[1 2 0;-1 0 3]; b=uminus(2*B) %,返回2*B的相反数 A+b MALAB 7.X程序设计
2 矩阵和数组的乘法运算 矩阵的乘法运算符为*,定义为: 设A=(aij)m×s,B=(bij)s×n,则A与B的乘积 C=AB=(cij)m×n是 m×n矩阵,其中cij( i= 1,2, …, m ;j =1,2, …,n) 等于A的第i行与B的第j列对应元素的乘积之和。 数组的乘法运算符为.*,两个矩阵必须同型时才可以进行数组乘法运算。 运算规则为:矩阵A和B中的对应元素相乘。 如果参加运算的矩阵其中有一个是标量时,矩阵和数组的乘法运算均为标量与矩阵的每个元素进行乘法运算。 MALAB 7.X程序设计
例2-33求乘积 AB 和 BA。 A=[1 0 3;2 1 0]; B=[4 1;-1 1;2 0]; A*B, B*A MALAB 7.X程序设计
例2-34求 (AB)T和BT×AT(T为转置运 算)。 A=[1 -1 2;2 0 1]; B=[2 -1 0;1 1 3;4 2 1]; (A*B)' B'*A' MALAB 7.X程序设计
3 矩阵和数组的除法运算 矩阵除法运算的运算符为\和/,分别表示左除和右除。 矩阵除法的定义为: A\B=A-1×B A/B=A×B-1 其中A-1和B-1是矩阵A和B的逆,矩阵B的逆也可用函数inv求得。 MALAB 7.X程序设计
除法运算的运算符为.\和./,分别数组为数组的左除和右除,表示数组的相应元素相除。两个矩阵必须同型时才可以进行数组除法运算。除法运算的运算符为.\和./,分别数组为数组的左除和右除,表示数组的相应元素相除。两个矩阵必须同型时才可以进行数组除法运算。 定义为: 设A=(aij)m×n,B=(bij)m×n, 则数组的右除为 C=(cij)m×n= (aij/ bij )m×n, 数组的左除为 C=(cij)m×n= (bij/ aij )m×n。 MALAB 7.X程序设计
例2-35求解方程组 A=[2 2 -1 1;4 3 -1 2;8 3 -3 4;3 3 -2 -2]; b=[4 6 12 6]'; X=A\b %等价语句为X=inv(A)*b MALAB 7.X程序设计
2.5.2 矩阵和数组的乘方运算 • 矩阵乘方运算的运算符为∧,运算表达式为A∧B,矩阵乘方运算的含义是:A^B表示方阵A自乘B次。 • 数组乘方运算的运算符为.^,运算表达式为A.^B,其中A和B都可以是矩阵或标量。 MALAB 7.X程序设计
数组乘方运算有下列形式: • 当A为矩阵,B为正整数时,则将aij自乘B次; • 当A为矩阵,B也为矩阵时,A和B矩阵必须同型,则将aij自乘bij次。 • 当A为正整数,B为矩阵时,将A^bij构成新矩阵的第i行第j列元素。 其中aij和bij分别表示矩阵A和B的第i行第j列元素。 MALAB 7.X程序设计
2.5.3矩阵和数组的数学函数 常用的数学函数有三角函数、指数函数和整值函数等。 需要注意的是: • MATLAB 6.5以前的版本三角函数的自变量和反三角函数的返回值为弧度; • MATLAB 7.0版本中提供了三角函数的自变量和反三角函数的返回值分别为角度和弧度的两类函数。 MALAB 7.X程序设计
例2-36求30。、60。和90。的正弦、 余弦、正切和余切函数值。 x=30:30:90; sind(x),cosd(x),tand(x),cotd(x) %三角函数的自变量为角度值 MALAB 7.X程序设计
例2-37 求0.1,0.2,0.3,0.4,0.5,0.6的反正弦、反余弦和反正切值。 x=0.1:0.1:0.6; asin(x),acos(x),atan(x) %返回值为弧度 asind(x),acosd(x),atand(x) %返回值为角度 MALAB 7.X程序设计
例2-38求1到10的自然对数和常用 对数。 x=1:10; log(x) %返回值为自然对数 log10(x) %返回值为常用对数 如果求2为底的对数呢? log10(x)/log10(2) MALAB 7.X程序设计
2.6 字符串 2.6.1字符串的定义 MATLAB将字符串当作一个行向量,每个元素对应一个字符,一个字符占两个字节,并且每一字符(包括空格)以其ASCII码的形式存放,其标识方法和数值向量相同。 MALAB 7.X程序设计
例2-39建立任意的两个字符串,并查看字 符串占用的字节信息。 s1='Northeast Forest Uiversity' %赋值方式建立字符串s1 s2='Haerbin Heilongjiang‘ %赋值方式建立字符串s2 whos %查看字符串占用的字节信息 MALAB 7.X程序设计
常用的字符串函数 • length计算字符串的长度(即组成字符的个数) • class判断某一个变量是否为字符串,返回char则表示为字符串 • findstr寻找在某个长字符串中的子字符串,返回其起始位置 • deblank删除字符串尾部的空格 • eval以表达式方式执行字符串 • disp显示字符串的内容 MALAB 7.X程序设计
2.6.2 字符串的连接和替换 常用的字符串的连接和替换函数: • strcat(S1,S2,S3,...) 功能:返回S1,S2,S3的连接字符串 strvcat(T1,T2,T3,..) 功能:返回T1,T2,T3,..的垂直连接字符串 strmatch(S1,S2) 功能:在逐行搜索字符串s2,给出以s1开头的那些行的行号 strrep(S1,S2,S3) 功能:把字符串s1的所有出现s2的地方替换为s3 strtok (S) 功能:查找字符串S的第一个间隔符(空格符、指表符、回车符)前的内容 MALAB 7.X程序设计
例2-40分析下列语句的执行结果。 test='This is a test!'; position=findstr(test,'is') array=strvcat('maxarray','min value','max value'); result_1=strmatch('max',array) result_2=strrep(test,'test','pest') [token,remainder]=strtok('This is a test!') MALAB 7.X程序设计
2.6.3字符串比较函数 常用的字符串比较函数: • strcmp(S1,S2) 功能:比较字符串是否相等。如果相同则返回1,否则为0。 strcmpi(S1,S2) 功能:在忽略大小写的情况下,比较字符串是否相等。如果相同则返回1,否则为0。 strncmp(S1,S2,N) 功能:比较两个字符串的前n个字符是否相等。如果相同则返回1,否则为0。 strncmpi(S1,S2,N) 功能:在忽略大小写的情况下,比较字符串的前n个字符是否相等。如果相同则返回1,否则为0。 MALAB 7.X程序设计
例2-41分析下列语句的执行结果。 str1='hello'; str2='Hello'; str3='help'; c1=strcmp(str1,str2) c2=strcmpi(str1,str2) c3=strncmp(str1,str3,2) c4=strncmpi(str1,str3,2) MALAB 7.X程序设计
2.6.4字符串转换函数 常用的字符串转换函数: • upper(A) 功能:把字符串A中的任一小写字母转换为相应的大写字母 lower(A) 功能:把字符串A中的任一大写字母转换为相应的小写字母 double(X) 功能:转换字符串X为ASCII码 char(X) 功能:将ASCII码X转换为字符串 MALAB 7.X程序设计
int2str(X) 功能:将整数X转换为字符串 num2str(X) 功能:将数值X转换成字符串 mat2str(MAT) 功能:将数值矩阵MAT转换为可执行的形式 MALAB 7.X程序设计
例2-42分析下列语句的功能。 x=5317;y=int2str(x) p=num2str(pi,7) p=num2str(pi,'%10.5e') a=[1 2 3;4 5 6] ; b=mat2str(a) str=sprintf('The value of pi=%8.6f.',pi) MALAB 7.X程序设计
2.7 元胞数组 2.7.1 元胞数组的建立 • 元胞数组:一个数组里存放各种不同类型的数据。元胞数组中的基本组成是元胞,每一个元胞是用来存放各种不同类型的数据的单元。 • 如果元胞中存放的数据为元胞数组,则为元胞数组的嵌套使用。 MALAB 7.X程序设计
1 赋值语句 赋值语句的右边为用符号{}标记的不同类型的数据。 例2-43建立元胞数组,并查看元素的信息。 a={'This is the first example.', hadamard(2);ones(3),{'North';'East'}} MALAB 7.X程序设计
查看a的各个元素的信息: a{1,1} a{1,2} a{2,1} a{2,2} MALAB 7.X程序设计
例2-44用为各元胞元素赋值的方法创建元 胞数组。 b(1,1)={'This is the second example.'}; b(1,2)={hilb(3)}; b(2,1)={zeros(2)}; b(2,2)={{'South';'West'}}; b % 查看b的内容 MALAB 7.X程序设计
2 由各元胞元素赋值创建 创建元胞数组的函数为: • cell(N)创建空的N×N的元胞数组 • cell(M,N)或 cell ([M,N])创建空的M ×N的元胞数组 MALAB 7.X程序设计
例2-45由各元胞元素赋值创建元胞。 c=cell(2); c{1,1}=('This is the third example.'); c{1,2}=compan([1 0 3]); c{2,1}=[3+4*i -5;-10*i 3-4*i]; c{2,2}=[]; %元胞数组的第四个元素为空矩阵 C % 查看c 的内容 MALAB 7.X程序设计
显示元胞数组的内容的函数: celldisp,cellplot和cellfun: • celldisp(C) 功能:显示元胞数组C的所有元素的内容 cellplot(C) 功能:以嵌套的格子的形式显示元胞数组C的所有元素的结构 d=cellfun(fun, c) 功能:返回判断元胞数组c 的元素数据类型和基本信息的数组d,其中fun为isreal,isempty, islogical,length,ndims和prodofsize。 MALAB 7.X程序设计
2.7.2 转换函数 元胞数组与其他数组的转换函数: cell2mat,mat2cell和num2cell。 • M=cell2mat(C) 功能:元胞数组转换为单精度矩阵,其中C为多维元胞数组,M为转换后得到的单精度矩阵。要求输入的元胞数组元素必须是同类型的数据。 C=mat2cell(X,M,N) 功能:矩阵分解为元胞数组。其中X为多维元胞数组,C为转换后得到的矩阵。 C=num2cell(A) 功能:转换数值数组为元胞数组。其中A为数值数组,C为转换得到的元胞数组。 MALAB 7.X程序设计
例2-46元胞数组与其他数组的转换。 x={[1] [2 3 4];[5; 9] [6 7 8; 10 11 2]}; cell2mat(x) %转换数值数组为单精度矩阵 MALAB 7.X程序设计
X = zeros(3,4)+5;C = mat2cell(X,[1 2],[1 3]) %矩阵分解为元胞数组 A=[1 2 3 4; 5 6 7 8; 9 10 11 12]; C=num2cell(A) %转换数值数组为元胞数组 MALAB 7.X程序设计
2.7.3 元胞数组的使用 1 直接引用 • 元胞数组的元素的引用可通过指出数组名称直接引用。 • 元胞数组中可以引用的元素为元胞数组的结构、元胞数组的内容、元胞数组的部分元素。 MALAB 7.X程序设计
例2-47演示元胞数组的直接引用方法。 a={'This is the forth example.',magic(3);ones(3),{'North';'East'}} a(1,2) % 查看a(1,2)的结构 a{1,2} %查看a{1,2}元胞的内容 a{1,2}(1) %引用a{1,2}元胞的第1个元素 a{1,2}([1 2]) %引用a{1,2}元胞的第1、2个元素 MALAB 7.X程序设计
2 扩展元胞数组 例 2-48演示元胞数组的扩展方法。 a{3,3}=5 %扩展a为3×3的数组,a(3,3)为元胞,内容为5 MALAB 7.X程序设计