专题一 MATLAB基础知识
1.1 MATLAB系统环境
操作界面:
(1)MATLAB主窗口
(2)命令行窗口
命令行窗口用于输入命令并显示命令的执行结果
续行符:…加换行
(3)当前文件夹窗口
如何设置:
- 在当前文件夹工具栏或者当前文件夹窗口选择某文件夹为当前文件夹
- 使用cd命令(cd e:\work) 先建立文件夹再将其文件夹设定为当前文件夹
(4)工作区窗口
MATLAB的搜索路径
变量→内部函数→程序文件
陈旭文件→当前文件夹的程序文件→文件搜索路径文件夹中的程序文件
如果与内部函数重名,则函数变量名优先。
如何设置文件搜索路径:
- 使用path命令设置文件搜索路径。例如: >>path(path,‘e:\work’)
- 用对话框设置文件搜索路径。
1.2 MATLAB数值数据
数值数据类型的分类:
- 整型
- 浮点型
- 复数型
(1)整型
- 无符号整数:无符号8位整数、无符号16位整数、无符号32位整数、无符号64位整数。
- 带符号整数:带符号8位整数、带符号16位整数、带符号32位整数、带符号64位整数。
无符号8位整数数据范围:00000000~11111111 (0 ~ 28-1)
带符号8位整数数据范围:10000000~01111111 (-27-1 ~ 27-1)
MATLAB提供了数据类型转换函数来实现数据类型的转换
- uint8函数将数值数据转换为无符号8位整数
- int8函数将数值数据转换为带符号8位整数
(2)浮点型
浮点型数据分为单精度型和双精度型,单精度型实数在内存中占用4个字节,而双精度型实数在内存中占用了8个字节,所以双精度型的数据精度更高。<mark>MATLAB中数值默认为双精度</mark>
- single函数:将其他类型数据转换为单精度型
- double函数:将其他类型的数据转换为双精度型
(3)复型
复型数据包括实部和虚部两个部分,实部和虚部默认为双精度型,叙述单位用i或j来表示
>> 6+5i
ans =
6.0000 + 5.0000i
>> 6+5j
ans =
6.0000 + 5.0000i
- real函数:求复数的实部
- imag函数:求复数的虚部
数值数据的输出格式
format命令的格式:format 格式符
>> format long
>> 50/3
ans =
16.666666666666668
>> format
>> 50/3
ans =
16.6667
format命令只影响数据输出格式,而不影响数据的计算和存储
常用的数学函数
(1)函数的调用格式为
函数名(函数自变量的值)
函数的自变量规定为矩阵变量,当然也可以是标量,标量本身就是矩阵的一种特立。
函数在运算时是将函数逐项作用于矩阵的每个元素上,所以最后运算的结果就是一个与自变量同型的矩阵。
(2)常用函数的应用
- 三角函数有以弧度为单位的函数和以角度为单位的函数,如果是以角度为单位的函数就在函数名后面加“d”,以示区别。
>> sin(pi/2)
ans =
1
>> sind(90)
ans =
1
- abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值
>> abs(-4)
ans =
4
>> abs(3+4i)
ans =
5
>> abs('a')
ans =
97
- 用于取整的函数有fix、floor、ceil、round。
round函数按照四舍五入的规则取整。
ceil函数是向上取整,取大于等于这个数的第一个整数。
floor函数是向下取整,取小于等于这个数的第一个整数。
fix函数是固定取靠近0的那个整数,即舍去小数取整。
>> round(4.7)
ans =
5
>> fix(-3.2)
ans =
-3
>> floor(3.6)
ans =
3
>> ceil(-3.8)
ans =
-3
· 其他常用函数
rem(x,y)函数用于求x除以y的余数。
isprime(n)函数,当n是素数时返回1,否则返回0。
find(n)函数用于找矩阵n中非0元素的序号
1.3 变量及其操作
在高级语言中,只需要给每个内存单元取一个名字,然后通过这个名字就能够访问每个内存单元。
变量与赋值语句
变量本质上讲是内存单元的一个抽象
在MATLAB中,变量名是以字母开头,后接字母、数字或下划线的字符序列,最多63个字符。
变量名区分字母的大小写。
标准函数名以及命令名必须用小写字母。
赋值语句两种格式:
- 变量=表达式
- 表达式(赋给预定变量ans)
如果在赋值语句后加 ; 则仅仅会进行赋值计算,不会输出结果
预定义变量
预定义变量是由系统本身定义的变量。
- ans是默认赋值变量
- i和j代表虚数单位
- pi代表圆周率
- NaN代表非数
在绘图的时候如果想裁掉一部分,将裁掉部分的坐标数据设为NaN就可以了
变量的管理
(1)内存变量的删除与修改
- 通过变量工作区窗口
- who命令和whos命令
- who命令:只显示众多变量名的名称
- whos命令:显示变量名,大小,所占字节数,数据类型
(2) 内存变量文件
用于保存MATLAB工作区变量的文件叫做内存变量文件,其扩展名为.mat,也叫MAT文件。
- save命令:创建内存变量文件。
- load命令: 装入内存变量文件。
把变量a和x装入内存变量文件mydata
>> save mydata a x
>> load mydata
1.4 MATLAB矩阵的表示
矩阵的建立
- (1)利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用逗号或空格分隔,不同行的元素之间用分号分隔。
>> A=[1,2,3;4,5,6;7,8,9]
A =
1 2 3
4 5 6
7 8 9
-
(2)利用已建好的矩阵建立更大的矩阵:一个大矩阵可以由已经建立好的矩阵拼接而成。
-
可以用实部矩阵和虚部矩阵构成复数矩阵。
>> B=[1,2,3;4,5,6];
>> C=[6,7,8;9,10,11];
>> A=B+i*C
A =
1.0000 + 6.0000i 2.0000 + 7.0000i 3.0000 + 8.0000i
4.0000 + 9.0000i 5.0000 + 10.0000i 6.0000 + 11.0000i
冒号表达式
- 格式:e1:e2:e3
e1:初始值
e2:步长
e3:终止值
省略步长e2,则步长为1。例如,t=0:5与t=0:1:5等价
>> t=0:1:5
t =
0 1 2 3 4 5
- linspace函数
格式: linspace(a,b,n)
a:第一个元素
b:最后一个元素
c:元素总数
当n省略时,自动产生100个元素
>> x=linspace(0,pi,6)
x =
0 0.6283 1.2566 1.8850 2.5133 3.1416
结构矩阵和单元矩阵
(1)结构矩阵
格式为: 结构矩阵元素.成员名=表达式
>> a(1).x1=10; a(1).x2='liu'; a(1).x3=[11,21;34,78];
>> a(2).x1=12; a(2).x2='wang'; a(2).x3=[34,191;27,578];
>> a(3).x1=14; a(3).x2='cai'; a(3).x3=[13,890;67,231];
(2)单元矩阵
建立单元矩阵和一般矩阵相似,直接输入就可以了,只是单元矩阵元素用大括号括起来。
>> b = {10,'liu',[11,21;34,78];12,'wang',[34,191;27,578
];14,'cai',[13,890;67,231]}
b =
[10] 'liu' [2x2 double]
[12] 'wang' [2x2 double]
[14] 'cai' [2x2 double]
1.5 矩阵元素的引用
矩阵元素的引用方式
(1)通过下标来引用矩阵的元素
A(3,2)表示A矩阵第3行第2列的元素。
>> A=[1,2,3;4,5,6];
>> A(4,5)= 10
A =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 10
(2)通过序号来引用
在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:将矩阵中指定元素的行、列下标转换成存储的序号。
调用格式:D = sub2ind (S,I,J)
- S:行数和列数组成的向量
- I:转换矩阵元素的行下标
- J:转换矩阵元素的列下标
- D:序号
>> 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
下标(1,1)的元素序号是1,下标(2,1)的元素序号是2,下标(2,3)的元素序号是6,下标(2,2)的元素序号是4。
ind2sub函数:将把矩阵元素的序号转换成对应的下标
调用格式为:[I,J] = ind2sub(S,D)
- S:行数和列数组成的向量
- D:序号
- I:行下标
- J:列下标
>> [I,J]=ind2sub([3,3],[1,3,5]
I =
1 3 2
J=
1 1 2
在3行3列矩阵里,第1个,第3个,第5个元素的下标为(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运算符:表示某一维的末尾元素下标
利用空矩阵删除矩阵的元素
空矩阵是指没有任何元素的矩阵。
>> x=[]
x =
[]
x是一个空矩阵
改变矩阵的形状
reshape(A,m,n):在矩阵总元素不变的前提下,将矩阵A重新排成m*n的二维矩阵。
注意:reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序。
A(😃:将矩阵A的每一列元素堆叠起来,成为一个列向量。
>> A=[1,2,3;4,5,6]
A =
1 2 3
4 5 6
>> B = A(:)
B =
1
2
3
4
5
6
等价于reshape(A,6,1)
1.6 MATLAB基本运算
算术运算
(1)基本算术运算
基本算术运算符:+(加)、-(减)、** (乘)、/(右除)、**(左除)、^*(乘方)。
- MATLAB的算术运算是在矩阵意义下进行的。
- 单个数据的算术运算只是矩阵运算的一种特例。
加减运算
- 若两矩阵同型,则运算时两矩阵的相应元素相加减。
- 若两矩阵不同型,则MATLAB将给出错误信息。
- 一个标量也可以和矩阵进行加减运算,这时把标量和矩阵的每一个元素进行加减运算。
乘法运算
- 矩阵A和矩阵B进行乘法运算,要求A的列数与B的行数相等,此时则称A、B矩阵时可乘的,或称A和B两矩阵维数和大小相容。
- 如果两者的维数或大小不相容,则将给出错误信息,提示用户两个矩阵是不可乘的。
除法运算
在MATLAB中,有两种矩阵除法运算:右除/和左除\。
如果A矩阵时非奇异方阵,则B/A等效于B*inv(A),A\B等效于inv(A)*B。
对于矩阵来说,右除和左除表示两种不同的除数矩阵和被除数矩阵关系。
乘方运算
一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。
(2)点运算
- 点运算符:.* 、./ 、.\ 和.^。
- 两矩阵进行点运算是指他们的对应元素进行相关运算,要求两矩阵同型。
点运算是MATLAB很有特色的一个运算符,在实际应用中骑着很重要的作用,也是许多初学者容易弄混的一个问题。
关系运算
- 关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。
- 当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
- 当参与比较的量是两个同型的矩阵时,比较是两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成。
- 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成。
逻辑运算
逻辑运算符:&(与)、|(或)和**~**(非)。
设参与逻辑运算的是两个标量a和b,那么运算规则为:
- a&b a、b全为非零时,运算结果为1,否则为0。
- a|b a、b中只要有一个为非零时,运损结果为1。
- ~a 当a为零时,运算结果为1;当a为非零时,运算结果为0。
若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由1或0组成。
若参与逻辑运算的一个是标量,一个是矩阵,那么将在标量与矩阵中的每一个元素之间按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由1或0组成。
在算术运算、关系运算和逻辑运算中,算术运算的优先级最高,逻辑运算优先级最低,但逻辑非原酸是单目运算,它的优先级比双目运算要高。
1.7 字符串处理
字符串的表示
在MATLAB中,字符串是用单引号括起来的字符序列。
>> xm='SCAU, I love you.'
>> xm(1:4)
ans =
SCAU
若字符串中的字符含有单引号,则该单引号字符要用两个单引号来表示
>> 'I''m foolish."
ans =
I'm foolish.
建立多行字符串,形成字符串矩阵。
>> ch=['abcdef';'123456'];
>> ch(2,3)
ans =
3
字符串的操作
(1)字符串的执行
格式:eval(s)
s:字符串
作用:把参数字符串中的内容作为对应的MATLAB命令执行
>> t=pi;
>> m='[t,sin(t),cos(t)]';
>> y=eval(m)
y =
3.1416 0.0000 -1.0000
(2)字符串与数值之间的转换
- abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。
- char函数可以把ASCII码矩阵转换为字符串矩阵
(3)字符串的比较
字符串的比较有两种办法:利用关系运算符或字符串比较函数。
关系运算符比较:两个字符串里的每个字符一次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0。
>> 'www0'>='W123'
ans =
1 1 1 0
字符串比较函数用于判断字符串是否相等,有4种比较方式,函数如下:
- 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。
>> strcmp('www0','w123')
ans =
0
>> strncmpi('Www0','w123',1)
ans =
1
(4)字符串的查找与替换
- findstr(s1,s2):返回短字符串在长字符串中的开始位置。
- strrep(s1,s2,s3):将字符串s1中的所有子字符串s2替换为字符串s3。