一、MATLAB基础知识
1.1 MATLAB系统环境
命令行窗口:
- \>\> 为命令提示符,在其后输入命令
… 为续行符,可以在下一行继续输入
当前文件夹:
- CD命令选择工作文件夹
导航栏直接输入选择
工作区:
- 保存变量
可以直接编辑
搜索路径(优先级):
- 变量
- 内部函数
程序文件
- 当前文件夹下的程序文件
文件搜索路径文件夹中的程序文件
>> clear >> x=sin(1) x = 0.8415 >> sin=[1,2,3,4,5] sin = 1 2 3 4 5 >> x=sin(1) x = 1
不要定义与matlab库重复的函数
设置文件搜索路径:
用path命令设置文件搜索路径:
>> path(path,'e:\work')
- 用对话框设置文件搜索路径、或右键选中文件夹添加到搜索路径
1.2 MATLAB数值数据
数值数据类型的分类
整型(8种)
无符号整数:
uint8(x)函数,将数值数据转换为无符号8位整数,超过位数范围则只显示最大值- 无符号8位整数:数据范围:00000000\~11111111(0\~2^8^-1)
- 无符号16位整数
- 无符号32位整数
- 无符号64位整数
带符号整数:
int8(x)函数,将数值数据转换为带符号8位整数,超过位数范围则只显示最大值- 带符号8位整数:数据范围:10000000\~11111111(-2^7^\~2^7^-1)
- 带符号16位整数
- 带符号32位整数
- 带符号64位整数
浮点型(2种)
- 单精度型:
single(x)函数,将其他类型的数据转换为单精度型
内存中占用4个字节 双精度型:==matlab默认类型==
double(x)函数,将其他类型的数据转换为双精度型
内存中占用8个字节>> class(4) //调用class函数 ans = double >> class(single(4)) //调用single函数转换为单精度 ans = single
- 单精度型:
复数型
复型数据包括实部和虚部两个部分,实部和虚部默认为双精度型,虚数单位用i 或j 来表示。(6+5i与6+5j为同一个数)- 实部:
real(x)函数,求复数的实部 虚部:
imag(x)函数,求复数的虚部数值数据的输出格式
- 实部:
format命令:format 格式符
>> format long >> 50/3 ans = 16.666666666666668 >>format >> 50/3 ans = 16.6667
【注】format命令只影响输出格式,而不影响数据的计算和存储
常用数学函数
函数的调用格式:==函数名(函数自变量的值)==
- 函数的自变量规定为矩阵变量,也可以是标量(标量本身是矩阵的一种特例)
函数在运算时是将函数逐项作用于矩阵的每个元素上,所以最后运算的结果就是一个与自变量同型的矩阵
>> A=[4,2;3,6] A = 4 2 3 6 >> B=exp(A) //调用exp函数求自然指数 B = 54.5982 7.3891 20.0855 403.4288
常用函数的应用
三角函数sin(x)
有以弧度为单位的函数和以角度为单位的函数,如果是以角度为单位的函数,就在函数名后面加“d”,以示区别- sin(x):输入弧度,pi
sind(x):输入角度,90°、180°
>> sin(pi/2) ans = 1 >> sind(90) ans = 1
abs(x)函数
- 求实数的绝对值
- 复数的模
字符串的ASCii码值
>> abs(-4) ans = 4 >> abs(3+4i) ans = 5 >> abs('a') ans = 97
取整函数
- round(x):四舍五入
- ceil(x):向上取整(向右),取大于等于这个数的第一个整数
- floor(x):向下取整(向左),取小于等于这个数的第一个整数
fix(x):舍去小数(向零),固定取靠近0的那个整数
>> round(4.7) ans = 5 >> ceil(-3.8) ans = -3 >> floor(3.6) ans = 3 >> fix(-3.2) ans = -3
函数应用举例:
求一个三为正整数的个位、十位、百位
rem(a,b)取余函数:取a除以b的余数- 个位:三位正整数除以10的余数
- 十位:三为正整数除以10取整去掉个位,再将所得再除以10取余,得到新个位,也就是原数的十位
百位:三为正整数除以100后取整去掉十位个位,得到百位
>> m=345 >> m1=rem(m,10) m1 = 5 >> m2=rem(fix(m/10),10) m2 = 4 >> m3=fix(m/100) m3 = 3
求[1,100]区间的所有素数
isprime(n):判断n是否为素数,当n是素数时返回1,否则返回0>> x=1:100 //生成1-100全部整数的向量x >> k=isprime(x) //调用isprime函数生成k向量,k向量为1/0 >> k1=find(k) //k1向量为k向量中非0元素的序号 >> p=x(k1) //输出全部素数
1.3 变量及其操作
变量与赋值语句
- 变量本质上讲是内存单元的一个抽象
- 在matlab中,变量名是以字母开头,后接字母、数字或下划线的字符序列,最多63个字符。
- 变量名区分字母大小写
- 标准函数名以及命令名必须用小写字母
赋值语句两种格式:
- 变量=表达式
表达式
- 将表达式的值赋给预定义变量ANS,自动显示结果
后面加
;
则不显示ANS结果预定义变量
由系统本身定义的变量
- ans是默认赋值变量
- i和j代表虚数单位
- pi代表圆周率
NaN代表非数
变量的管理
内存变量的删除与修改
在工作区窗口,右键选择功能- who命令:只显示驻留变量名称
- whos命令:显示变量的Name、Size、Bytes、Class、Attributes
内存变量文件
用于保存matlab工作区变量的文件叫做内存变量文件,其扩展名为.mat
,也叫MAT文件save命令:创建内存变量文件
>> save mydata a x //保存a、x变量->mydata文件
load命令:装入内存变量文件
>> load mydata
1.4 MATLAB矩阵的表示
矩阵的建立
利用直接输入法建立矩阵:
将矩阵的元素用==中括号==括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用==逗号或空格==分隔,不同行的元素之间用==分号==分隔。>> A=[1,2,3;4,5,6;7,8,9] A = 1 2 3 4 5 6 7 8 9
利用已建好矩阵建立更大的矩阵:
一个大矩阵可以由已经建立好的小矩阵拼接而成。>> A=[1,2,3;4,5,6;7,8,9]; >> B=[-1,-2,-3;-4,-5,-6;-7,-8,-9]; >> C=[A,B;B,A]
用实部矩阵和虚部矩阵构成复数矩阵:
>> B=[1,2,3;4,5,6]; >> C=[4,5,6;7,8,9]; >> A=B+i*C A =
冒号表达式
表达式格式:
e1:e2:e3
【初始值:步长:终止值】
省略步长e2,则步长为1- e1:初始值
- e2:步长
e3:终止值
>> t=0:1:5 //等价于 t=0:5 t = 0 1 2 3 4 5
linspace(a,b,n)函数:
生成从a到b的n个数,步长平均- a:第一个元素
- b:最后一个元素
n:元素总数,当n省略时,自动产生100个元素
>> x=linspace(0,pi,6) x = 0 0.628 1.2566 1.8850 2.5133 3.1416
结构矩阵和单元矩阵
结构矩阵
格式为:结构矩阵元素.成员名=表达式>> a(1).x1=10;a(1).x2='liu';a(1).x3=[11,21;31,41]; >> a(2).x1=12;a(2).x2='wang';a(2).x3=[12,22;32,42]; >> a(3).x1=13;a(3).x2='cai';a(3).x3=[13,23;33,43];
单元矩阵
建立单元矩阵和一般矩阵相似,直接输入就可以了,知识单元矩阵元素用==大括号==括起来。>> b={11,'liu',[11,21;31,41];... 12,'wang',[12,22;32,42];... 13,'cai',[13,23;33,43]} b = [11] 'liu' [2x2 double] [12] 'wang' [2x2 double] [13] 'cai' [2x2 double]
1.5 矩阵元素的引用
矩阵元素的引用方式
通过下标来引用矩阵的元素
A(3,2)表示A矩阵的第三行第二列的元素>> A(3,2)=10; //仅修改某个元素 >> A=[1,2,3;4,5,6]; //生成一个2行3列的矩阵 >> A(4,5)=10 //为第4行第5个元素赋值,扩增的元素都为0 A = 1 2 3 0 0 4 5 6 0 0 0 0 0 0 0 0 0 0 0 10
通过序号来引用
- 在matlab中,矩阵元素按列存储,即首先存储矩阵的第一列元素,然后存储第二列元素,…,一直到矩阵的最后一列元素
矩阵元素的序号就是矩阵元素在内存中的排列顺序
>> A=[1,2,3;4,5,6] A = 1 2 3 4 5 6 >> A(3) ans = 2
- 序号与下标是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i
矩阵元素的下标可以利用sub2ind和ind2sub函数实现相互转换
sub2ind(S,i,j)函数:将矩阵中指定元素的行、列下标转换成存储的序号。调用格式为:
>> D=sub2ind(S,i,j)
- S:行数和列数组成的向量,[m,n]
- D:序号
- i:转换矩阵元素的行下标
j:转换矩阵元素的列下标
>> A=[1:3;4:6] A = 1 2 3 4 5 6 >> D=sub2ind(size(A),[1,2;2,2],[1,1;3,2]) D = 1 2 6 4
ind2sub(S,D)函数:将矩阵元素的序号转换成对应的下标,其调用格式为:
>> [i,j]=ind2sub(S,D)
- [i,j]:元素下标
- S:行数和列数组成的向量,[m,n]
D:序号
>> [i,j]=ind2sub([3,3],[1,3,5]) //获取3x3矩阵中第1,3,5个元素的下标 i = 1 3 2 j = 1 1 2
利用冒号表达式获得子矩阵
子矩阵是指由矩阵中的一部分元素构成的矩阵
>> A(i,:) //第i行的全部元素 >> A(:,j) //第j列的全部元素 >> A(i:i+m,j:j+m) //第i~i+m行内且在第j~j+m列中的所有元素,m+1维 >> A(i:i+m,:) //第i~i+m行的全部元素
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >> A(1:2,:) ans = 1 2 3 4 5 6 7 8 9 10 >> A(2:3,1:2:5) ans = 6 8 10 11 13 15
end运算符:表示某一维度的末尾元素下标
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20]; >> A(end,:) ans = 16 17 18 19 20 >> A([1,4],3:end) ans = 3 4 5 18 19 20
利用空矩阵删除矩阵的元素
空矩阵是指没有任何元素的矩阵
>> x=[] x = [] //x是一个空矩阵
>> A=[1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8] A = 1 2 3 0 0 7 0 9 2 6 1 4 -1 1 8 >> A(:.[2,4])=[] A = 1 3 0 7 9 6 1 -1 8
改变矩阵的形状
reshape(A,m,n):在矩阵总元素保持不变的前提下,将矩阵A重新排成mxn的二维矩阵
【注意】reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序>> x=[23,45,65,34,65,34,98,45,78,65,43,76]; >> y=reshape(x,3,4) //将x转换为3行4列的矩阵y y = 23 34 98 65 45 65 45 43 65 34 78 76
A(:):将矩阵A的每一列元素堆叠起来,成为一个列向量
>> A=[-45,65,71;27,35,91] A = -45 65 71 27 35 91 >> B=A(:) // A(:)等价于reshape(A,元素个数,1) B = -45 27 65 35 71 91
1.6 MATLAB基本运算
在算术运算、关系运算和逻辑运算中,算术运算的优先级最高,逻辑运算优先级最低,但逻辑非运算是单目运算,它的优先级比双目运算要高。
算术运算
基本算术运算符:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)
matlab的算术运算是在矩阵意义下进行的
单个数据的算术运算只是矩阵运算的一种特例加减运算
- 若两矩阵同型,则运算时两矩阵的相应元素相加减
- 若两矩阵不同型,则matlab将给出错误信息
- 一个标量也可以和矩阵进行加减运算,这是把标量和矩阵的每一个元素进行加减运算
乘法运算
- 矩阵A和B进行乘法运算,要求A的列数和B的行数相等,此时则称A、B矩阵是可乘的,或称A和B两矩阵维数和大小相容
- 如果两者维数或大小不相容,则将给出错误信息,提示用户两个矩阵是不可乘的
除法运算
在MATLAB中,有两种矩阵除法运算:右除/和左除\,如果A矩阵是非奇异方阵,则B/A等效于B*inv(A),A\B等效于inv(A)*B
对于矩阵来说,右除和左除表示两种不同的除数矩阵和被除数矩阵关系>> A=[1,2,3;4,2,6;7,4,9]; >> B=[4,3,2;7,5,1;12,7,92]; >> C1=B/A //等效于B右乘以A的逆,即B*inv(A) C1 = -0.1667 -3.3333 2.5000 -0.8333 -7.6667 5.5000 12.8333 63.6667 -36.5000 >> C2=A\B //等效于B左乘以A的逆,即inv(A)*B C2 = 0.5000 -0.5000 44.5000 1.0000 0.0000 46.0000 0.5000 1.1667 -44.8333 >> 3/4 ans = 0.7500 >> 4\3 ans = 0.7500 >> a=[10.5,25] a = 10.5000 25.0000 >> a/5 ans = 2.1000 5.0000 >> 5\a ans = 2.1000 5.0000
乘方运算
一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量>> A=[1,2,3;4,5,6;7,8,0]; >> A^2 //等价于A*A ans = 30 36 15 66 81 42 39 54 69
点运算
- 点运算符:
.*
、./
、.\
和.^
两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵同型
>> A=[1,2,3;4,5,6;7,8,9]; >> B=[-1,0,1;1,-1,0;0,1,1]; >> C=A.*B //点乘运算,矩阵对应元素相乘 C = -1 0 3 4 -5 0 0 8 9 >> D=A*B //矩阵乘法,按照矩阵规则相乘 D = 1 1 4 1 1 10 1 1 16
// 当x=0.1、0.4、0.7、1时,分别求y=sin(x)*cos(x)的值 >> x=0.1:0.3:1 x = 0.1 0.4 0.7 1 >> y=sin(x).*cos(x);
关系运算
- 点运算符:
- 关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于等于)、==(等于)、~=(不等于)。
当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
>> 3>4 ans = 0 >> x=5; >> x==5 ans = 1
- 当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,他的元素由0或1组成。
当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,最终的关系运算的结果时一个与原矩阵同型的矩阵,他的元素由0或1组成。
// 建立3阶方阵A,判断A的元素是否为偶数 >> A=[24,35,13;22,63,23;39,47,80] A = 24 35 13 22 63 23 39 47 80 >> P=rem(A,2)==0 P = 1 0 0 1 0 0 0 0 1
逻辑运算
- 逻辑运算符:&(与)、|(或)、~(非)。
设参与逻辑运算的时两个标量a和b,那么运算规则为:
- a&b:a、b全为非零时,运算结果为1,否则为0
- a|b:a、b中只要有一个为非零时,运算结果为1
~a:当a为零时,运算结果为1;当a为非零时,运算结果为0
>> 3<4 & 6>5 ans = 1 >> ~(9==1) ans = 1 >> ~9==1 ans = 0
- 若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由0或1组成。
若参与逻辑运算的一个是标量,一个是矩阵,那么将在标量与矩阵中的每个元素之间按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由0或1组成。
// 水仙花数是指各位数字的立方之和等于该数本身的三为正整数。 // 求全部水仙花数。 >> m=100:999; >> m1=rem(m,10); >> m2=rem(fix(m/10),10); >> m3=fix(m/100); >> k=find(m==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3) k = 54 271 272 308 >> s=m(k) s =
1.7 字符串处理
matlab数据类型分为数值型数据和字符型数据(字符串)
字符串的表示
在matlab中,字符串是用单引号括起来的字符序列
>> xm='HeBei University'; >> xm(1:3) ans = HeB
若字符串中的字符含有单引号,则该单引号字符要用两个单引号表示
>> 'I''m a teacher.' ans = I'm a teacher.
建立多行字符串,形成字符串矩阵
>> ch=['abcdef';'123456']; >> ch(2,3) ans = 3
【例】建立一个字符串向量,然后对该向量做如下处理:
- 取第1~5个字符组成的子字符串
- 将字符串倒过来重新排列
- 将字符串中的小写字幕变成相应的大写字幕,其余字符不变
统计字符串中小写字母的个数
>> ch='ABc123d4e56Fg9'; >> subch=ch(1:5) //1.sub subch = ABc12 >> revch=ch(end:-1:1) //2.reverse revch = 9gF65e4d321cBA >> k=find(ch>='a'&ch<='z') k = 3 7 9 13 >> ch(k)=ch(k)-('a'-'A') //3.upper ch = ABC123D4E56FG9 >> length(k) //4.length ans = 4
字符串操作
字符串的执行
格式:eval(s):s为含有可执行函数的字符串>> t=pi; >> m='[t,sin(t),cos(t)]'; >> y=eval(m) y = 3.1416 0.0000 -1.0000
字符串与数值之间的转换
- abs(x)和double(x)函数都可以用来获取字符串矩阵所对应的ASCii码数值矩阵
char(x)函数可以把ASCii码矩阵转换为字符串矩阵
>> s1='MATLAB'; >> a=abs(s1) a = 77 65 84 76 65 66 >> char(a+32) ans = matlab
字符串的比较
字符串的比较有两种方法:利用关系运算符或字符串比较函数关系运算符比较:
两个字符串里的每个字符依次按ASCii值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0。>> 'www0'>='W123' ans = 1 1 1 0
字符串比较函数:
用于判断字符串是否相等,有4种比较方式,函数如下:- strcmp(s1,s2):比较字符串s1和s2是否相等,如果相等返回1,否则返回0。
- strcmpi(s1,s2):在忽略字母大小写的前提下,比较字符串s1和s2是否相等,如果相等返回1,否则返回0。
- strncmp(s1,s2,n):比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0。
strncmpi(s1,s2,n):在忽略字母大小写的前提下,比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0。
>> strcmp('www0','w123') ans = 0 >> strncmpi('Www0','w123',1) ans = 1
字符串的查找与替换
- findstr(s1,s2):返回短字符串在长字符串种的开始位置。
strrep(s1,s2,s3):将字符串s1种的所有子字符串s2替换为s3。
>> s1='This is a test!'; >> s2='is'; >> findstr(s1,s2) ans = 3 6 >> s3='test'; >> s4='class'; >> strrep(s1,s2,s3) ans = This is a class!