MATLAB 字符串与矩阵的学习
专题一:
MATLAB操作环境:
当前文件夹的设置:1,试图设置,2,命令格式设置(>>cd e:\work)
MARLAB的搜索路径:
先判断此命令是不是个变量,然后判断是不是内部函数,再判断是不是程序文件(程序文件的搜索顺序是>>当前文件夹下的程序文件--> >>文件搜索路径文件夹中的程序文件)
如何设置文件搜索路径:
1,用path命令设置文件搜索路径 >>path(path,’e:\work’)
2,用对话框设置文件搜索路径,在主页的工具框下有一个设置路径的选择。
MATLAB数值数据:
实数,浮点型,复型
>>class()函数求变量的类型
针对于复型:>>real函数:求复数的实部 imag函数:求复数的虚部
数值数据的输出格式:format的命令格式: format 格式符
format只影响输出格式不影响存储和计算
常用函数的应用:
sin是以弧度为单位的函数
sind 是以角度为单位的函数
abs函数可以求实数的绝对值,复数的模,字符串的ASCII码值
用于取整的函数有:fix,floor,ceil,round
round函数按照四舍五入的规则取整
ceil函数是向上取整,取大于等于这个数的第一个整数
floor 函数是向下取整
fix函数是固定取靠近0的那个整数,即舍去小数取整数
求余数的函数rem函数或者是mod函数
Isprime(n)判断是否为素数
>>x=1:100;
>>k=isprime(x); --k的值为0或1,是素数返回1,不是素数返回0
>>p=find(k); --查找是1的位置,即1所对应的下标
>> k1=x(p); --输出所有的素数
内存变量文件:
Save: 创建内存变量文件
Load: 装入内存变量文件
矩阵的表示:
矩阵的建立:直接输入法:将矩阵的元素用中括号括起来,按矩阵的顺序输入各元素,同一行的各元素用逗号或空格分割,不同行的元素之间用分号分割。
利用已建好的矩阵建立更大的矩阵:一个大矩阵可以由已经建好的小矩阵拼接而成。
冒号表达式:
格式:e1:e2:e3 e1初始值,e2步长,e3终止值
linspace函数: linspace(a,b,n) a是向量的第一个元素,b是向量的最后一个元素,n是生成元素的个数,默认为100个。
结构矩阵:格式:结构矩阵元素.成员名=表达式
单元矩阵: 单元矩阵的元素用大括号括起来
>>b={10,’liu’,[11,21;34,78];12,’wang’,[34,191;27,578]}
矩阵元素的引用:通过下标来引用: A(4,5)代表第四行第五列
通过序号来引用:在MATLAB中,矩阵的元素是按照列存储的。矩阵元素的序号就是矩阵元素在内存中的排列顺序。A(3)代表第三个元素。
矩阵的序号与下标可以利用sub2ind和 ind2sub函数实现相互转换
Sub2ind函数:将矩阵中指定的行,列下标转换成存储的序号。 调用格式:D=sub2ind(s,i,j) s表示要转换的矩阵的行数和列数,是由行数和列数组成的向量,通常用size函数获取。i是要转换矩阵元素的行下标;j是转换矩阵元素的列下表。
例: >> A=[1:2;4:6];
>>D=sub2ind(size(A),[1,2;2,2],[1,1;3,2])
D= 1 2
6 4
(1,1)位置上的元素在矩阵中的序号是1
(2,1)位置上的元素在矩阵中的序号是2
(2,3)位置上的元素在矩阵中的序号是6
(2,2)位置上的元素在矩阵中的序号是4
Ind2sub函数:把矩阵元素的序号换成对应的下标,调用格式:[i,j]=ind2sub(S,D)
s表示要转换的矩阵的行数和列数,是由行数和列数组成的有两个元素的向量,D是序号;函数返回值是序号所对应元素的行下标和列下表。
例: >>[i,j]=ind2sub([3,3],[1,3,5]) ---[3,3]代表是一个3行3列的矩阵
I=1 3 2 ---[1 3 5]代表要求矩阵中第1个,第3个,第5个元素的下标
J=1 1 2
可以看出结果是:(1,1),(3,1),(2,2);
利用冒号表达式获得子矩阵:
单个冒号来作为行下标或列下标就代表全部行或全部列
A(i,:) 表示第i行的全部元素
A(:,J) 表示第j列的全部元素
A(i:i+m,k:k+m) 表示第i~i+m行内且k~k+m列中的所有元素
A(i:i+m,:) 表示第i~i+m行的全部元素
end运算符:表示某一维的末尾元素下标
>>A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20]
>>A(end,:) --引用矩阵A的最后一行元素
Ans=16 17 18 19 20
>>A([1 4],3:end)--表示用第一行第四行从第3列到最后一列的元素
Ans= 3 4 5
18 19 20
如何删除矩阵的元素:利用空矩阵删除矩阵的元素 (X代表一个空矩阵 X=[])
改变矩阵的形状: reshape(A,m,n)函数:在矩阵元素保持不变的前提下,将矩阵A重新排列成m×n的二维矩阵。只改变原矩阵的行数和列数,但并不改变矩阵元素的个数及其存储顺序。
A(:):将矩阵A的每一列元素堆叠起来,成为一个列向量。等价于reshape(A,n,1) n代表矩阵元素的个数。
MATLAB基本运算:(算术,关系,逻辑运算)
算术运算:加减运算,同型矩阵才能相加减
一个标量也可以和矩阵进行加减运算,这时把标量和矩阵的每一个元素进行加减运算
除法运算:如果A矩阵时非奇异方阵,则B/A<-->B*inv(A) A/B<-->inv(A)*B
对于矩阵左除和右除表示两种不同的除数矩阵和被除数数矩阵的关系,但是当含有标量时左除和右除一样的。例:a=[10.5,25] a/5=2.1000 5.0000 5/a=2.1000 5.0000
点运算:两矩阵进行点运算是指他们的对应元素进行相关运算,要求两矩阵同型。
例:>>A=[1 2 3;4 5 6;7 8 9];
>>B=[-1,0,1;1,-1,0;0,1,1];
>>C=A.*B= -1 0 3
- -5 0
- 8 9
>>D=A*B= 1 1 4
- 1 10
1 1 16
字符串处理:
当字符串中的字符含有单引号时,则该单引号字符要用两个单引号来表示
- 将字符串倒过来重新排列
>> revch=ch(end:-1:1)--步长为-1
- 将字符串中的小写字母变成相应的大写字母,单其余字符不变
>>k=find(ch>=’a’&&ch<=’z’) ---k是小写字母的坐标
>>ch(k)=ch(k)-(‘a’-’A’)
- 统计字符串中小写字母的个数(k是2中的结果)
>>length(k)
字符串的执行:格式:evals(s)
例:>>t=pi; >>m=’[t,sin(t),cos(t)]’; y=evals(m) y=3.1416 0.0000 -1.0000
字符串与数值之间的转换
abs和double函数都可以用来获取字符串矩阵对应的ASCll码数值矩阵
char 函数可以把ASCll码矩阵转换为字符串矩阵
字符串的比较
- 利用关系运算符进行比较
- 利用函数
strcmp(s1,s2) 用来比较字符串s1,s2是否相等,相等返回1,否则返回0
strncmp(s1,s2,n)用来比较两个字符串前n个字符是否相等,相等返回1,否则返回0
Strcmpi(s1,s2)在忽略字母大小写的前提下,比较字符串s1,s2是否相等,相等返回1,否则返回0
Strncmpi(s1,s2,n)在忽略字母大小写的前提下,用来比较两个字符串前n个字符是否相等,相等返回1,否则返回0
字符串的查找与替换
Findstr(s1,s2):返回短字符串在长字符串中的开始位置
Strrep(s1,s2,s3):将字符串s1中的所有子字符串s2替换为字符串s3
专题二:
特殊矩阵:
zeros函数:产生全0矩阵,即零矩阵。
ones函数:产生全1矩阵,即幺矩阵。
eye函数:产生对角线为1的矩阵。当矩阵是方阵时,得到一个单位矩阵。
rand函数:产生(0,1)区间均匀分布的随机矩阵。
randn函数:产生均值为0,方差为1的均值正态分布随机矩阵。
函数的调用格式都相同;这里以zeros函数为例。
zeros(m):产生m*m的零矩阵。
zeros(m,n):产生m*n的零矩阵。
zeros(size(A)):产生与矩阵A同样大小的零矩阵
产生5阶两位随机整数矩阵A:
fix(10+(99-10+1)*rand(5));
rand函数:产生(0,1)开区间均匀分布的随机数x
fix(a+(b-a+1)*x):产生[a,b]区间上均匀分布的随机整数。
产生均值为0.6,方差为0.1的5阶正态二分部随机矩阵
0.6+sqrt(0.1)*randn(5)
randn函数:产生均值为0,方差为1的标准正态分布随机数x
a+b*x:得到均值为a,方差为b*b的随机数。
魔方矩阵:
n阶魔方阵由1,2,3,…,n2共n 2个整数组成,且每行、每列以及 主、副对角线上各n个元素之和都相等。
n阶魔方阵每行每列元素的和为(1+2+3+…+ n2)/n=(n+n3)/2
n>2时有很多不同的n阶魔方阵,MATLAB函数magic(n)产生一个 特定的魔方阵。
范德蒙矩阵:
范得蒙矩阵的最后一列全为1,即向量v各元素的零次方,倒数第二列为指定的向量v, 即向量v各元素的一次方,其他各列是其后列与倒数第二列的点乘积。
函数vander(v)生成以V为基础的范德蒙矩阵。
例:>>A=vander(1:5) V=[1 2 3 4 5];
希尔伯特矩阵:
矩阵的一般形式为:
- 1/2 ... 1/n
H = 1/2 1/3 ... 1/(n+1)
| | \ |
1/n 1/(n+1)... 1/(2*n-1)
希尔伯特矩阵的元素为H(i,j)=1/(i+j-1)。
伴随矩阵:
MATLAB生成的伴随矩阵的函数是compan(p),其中p是一个多项式的系数向量,告辞幂系数拍在前,低次幂系数排在后面。
帕斯卡矩阵:
根据二项式定理,(x+y)的n次方展开后的系数随着n的增大组成一个三角形表,这个 三角形称为杨辉三角形。
把二项式系数依次填写在矩阵的左侧对角线上,然后提取左侧的n行n列元素 即为n阶帕斯卡(Pascal)矩阵。
帕斯卡矩阵的第一行元素和第一列元素都为1,其余位置的元素是该元素的左边 元素与上面元素相加,即P(i,j)=P(i,j-1)+P(i-1,j),且P(i,1)=1,P(1,j)=1
函数pascal(n)生成一个n阶帕斯卡矩阵。
矩阵变换:
对角矩阵:只有对角线上有非零元素的矩阵。
数量矩阵:对角线上的元素相等的对角矩阵。
单位矩阵:对角线上的元素都为1的对角矩阵。
对角阵:
提取矩阵的对角元素:
diag(A):提取矩阵A主对角线元素,产生一个列向量。
diag(A,k):提取矩阵A第k条对角线的元素,产生一个列向量。
矩阵的对角线:与主对角线平行,往上为第1条、第2条、一直到第n条对角线,往下为第-1条、-2条、一直到-n条对角线,主对角线为第0条对角线。
构造对角阵:
diag(V):以向量V为主对角线元素,产生对角矩阵。
diag(V,k):以向量 V为第k条对角线元素,产生对角矩阵。
例:先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,…, 第五行乘以5。
>>A=[7,0,1,0,5;3,5,7,4,1;4,0,3,0,2;1,1,9,2,3;1,8,5,2,9];
>> D=diag(1:5); 对角线为[1 2 3 4 5]的矩阵
>> D*A
三角阵:
上三角阵:矩阵的对角线以下的元素全为零的矩阵。
下三角阵:对角线以上的元素全为零的矩阵。
上三角矩阵:
triu(A):提取矩阵A的主对角线及以上的元素。
triu(A,k):提取矩阵A的第k条对角线及以上的元素。
下三角矩阵:
在MATLAB中,提取矩阵A的下三角矩阵的函数是tril,其用法与triu函数完全相同。
矩阵的转置:
转置运算符是小数点后面接单引号(.')。
共轭转置,其运算符是单引号('),它在转置的基础上还要取每个数的复共轭。
如果矩阵的元素是实数,那么转置和 共轭转置的结果是一样的。
例:
>> A=[1,3;3+4i,1-2i]
A = 1.0000 + 0.0000i 3.0000 + 0.0000i
3.0000 + 4.0000i 1.0000 - 2.0000i
>> A.'
ans = 1.0000 + 0.0000i 3.0000 + 4.0000i
3.0000 + 0.0000i 1.0000 - 2.0000i
>> A'
ans = 1.0000 + 0.0000i 3.0000 - 4.0000i
3.0000 + 0.0000i 1.0000 + 2.0000i
矩阵的旋转:
rot90(A,k):将矩阵A逆时针方向旋转90º的k倍,当k为1时可省略。
矩阵的翻转:
对矩阵实施左右翻转是将原矩阵的第一列和最后一列调换,第二列和倒数第 二列调换,…,依此类推。
fliplr(A):对矩阵A实施左右翻转
flipud(A):对矩阵A实施上下翻转。
矩阵的求逆:
对于一个方阵A,如果存在一个与其同阶的方阵B,使得AB=BA=I (I为单位 矩阵),则称B为A的逆矩阵,当然,A也是B的逆矩阵。 p
inv(A):求方阵A的逆矩阵。
矩阵求值:
det(A):求方阵A所对应的行列式的值。
rank(A):求矩阵A的秩。(矩阵线性无关的行数或列数称为矩阵的秩)
矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。
trace(A):求矩阵A的迹。
向量和矩阵的范数:
矩阵或向量的范数用来度量矩阵或向量在某种意义下的长度。
向量的3种常用范数:
向量1—范数:向量元素的绝对值之和。
向量2—范数:向量元素绝对值的平方和的平方根
向量∞—范数:所有向量元素绝对值中的最大值。
求向量范数的函数为:
norm(V)或norm(V,2):计算向量V的2—范数
norm(V,1):计算向量V的1—范数
norm(V,inf):计算向量V的无穷范数。
矩阵的范数:
矩阵A的1—范数:所有矩阵列元素绝对值之和的最大值。
矩阵A的2—范数:A'A矩阵的最大特征值的平方根。
矩阵A的∞—范数:所有矩阵行元素绝对值之和的最大值。
MATLAB提供了求3种矩阵范数的函数,其函数调用格式与求向 量的范数的函数完全相同。
矩阵的条件:
矩阵A的条件数等于A的范数与A的逆矩阵的范数的乘积。
条件数越接近于1,矩阵的性能越好,反之,矩阵的性能越差。
计算矩阵A的3种条件数的函数是:
cond(A,1):计算A的1—范数下的条件数。
cond(A)或cond(A,2):计算A的2—范数数下的条件数。
cond(A,inf):计算A的∞—范数下的条件数。
矩阵的特征值与特征向量:
特征值的定义:设A是N阶方阵,如果存在常数x和n维非零列向量B,使得等式A*B=x*B成立,则称x为A的特征值,B是对应特征值x的特征向量。
在MATLAB中,计算矩阵的特征值和特征向量的函数是eig,常用的调用格式
有两种: E=eig(A):求矩阵A的全部特征值,构成向量E。
[X,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并产生矩阵X,X
各列是相应的特征向量
例:>>A=[1 1 0;1 0 5;1 10 2];
[x,d]=eig(A)
X= 0.0722 0.9751 0.0886
0.5234 -0.0750 -0.6356
0.8490 -0.2089 0.7669
D= 8.2493 0 0
0 0.9231 0
0 0 -6.1723
D(1,1)位置上的特征值对应的特征向量为X矩阵的第一列
D(2,2)位置上的特征值对应的特征向量为X矩阵的第二列....
矩阵*特征值==特征值*特征向量<-->A*X(:,1)=D(1)*X(:,1)
即矩阵乘以特征向量的第一列==第一个特征值*第一列的特征向量
eigshow函数:可以演示单位圆上的向量x和Ax之间的关系。
稀疏矩阵:
完全存储和稀疏存储方式。完全存储就是所有的元素都存在一个n*n的二维表中,稀疏存储方式是把非零元素的坐标和非零值存储起来。
A=spares(S):将矩阵S转化为稀疏存储方式的矩阵A;
S=full(A):将矩阵A转化为完全存储方式的矩阵S
如何直接建立稀疏存储矩阵:
spares函数的其他调用格式:
spares(m,n):生成m*n的所有元素都是0的稀疏矩阵。
spares(u,v,S):其中u,v,S是3个等长的向量。S是要建立的系数矩阵的非零元素,u(i),v(i)分别是S(i)的行和列的下标。
例:A=spares([1 2 2],[2 1 4],[4 5 -7])
A= (1,2) 4
(2 1) 5
(2,4) -7
使用spconvert函数直接建立稀疏矩阵,其调用格式为B=spconvert(A)
其中,A为一个m×3或m×4的矩阵,其每行表示一个非零元素,m是非零元素的个数。
l A(i,1)表示第i个非零元素所在的行。
l A(i,2)表示第i个非零元素所在的列。
l A(i,3)表示第i个非零元素值的实部。
l A(i,4)表示第i个非零元素值的虚部。
若矩阵的全部元素都是实数,则无须第4列。
例:>> A=[2,2,1;2,1,-1;2,4,3]
A =
2 2 1
2 1 -1
2 4 3
>> B=spconvert(A)
B =
(2,1) -1
(2,2) 1
(2,4) 3
带状稀疏矩阵的稀疏存储 :
p 稀疏矩阵有两种基本类型:无规则结构的稀疏矩阵与有规则结构的稀
疏矩阵。
p 带状稀疏矩阵就是一种十分典型的具有规则结构的稀疏矩阵,它是指
所有非零元素集中在对角线上的矩阵。
[B,d]=spdiags(A):从带状稀疏矩阵A中提取全部非零对角线元素赋给矩阵B
及其这些非零对角线的位置向量d。
A=spdiags(B,d,m,n):产生带状稀疏矩阵的稀疏存储矩阵A,其中m、n为原
带状稀疏矩阵的行数与列数,矩阵B的第i列即为原带状稀疏矩阵的第i条非
零对角线,向量d为原带状稀疏矩阵所有非零对角线的位置
>> A =[11,0,0,12,0,0;0,21,0,0,22,0;0,0,31,0,0,32;41,0,0,42,0,0;0,51,0,0,52,0]
其中d代表的是第几条对角线。
用spdiags函数产生带状稀疏矩阵的稀疏存储A:
A=spdiags(B,d,m,n)
其中,m、n为原带状矩阵的行数与列数。B为r×p矩阵,这里r=min(m,n),p为
原带状矩阵所有非零对角线的条数,矩阵B的第i列即为原带状矩阵的第i条非零
对角线。取值方法是:若非零对角线上元素个数等于r,则取全部元素;若非零
对角线上元素个数小于r,则应该用零补足到r个元素。补零的原则是:若m<n
(行数<列数),则d<0时(主对角线以下)在前面补0,d>0时(主对角线以上)
在后面补0;当m≥n(行数≥列数),则d<0时在后面补0;d>0时在前面补0。
利用带状稀疏矩阵非零对角线元素组成的矩阵B,以及对角线位置组成的
向量d,命令执行后产生一个稀疏存储矩阵A。
>> A=spdiags(B,d,5,6)
A =
(1,1) 11
(4,1) 41
(2,2) 21
(5,2) 51
(3,3) 31
(1,4) 12
(4,4) 42
(2,5) 22
(5,5) 52
(3,6) 32