本文所使用的MatLab为MATLAB R2021a,其他版本的内容基本一致。
合集:
MATLAB入门到精通(一):简介及数据类型
MATLAB入门到精通(二):基本语句及绘图
MATLAB入门到精通(三):常用函数及数学应用
一、MATLAB概述
1.1 MATLAB简介
MATLAB译为矩阵实验室,最初用来提供通往LINPACK和EISPACK矩阵的软件包接口。后来,它渐渐发展成为通用的科技计算图形交互系统和程序语言。
MATLAB支持主流的操作系统,提供了大量的平台独立措施。在其他平台可以正常运行的文件,在新的平台上仍可以运行。
任何一个MatLab程序的基本组成单元都是数组,数组是一组数据值的集合,这些数据被编上行号列号,拥有唯一的名称。
1.2 MATLAB界面
MatLab的工作界面主要由工具栏、当前文件夹窗口、工作区窗口、命令历史记录窗口和命令行窗口组成。如图1-1
1.3 命令行与脚本
可以浅显的这样理解:
- 命令行是每次执行一行命令,一般可以做一些小的测试或者一些命令使用,也是数据的展示窗口。
- 脚本是每次执行多行命令,后面的程序一般都是在这里编写,可以选择执行的范围。对应的命名为.m结尾的文件。
二、数组
2.1 一维数组的创建
2.1.1 手动创建向量
一维数组就是向量,下文的向量意思也和一维数组相同。
2.1.2 其他方式创建向量
①用 :创建向量
语法为:a=j:s:k
j表示起始数字,s表示步长(省略为1),k表示结尾数字。
② 用函数linspace创建向量
linspace函数可以生成按照等差形式排列的行向量。语法为:a=linspace(x1,x2,n),即在x1和x2之间生成n个数据,这n个数据自动的按照等差数列的形式排列。
2.1.3 行列向量的转换
① 转置的方式转换
在matlab中 ‘ 的作用是对数组进行转置,在一维数组中即为行列向量的转换。这里对于一维数组的处理与二维数组的处理相同,后续不在赘述。
② 使用函数transpose
2.2 二维数组的创建
二维数组可以看成是矩阵,与一维矩阵看成向量相同,本文后续矩阵和二维数组是同一意思。
2.2.1 手动创建矩阵
即为多行向量的合并,每行之间用 ; 隔开。
2.2.2 其他方式创建矩阵
matlab种矩阵的创建方式有很多,这里无法全部列举,仅对使用更多的方式进行介绍。
① ones()函数创建全1矩阵
语法为:a=ones(m,n),即为生成一个m行n列元素全为1的矩阵a。
可以省略少写一个参数,即为对应nxn的全1矩阵。
② eye()函数创建单位矩阵
语法为:a=eye(m,n),即为生成一个m行n列的单位矩阵a
可以省略少写一个参数,即为对应nxn的单位矩阵。
③ zeros()函数创建全0矩阵
语法为:a=zeros(m,n),即为生成一个m行n列元素全为0的矩阵a。
可以省略少写一个参数,即为对应nxn的全0矩阵。
④ rand()函数创建均匀分布的矩阵
语法为a=rand(m,n),即为生成一个m行n列元素均匀分布的随机矩阵a。
可以省略少写一个参数,即为对应nxn的随机的矩阵。
⑤ diag()函数创建对角矩阵
语法为a=diag(D),即为生成一个对角元素为矩阵D的矩阵,D为一为数组。
2.3 数组的寻址
数组中总数包含多个元素,因此在对数组的单个元素或者多个元素进行访问时,需要进行数组的寻址运算。
2.3.1 一维数组的寻址
一维数组寻址操作比较简单,直接看例子即可。
① 访问单个元素
② 访问多个元素
2.3.2 二维数组的寻址
二维数组寻址与一维数组的寻址类似。
还可以使用寻址函数sub2ind()读取数组中凌乱排序的元素,是将一个二维数组的下标变成索引,然后用索引对二维数组进行寻址。例如:
—————————(2023/3/1418:13)——————————
2.4 数组的排序
MATLAB提供数组排序的函数sort(),该函数可对任意给定的数组进行排序。
2.4.1 一维数组的排序
语法:[b,index]=sort(a),即为对数组a进行排序,b为排序后的数组,Index为b中对应元素在a中的索引。
2.4.2 二维数组的排序
语法:[b,index]=sort(A,dim,mode),表示对数组A进行排序,若dim=1表示对每一列进行排序(可省略);若dim=2表示对每一行进行排序(不能省略)。mode=‘descend’表示进行降序排列,mode=‘ascend’表示进行升序排列,默认为升序排列。
2.5 数组的检测
① isempty()函数
isempty()函数主要用于检测某个数组是否为空数组。
若返回值为1则为空数组,返回值为0则不是空数组。
② isscalar()函数
isscalar()函数主要用来检测某个数组是否为单元素的标量数组.
调用方法与上述一致。
③ isvector()函数
isvector()函数主要用来检测某个数组是否具有一行或一列元素的一维向量数组,即判断是不是向量。
④ issparse()函数
issparse()函数用来检测某个数组是否为稀疏矩阵。
2.6 数组的结构属性
2.6.1 数组的长度
数组的长度,即为数组的行数和列数之间的最大值。
使用lengeth()函数得到。
2.6.2 数组元素总数
数组元素的总数即为行数和列数的乘积。
使用numel()函数得到。
数组的行数和列数
使用size()函数得到。
2.7 数组元素运算
2.7.1 算术运算
① 数组的加减
数组的加减跟普通数字的加减一样。
如果一个数组加或减一个数,则数组的所有元素都要加或减这个数;
如果一个数组加或减一个数组,则这两个数组的大小应保持一致,并且相对应的元素进行相加减。
② 数组的乘除
数组的乘除可以分为两种,即为矩阵乘除(线代中的那种)
、矩阵对应元素之间的乘除(直接对应项相乘除)。两种情况Matlab均可实现。
2.7.2 逻辑运算
逻辑运算针对两个矩维数一直才能进行的运算。
运算名称 | 描述 |
---|---|
与(&) | 元素均为非0则值为1 |
或(|) | 元素有非0则值为1 |
非(~) | 元素取反 |
异或(xor函数) | 相异为1,相同为0 |
2.8 数组基本运算
2.8.1 求和
数组的求和一般分为两种:数组的累加、数组的求和。
① 数组累加和cumsum()函数
cumsum()函数可以求一个数组的累加和。如果数组是一个向量则其结果仍为一个向量;如果数组是一个矩阵,则需要从行和列两方面进行考虑。
语法为:B=cumsum(A,dim),当dim=1时,返回的是沿着第一维(各列)的累加和;当dim=2时,返回的是沿着第二维(各行)的累加和。
② 数组求和sum()函数
sum()也有维度控制参数dim,和上述cumsum()函数一致,不再重复赘述,具体可直接看例子:
2.8.2 相乘
数组之间的乘法又分为点乘和叉乘。
① 点乘
点乘就是上面提到的数组对应元素之间相乘的运算。具体可由dot()函数实现。
语法为:B=dot(a,b,dim),当dim=1时,则是列之间的元素相乘再相加,可省略;dim=2,则是行之间的元素进行相乘再相加。
② 叉乘
叉乘就是空间解析几何中所说的笛卡尔积,具体可用cross()函数实现。
语法为:C=cross(A,B,dim),这其中的A,B必须为三元向量,其数学表达式可以表示为C=A X B;
2.8.3 其他处理函数
① prod()函数,可用于求该数组元素的乘积。
② cumprod()函数,可用于求累积,类似于前面的cumsum()函数。
③ triu()函数,可用于提取上三角矩阵的函数。
语法为:U=triu(X,k),具体看例子即可理解。
—————————(2023/3/14 22:25)——————————
三、字符串
3.1 字符串的构建
一个Matlab字符串其实就是一个char型数组,每一个字符占两个字节。
3.1.1 创建字符数组
字符数组的构造方式有很多,下面介绍一些比较常用的方法。
① 单引号创建
② 字符串合并创建
(1)strcat()函数合并
strcat()函数进行字符串合并的同时会把字符串结尾的空格删除。
(2)矩阵直接合并
直接以矩阵的方式合并字符串,结尾的空格将会被保留。
3.1.2 创建二维字符数组
① 单引号创建
创建二维字符数组需要保证每行的长度相同,否则无法创建。确需长度不同的字符串时,可以空格补齐。
PS:deblank()函数可以去除多余空格。
② 使用函数的方式创建
(1)char()函数
char()创建字符串时,会自动用空格来将较短的字符串补足到最长的字符串长度。除此之外,char()函数还可将字符串单元数组转化为一个字符数组,具体见下小结。
PS:这里暂时对单元数组和数组进行一下区分,可以将单元数组理解为可以存储不同数据类型的数组。
(2)strvcat()函数
strvcat()函数的用法和char()函数基本一致,也可以将空格自动填补。不在赘述。
(3)cellstr()函数
cellstr()函数可以将字符数组转化为字符串单元数组,它和char()函数可以理解成逆运算,即可相互转换。
3.2 字符串的比较判断
3.2.1 两个字符串的比较
见下表:
函数名 | 作用 |
---|---|
strcmp() | 判断两字符串是否等价 |
strcmpi() | 忽略大小写判断两字符串是否等价 |
strncmp() | 判断两字符串前n个字符是否等价 |
strncmpi() | 忽略大小写,判断两字符串前n字符是否等价 |
例子:
3.2.2 单个字符的比较
单个字符的比较可以直接用 == 去比较,当然也可用来判断字符串。
3.2.3 字符串内的判断
见下表:
函数名 | 作用 |
---|---|
isletter() | 判断一个字符是否为字母 |
isspace() | 判断一个字符是否为空白字符(空格、tab、换行符) |
例子:
—————————(2023/3/15 11:49)——————————
3.3 字符串查找及替换函数
见下表:
函数名 | 作用 | 调用格式 |
---|---|---|
strrep() | 字符串的替换 | str=strrep(str1,str2,str3),即把str1中的str2替换为str3 |
findstr() | 字符串内查找 | k=findstr(str1,str2),从较长的找较短的位置 |
strfind() | 字符串内查找 | k=strfind(str,pattern),查找str中pattern出现的位置; k=strfind(cellstr,pattern),查找单元字符串celstr中pattern出现的位置 |
strtok() | 获得第一个分隔符之前的字符串 | token=strtok(‘str’),以空格符为分隔符; token=strtok(‘str’,delimiter),以delimiter为指定的分隔符 |
strmatch() | 在字符串数组中匹配指定字符串 | x=strmatch(‘str’,STRS),在字符串数组STRS中匹配字符串str,返回匹配上的字符串所在行的指标 |
例子:
3.4 字符串转换
3.4.1 大小写的转换
函数upper()和lower()分别可以吧一个字符串的所有字母转化为大写和小写。
3.4.2 字符串转换为数字
① 使用eval()函数
eval()可以把由数字组成的字符串转化为数字。
str='3.1415926';
a=eval(str);
a
② 使用sscanf()函数
sscanf()函数可以对要转化的字符串进行格式化处理。
语法为:value=sscanf(string,format),即为将string转化为format类型的数字。format常见的有"%d"(整形),“%g”(浮点型)。
str='3.1415926';
value=sscanf(str,'%d') %转化为整形数字
value
3.4.3 数字转换为字符串
Matlab中有许多将数字转化为字符串的函数,这里只介绍两种。
① 使用int2str()函数
x=1234;
y=int2str(x);
y
② 使用num2str()函数
函数num2str()函数为输出字符串的格式提供了更多的控制,第二个可选参数可以对输出的数字个数进行设置或指定一个实际格式。
p=num2str(pi,7); % 前7位转化为字符串。pi为matlab中的内置变量,即为圆周率π。
p
四、结构体
这里有个人的一些不知是否恰当的理解,如果有误,请批评指正。
结构体类似于面向对象编程中的对象类型,但是又比对象缺少了方法体。只保留了对象的属性,属性也可以是任意类型。而在matlab中的属性被称为字段。
4.1 结构体的构造
① 赋值语句直接构造
Person.Name='Carlos';
Person.Score=89;
Person.Salary=[1200 2300 1400 2900];
Person
Person.Score
还可对结构体进行扩展为1X2的结构体,如下:
Person(2).Name='Tom';
Person(2).Score='99';
Person(2).Salary=[1400 4430 1899 900];
Person(2)
② struct()函数创建结构体
MyStruct=struct('Name','Jake','Age',16,'Score',[1200 700 8900 90]);
MyStruct
4.2 访问结构体的数据
这里可以这样理解:把结构体想象成一个表格。
即:Person(行号).属性(列名)。
Name | Age | Score |
---|---|---|
Carlos | 17 | [100,98,90] |
Tom | 19 | [89 99 79] |
Lucy | 18 | [60 90 80] |
Person=struct('Name',{'Carlos','Tom','Lucy'},'Age',{17,19,18},'Score',{[100 98 90],[89 99 79],[60 90 80]});
Person(1).Score(2)
Person(2).Name
五、单元数组
单元数组(元胞数组)中的每一个元素称为单元(cell)。在单元数组中的每一个单元可以包含任何类型的数据类型。单元数组是一种经常囊用作数据存储使用的数据类型。
5.1 单元数组的构造
① 直接赋值构造单元数组
这里还要分为两种构造单元数组的方式,即:单元索引法、内容索引法。
(1) 单元索引法(花括号在等号后)
clear A;
A(1,1)={[1 2;3 4;5 6]};
A(1,2)={123};
A(2,1)={'abcdf'};
A(2,2)={10:-2:0};
A % 这里只能显示出一部分数据,是因为cell有时会占很大的显示空间,matlab默认如此。下面的方式可以完全展示。
celldisp(A)
(2)内容索引法(花括号在等号前)
clear A;
A{1,1}=[1 2;3 4;5 6];
A{1,2}=123;
A{2,1}='abcdf';
A{2,2}=10:-2:0;
A %效果和上一中方法一致
5.2 单元数组的处理
① 合并
我们可以直接利用方括号将多个单元数组组合在一起,形成一个更大的单元数组。
A{1,1}=[1 2;3 4;5 6];
A{1,2}=123;
A{2,1}='abcdf';
A{2,2}=10:-2:0;
B{1,1}=[2 2;1 7;8 9];
B{1,2}=456;
B{2,1}='fdcba';
B{2,2}=1:2:10;
C=[A;B];
C
② 截取
获取单元数组中的子数组,可以利用传统的数组寻址方法获得。
D=C([1 3],:) %C为上节的C
———————2023/3/15 18:24——————————