MatlabClass
Matlab 的学习
matlab系统环境
matlab的搜索路径为:
变量,内部函数,程序文件(先搜索当前文件再在文件搜索路径下搜索)
- 如果在当前文件夹和搜索路径文件夹下建立了一个同名的M文件,那么在命令行窗口输入文件名时,会执行哪个文件?
- 答:执行当前文件夹下的文件
- 如果用户建立的文件既没有保存在当前文件夹下,又没有保存在文件搜索路径中,那么在命令行窗口输入文件名时会出现什么信息?
- 答:系统找不到,会报错
matlab数值数据
- 整型数据 MatLab提供了数据类型转换函数来实现数据类型的转换。例如uint8函数将数值数据转换为无符号8位整数,int8函数将数值数据转换为带符号8位整数
1 | >>x=int8(129) |
- 浮点型
在matlab中数值数据默认为浮点型,浮点型数据分为双精度和单精度两种,单精度占4个字节,双精度占8个字节,所以双精度型的数据精度更高。
- single函数:将其他类型的数据转换为单精度型
- double函数:将其他类型的数据转换为双精度型
1 | >>class(4) |
- 复型数据
复型数据包括实部和虚部两个部分,实部和虚部默认为双精度类型,叙述单位用i或者j来表示
- real函数:求复数的实部
- imag函数:求负数的虚部
1 | >>6+5i |
format命令的格式:formt格式符
1 | >>format long |
format命令只影响数据输出格式而不影响数据的计算和存储
常用数学函数
- 函数的调用格式为:
函数名(函数自变量的值) 函数的自变量规定为矩阵变量,当然也可以是标量,标量本身是矩阵的一种特例。函数在运算时是将函数逐项作用于矩阵的每个元素上,所以最后遇的结果就是一个与自变量同型的矩阵
1 | >>A=[4,2,3,6] |
matlab变量与数值语句
- 在matlab中,变量以字母开头,后接数字或下划线,最多63给字符
- 变量=表达式
- 表达式赋值给matlab预定义变量ans
注意:如果在赋值语句后加;那么matlab仅仅执行赋值操作,不会显示运算后变量的结果
1 | >>x=sqrt(7)-2i; |
- ans是默认赋值变量
- i和j代表虚数单位
- pi代表圆周率
- NaN代表非数
变量的管理:
(1)变量的删除和修改:可在工作区进行
- who命令可以显示出驻留变量的名称
- whos命令不仅显示出名称还会给出它们的大小、所占字节数及数据类型等信息
(2)内存变量文件:用于保存matlab工作区变量的文件叫做内存变量文件,其扩展名为.mat,也叫MAT文件(标准二进制文件)
- save命令:创建内存变量文件
- load命令:装入内存变量文件
- 若变量a和变量x存在matlab工作空间中,可以执行命令 >>save mydate a x 这样就会把a和x保存在mydate.mat文件中
- 在下一次重新进入matlab时,输入>>load mydate,就把mydate.mat文件中的内容装入matlab工作空间,那么在当前matlab工作环境中a和x已知
matlab矩阵的表示
- 利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵行的顺序输入各个元素,同一行的各元素之间用逗号或空格分隔,不同行的元素之间用分号分隔
1 | >>A=[1,2,3;4,5,6;7,8,9] |
- 利用已经建立好的矩阵建立更大的矩阵:一个大矩阵由两个小的拼接而成
1 | >>A=[1,2,3;4,5,6;7,8,9]; |
可以用实部矩阵和虚部矩阵构成复数矩阵
1 | >>B=[1,2,3;4,5,6]; |
向量是矩阵的特殊类型,可以由冒号表达式产生行向量,也可用linspace函数产生一个行向量
格式:
e1:e2:e3
//e1为初始值,e2为步长可省略默认为1,e3为终止值
linspace(a,b,n),a为第一个元素,b为最后一个元素,n为元素总数当n省略时将自动产生100个元素
1 | >>t=0:1:5 |
结构矩阵和单元矩阵
结构矩阵:数据类型不同而逻辑相关的数据组成一个有机整体,其中每个数据又构成了结构数据的一个成员(学生:学号,姓名,性别),学生这个结构数据,包含了这三个成员
格式:
结构矩阵元素.成员名=表达式
eg.例如要建立含有三个元素的结构矩阵a,每个元素包含三个数据类型
我们只需要分别给结构矩阵a中的每个元素里的每个成员赋值就可以了
1 | >>a(1).x1=10;a(1).x2='liu';a(1).x3=[11,21;34,78]; |
单元矩阵:单元数据类型也是把不同数据类型放在一个变量中,单元矩阵的各个元素就是不同类型的数据,每个元素就是由不同数据类型组成的(而结构数据矩阵下的元素是由名字不同的成员构成) 建立单元矩阵和一般矩阵相似,直接输入就可以,只是单元矩阵元素用大括号括起来。
1 | >>b={10,'liu',[11,21,34,78];12,'wang',[34,191;27,578];14,'cai',[13,890;67,231]} |
矩阵元素的引用
- 通过下标来引用矩阵元素 A(4,5)第四行第五列
\[ >>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 //自动补0 \]
- 通过序号引用
在matlab中矩阵元素按列存储,即首先存储矩阵的第一列元素,然后存储第二列元素一直存储到最后一列
矩阵元素的序号就是矩阵元素在内存中的排列顺序
- 序号与下标是一一对应的,以m×n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)×m+i
- 矩阵元素的序号可以与下标可以利用sub2ind和ind2sub函数实现相互转换。
sub2ind函数
:将矩阵中指定元素的行,列下标转换成存储的序号。调用格式为:D=sub2ind(S,I,J)S:
行数和列数组成的向量I:
转换矩阵元素的行下标J:
转换矩阵元素的列下标D:
对应下标元素的序号ind2sub函数:
将把矩阵元素的序号转换成对应的下标。调用格式为:[i,j]=ind2sub(S,D)S:
行数和列数组成的向量D:
对应下标元素的序号I:
转换矩阵元素的行下标J:
转换矩阵元素的列下标
1 | >>A=[1,2,3;4,5,6] |
利用冒号表达式获得子矩阵(子矩阵是指矩阵中的一部分元素构成的矩阵)
1 | A(i,:) //第i行的全部元素 |
end运算符:
表示某一维的末尾元素下标
1 | >>A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20]; |
利用空矩阵删除矩阵的元素,空矩阵是指没有任何元素的矩阵
1 | >>x=[] |
改变矩阵的形状
reshape:
在矩阵总元素保持不变的前提下,将矩阵A重新排成m×n的二维矩阵。reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序
1 | >>x=[23,45,65,34,65,34,98,45,78,65,43,76]; |
A(:):
将矩阵A的每一列元素堆叠起来,成为一个列向量
1 | >>A=[-45,65,71;27,35,91] |
matlab基本运算(matlab的运算都是根据矩阵而言的)
算数运算
- 基本算数运算:基本运算符:+ , -, * , /(右除) , (左除),^(乘方)
matlab的算数运算是在矩阵意义下进行的。单个数据的算数运算只是矩阵运算的一种特例
- 加减运算必须是同型矩阵
- 两矩阵相乘要求矩阵A的列数和矩阵B的行数相同
- 有两种矩阵除法,如果A矩阵是非奇异方阵,则B/A等效于Binv(A),A(A) B
- A^x乘方运算要求A为方阵,x为标量
- 点运算:点运算符:.* , ./ , . ,.^
- 要求两个矩阵同型
1
2
3
4
5
6
7
8
9
10
11
12>>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 161
2
3//当x=0.1、0.4、0.7、1时,分别求y=sinxcosx的值
>>x=0.1:0.3:1;
>>y=sin(x).*cos(x); //这里必须用点乘,因为x是一个向量,sin(x)和cos(x)是和x同长度的向量,如果用乘法没用点乘就会出现不相容(A行不等B列)的情况- 基本算数运算:基本运算符:+ , -, * , /(右除) , (左除),^(乘方)
关系运算
- 关系运算符:<, >, <= ,>= ,==,~=(不等于)
若两个数是标量时,直接比较两个数大小,若关系成立则为1否则为0
- 当参与比较的是两个同型的矩阵时,比较是对两矩阵位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
- 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每个元素按标量关系运算规则逐个比较,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
- 关系运算符:<, >, <= ,>= ,==,~=(不等于)
若两个数是标量时,直接比较两个数大小,若关系成立则为1否则为0
1 | //rem(A,2)是求A中每个元素除二的余数矩阵 |
- 逻辑运算
- 逻辑运算符:&,|,~
- a&b a和b要全是1,才为1
- a|b a和b一个为1就是1
- ~a a为0,运算结果为1;a为非0,运算结果为0
- 当参与逻辑运算的是两个同型的矩阵时,比较是对两矩阵位置的元素按逻辑关系运算规则逐个进行,最终的逻辑运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
- 当参与逻辑运算的一个是标量,而另一个是矩阵时,则把标量与矩阵的每个元素按逻辑关系运算规则逐个比较,最终的逻辑运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
- 逻辑运算符:&,|,~
算数运算的优先级最高,逻辑运算优先级最低,但逻辑非运算是单目运算,它的优先级比双目运算要高
1 | //水仙花数 |
字符串的处理
- 在matlab中,字符串是用单引号括起来的字符序列
- 若字符串中的字符有单引号,则该单引号字符要用两个单引号来表示
1 | >>xm='Central South University' |
- matlab中可以建立多行字符串,形成字符串矩阵,字符串就相当于一个行向量,每个字符就是其中一个元素
字符串的操作
- 字符串的执行:
eval(s) 这里的s是一个字符串
1 | >>t=pi; |
- 字符串与数值之间的转换
- abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵
- char函数可以把ASCII码矩阵转换为字符串矩阵
1 | >>s1='MATLAB'; |
- 字符串的比较
- 关系运算符:两个字符串的每个字符依次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0
- 字符串比较函数
- 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
1 | >>p=findstr('This is test!','is') |
特殊矩阵(调用方式相似)
zreos函数:产生全0矩阵,即零矩阵
zero(m):产生m×m零矩阵
zeros(m,n):产生m×n零矩阵
zero(size(A)):产生与矩阵A同样大小的零矩阵
1
2
3
4
5
6
7
8
9>>A=zeros(2,3)
A=
0 0 0
0 0 0
>>zeros(size(reshape(A,3,2))) //把矩阵A变为三行两列的矩阵并产生和改变后的矩阵A相同的大小的零矩阵
ans=
0 0
0 0
0 0
ones函数:产生全1矩阵,即幺矩阵
eye函数:产生对角线为1的矩阵,当矩阵是方阵时,得到一个单位矩阵
rand函数:产生(0,1)区间均匀分布的随机矩阵
randn函数:产生均值为0,方差为1的标准正太分布随机矩阵
1 | //首先产生5阶两位随机整数矩阵A,再产生均值为0.6,方差为0.1的5阶正太分布矩阵B,最后验证(A+B)I=IA+BI(I为单位矩阵) |
用于专门学科的特殊矩阵
- 魔方矩阵
- n阶魔方阵由1,2,3……n2共n2个整数组成,且每行,每列以及主副对角线上各n个元素之和都相等
- n阶魔方阵每行每列元素的和为(1+2+3+……+n2)/n=(n+n3)/2
- MATLAB函数magic(n)产生一个特定的魔方阵
1 | //产生8阶魔方阵,求其每行每列元素的和 |
范德蒙矩阵
希尔伯特矩阵
矩阵变换
对角阵
对角矩阵:只有对角线上有非零元素的矩阵
数量矩阵:对角线上的元素相等的对角矩阵
单位矩阵:对角线上的元素都为1的矩阵
提取矩阵的对角线元素
规定与主对角线平行向上为第1条对角线,向下为第-1条,主对角线为第0条对角线
diag(A):提取矩阵A主对角线元素,产生一个列向量
diag(A,k):提取矩阵A第k条对角线的元素,产生一个列向量
构造对角矩阵
diag(V):以向量V为主对角线元素,产生对角矩阵
diag(V,k):以向量V为第k条对角线元素,产生对角矩阵
```matlab //先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行元素乘以2……,第五行乘以5 //方法:提取一个列向量,元素为1,2,3……5,接着让这个列向量的第一行的第一个元素乘以A的第一行,第二行第二个元素乘以A的第二行…………即让这个列向量左乘矩阵A >>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] 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) >>D*A ans= 7 0 1 0 5 6 10 14 8 2 12 0 9 0 6 4 4 36 8 12 5 40 25 10 45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- ```matlab
//要将A的各列元素分别乘以对角阵的对角线元素,如何实现? 右乘矩阵
>>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]
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);
>>A*D
ans=
7 0 3 0 25
3 10 21 16 5
4 0 9 0 10
1 2 27 8 15
1 16 15 8 45
三角阵
上三角矩阵
triu(A):提取矩阵A的主对角线以及以上元素
triu(A,k):提取矩阵A的第k条对角线及以上的元素
```matlab >>triu(ones(4),-1) ans= 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
- 下三角矩阵
- tril函数和triu用法一样
### 矩阵转置
- 转置运算符是小数点后面接单引号(.')
- 共轭转置,其运算符是单引号('),它在转置的基础上还要取每个数的复共轭
- ![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_174731.jpg)
### 矩阵的旋转和旋转(上下翻转后主副对角线互换)
![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_174757.jpg)
![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_174844.jpg)
![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_175149.jpg)
### 矩阵求逆(inv函数)
![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/qq_pic_merged_1690624552843.jpg)
```matlab
>>A=[1,2,3;1,4,9;1,8,27];
>>b=[5;-2;6];
>>x=inv(A)*b
x=
23.0000
-14.5000
3.6667
//也可以用左除运算符
>>x=A\b
x=
23.0000
-14.5000
3.6667