MATLAB学习笔记
MATLAB学习笔记
注:本篇学习笔记来自《MATLAB从基础到精通》,书中采用MATLAB 7.0,因此后面相关函数在新版本MATLAB中可能需要做些修改才能运行。
第一章 MATLAB常用数据类型:
整型、浮点型、逻辑类型、结构体、元胞数组及字符串等
MATLAB数据类型在使用中与其他编程语言相比,有一个突出的特点,即不用对变量的数据类型进行定义,MATLAB软件会自动依据变量被赋值的情况,生成相应数据类型的数据。(和JavaScript有点像)
1.整型
1 | >>whos %查看工作空间变量 |
intmin()
和intmax()
函数可用于确定整型数据类型的数据范围(最大值和最小值),其中intmin()
函数用于求数据类型的下限,intmax()
函数用于求数据类型的上限。
2.浮点型
1 | single()/double()函数:单精度/双精度浮点型(32/64位) |
realmin ('single')
和realmin('double')
函数,分别返回数据类型单精度浮点型和双精度浮点型的最小值,realmax('single')
和realmax('double')
分别返回其相应的最大值
3.逻辑类型
逻辑类型仅包括两个值:“0”和“1”,分别代表逻辑“假”和“真”。
逻辑类型主要用于关系和逻辑运算,在使用过程中通过查找、条件语句的逻辑判断,可以判断条件是否为真。
- 查找矩阵中符合条件的数据:大于5则返回”1”,否则返回”0”
- 逻辑非运算,矩阵中元素是0返回”1”,否则返回”0”
4.字符串
字符串生成:主要通过直接赋值法、已有字符串的连接和其他数据类型的转换
一维字符串
直接赋值法
连接法:
strcat()
函数/连接符”[]”
1
2 >>str2=strcat(str1,"str")
>>str3=[str1,str2]二维字符串
- 二维字符串的生成方法与一维类似,不过使用连接符“[ ]”连接时,二维字符串要求每行的字符有相同的列数,如果每行列数不同会报错,此时可以通过填空补足
1
2 >>str2=char('ABC','ab') % char()创建二维字符串,列数不同字符行,末尾自动留空
>>str3=strvcat(str1,str2) %垂直连接字符串
4.1 字符串操作函数
- 字符串判断
1 | ischar(s):判断s数据类型是否为字符串 |
- 字符串访问
通过下标法来实现的,即根据字符元素在字符串中的位置来访问,其中位置的确定包括行列坐标和线性索引坐标两种方式。在MTALAB中字符数组是按列存储的。
- 字符串查找和替换
1 | strfind(str,s):在字符串str中查找字符s |
- 字符串比较
1 | k=strcmp(s1,s2):比较字符串s1和s2是否相同 |
- 字符串大小写转换
1 | str=lower(s):将字符串s中的大写英文字母全部转换为小写 |
- 字符串执行
1 | eval()函数可用于字符串表达式的执行,函数的具体用法如下: |
- 字符串空格操作相关函数
1 | str=strtok(s):查找字符串第一个空格前的字符,返回到字符串str中 |
5.元胞数组
元胞数组是由可以包括任何数据类型的元胞组成的数组
5.1元胞数组创建
- 直接赋值法:直接在命令行中给元胞数组的每个元素赋值,或者使用大括号“{ }”创建元胞数组
- 函数法:使用
cell()
函数创建(先对元胞内存空间预分配,再对元胞中的元素进行赋值)
5.2元胞数组访问
- 大括号访问元胞数组:可对其数据执行操作
- 小括号访问元胞数组:不可对其数据执行操作
5.3元胞数组显示
1 | celldisp(s):用于显示元胞数组s中的具体内容 |
5.4元胞数组删除
元胞数组的删除主要是通过把需要删除的元胞赋值为空来实现。通过大括号和小括号访问元胞并将其置空,可以分别删除元胞数组的内容或整体
6.结构体
结构体数据类型可以把不同数据类型的变量放到同一个变量名下,通过不同“域”的概念对结构体中的不同数据进行赋值、操作。结构体中的数据存储在相应的“域”中
6.1结构体生成
- 命令行直接赋值法:直接把不同类型的数据赋值给结构体变量不同的域中
1 | 结构与域之间用点号“.”连接,不同域中可保存不同数据类型的变量 |
- 函数法:
struct()
函数创建结构体变量
1 | s=struct('field1',values1,'field2',value2,...) % “'field1'”和“'field2'”为域名,“values1”和“values2”为域中的值 |
6.2结构体操作
- 结构体元素访问
- 结构体显示
1 | fieldnames()函数显示结构体的域名 |
- 结构体删除
1 | s = rmfield(ss,'field'):用于删除结构体中的域“field” |
7.不同数据类型转化
- 数组与字符串转换
1 | str = num2str(A):把数值型数据数组A转换为字符型数据,默认情况下转换的数据精度为5位有效数字 |
int2str()函数和str2int()函数可以完成整型数据与字符串的转换,即取整数据与字符串的转换。mat2str()函数和str2mat()函数可以实现矩阵与字符串的转换,其用法类似于num2str()函数和str2num()函数,但不可以用于高维数组
- 不同进制数据转换
1 | dec2hex(x)和hex2dec(x):用于十六进制数和十进制数之间的相互转换 |
- 元胞数组与数值类型转换
1 | c = num2cell(A):转换数组A到元胞数组c |
char()函数和cellstr()函数用于元胞数组和字符串之间的转换;
cell2struct()函数和struct2cell()函数可用于元胞数组和结构体的转换
第二章 矩阵和数组
1.矩阵和数组的概念
数组为具有相同数据类型的数据组合,矩阵的概念主要应用于数学中,在MATLAB中矩阵一般即指二维数组,但是矩阵与数组在部分运算上又是有很大区别的
2.矩阵和数组创建
- 直接输入法
同一行中的数据使用空格或者逗号分隔
分号表示每一行数据输入结束
所有数据都包含在方括号“[ ]”中
- 函数法
1 | zeros()函数:全零矩阵生成。一般用于初始变量创建时预留内存空间,在后面的计算中再为矩阵元素赋具体的值 |
- 外部导入法
通过数据导入平台或者文件输入函数,把txt、excel、mat等文件中存储的数据导入MATLAB工作空间内,并以矩阵的形式存储数据
3.矩阵和数组基本操作
3.1 基本信息获取
- 数据显示:
disp(x)
函数在命令行窗口输出矩阵x,不显示矩阵名(语句后不加分号也能显示) - 矩阵判断
1 | isempty(A):判断矩阵是否为空,若为空返回1,否则返回0 |
- 大小信息获取
1 | size(X):用于获取矩阵X的行数和列数 |
3.2 元素访问
- 单个元素访问
矩阵和数组是由行和列组成的,例如矩阵A中A(i,j)对应于矩阵的第i行、第j列的元素,可以通过数据行列形式访问指定行列下标的元素。同时MATLAB提供矩阵单下标的数据访问方式,这主要是因为基于矩阵的列存储数据的,第i行、j列的数据对应单下标即为(j-1)*m+i,其中m为矩阵的行数。在访问到需要的单个元素,即可进一步对访问到的单个元素进行编辑操作
- 多个元素访问
通过矩阵的下标或者根据矩阵中元素的线性索引值来访问
- 行列元素访问
行列元素的访问通过冒号运算符来实现,对于行数据访问,“:”代表所有列的数据,对于列数据访问,“:”代表所有行数据,即A(i,:)访问矩阵的第i行的所有数据。A(:,j)访问矩阵的第j列的所有数据
- 全部元素访问
矩阵全部元素访问主要还是基于下标和单下标访问机制,只是在访问的时候以符号“:”代替所有元素
- 对角线元素访问
对角线元素的访问主要通过diag()函数来实现,该函数可用于生成对角矩阵,同时也可用于访问指定对角线上的元素,但不可利用此函数修改矩阵对角线上的值
- end在矩阵元素访问中的使用
end在矩阵中代表最后一个元素,可以是一行的最后、一列的最后或者整个矩阵最后的一个元素,同时结合冒号的使用,可以访问从某个元素开始到最后的元素。使用end访问矩阵中的数据,可以不需要矩阵具体的大小
Find()
函数在矩阵元素访问中的访问
查找访问矩阵中满足一定条件的元素
1 | indices=find(X):查找矩阵X中的非零元素,返回矩阵X中非零元素的线性索引 |
4.矩阵及数组简单运算
4.1 基本函数
- 连接函数
矩阵的连接包括水平方向左右连接和垂直方向上下连接,水平连接的矩阵需要具有相同的行数,垂直连接的矩阵需要具有相同的列数。而矩阵连接可以通过中括号“[]”或连接函数实现
1 | [A;B] :用于垂直方向连接具有相同列数的矩阵A和B |
- 翻转函数
1 | fliplr(A):用于矩阵A的左右翻转,不适用于二维以上矩阵或数组 |
- 改变矩阵大小
矩阵的大小即矩阵的行列数。在MATLAB 7.0中矩阵大小的改变可以通过添加、删除、拼接元素的方法来实现,同时可以通过函数重现排列、复制矩阵,达到改变矩阵大小的目的
1 | B = reshape(A,m,n):用于重新排列矩阵A,返回大小为m×n的矩阵B,矩阵A的元素个数需要等于m×n |
MATLAB 7.0提供了repmat()函数复制矩阵。矩阵的复制在矩阵运算中具有较大的用处,因为一般的矩阵加、减等运算要求矩阵具有相同的大小。而如果遇到一个矩阵每列(行)需要都加上或减去一个数值时,即矩阵与向量的操作,不同大小的矩阵无法相加减。如果通过循环,基于矩阵中每列(行)相加减,算法的效率不高,特别是当需要计算的矩阵很大时,对算法运行时间影响很大,而函数repmat()通过复制矩阵,可以向量生成与需要加、减的矩阵相同的矩阵,进行矩阵间的运算,算法效率较高
1 | B = repmat(A,m,n):以A为重复单元,把A看做整体,返回m×n个A组成的矩阵B |
- 其他常用函数
1 | B=unique(A):去除矩阵A中的重复元素,返回无重复元素的A到新变量B,B以向量形式存在,并按从小到大的顺序排列A中无重复的元素 |
4.2 加减运算
矩阵的加减运算要求相加减的矩阵有相同的维数,即相同的行列数,与线性代数中的运算法则是相同的
4.3 乘法运算
矩阵与数组在乘法运算中有所区别,矩阵的乘法是线性代数中常用的运算,要求被乘矩阵的列数等于相乘矩阵的行数。而数组的乘法是点乘运算,即数组具有相同下标的元素相乘,运算时在一般乘法运算的“*”前加上“.”,需要两数组具有相同的维数
C=A*B:用于矩阵的乘法,要求矩阵A的列数等于矩阵B的行数
C=A.*B:用于数组的乘法,要求矩阵A和B具有相同的大小
注意,如果A和B中有一个为标量,则不需要遵守上述规则,标量与矩阵中每个元素相乘
4.4 除法运算
矩阵的除法与数组的除法有一定差异,其中矩阵的除法对应与线性代数中的逆运算相关,而数组的除法则是点除,是数组中相同下标元素的相除。同时除法运算又分为左除和右除
- 矩阵的除法
1 | A\B:矩阵的左除,如果A为方阵,即n*n阶矩阵,可用于计算方程Ax=B的解,等效于inv(A)*B |
- 数组的除法
1 | A./B:数组的左除,即A(i,j)/B(i,j) |
注意,如果A是标量,数组的左除A./B即A除以矩阵数组B的每一个元素,右除A.\B即矩阵数组B的每个元素除以标量A;如果B是标量,则数组的左除A./B即矩阵数组A的每个元素除以B,右除A.\B即标量B除以矩阵数组A的每一个元素
4.5 乘方运算
矩阵与数组在乘方运算中也有不同,矩阵的乘方相当于多个矩阵相乘,而数组的乘方即数组中每个元素的乘方运算
1 | 矩阵的乘方运算:C=A^B。其中,A需为方阵,即矩阵的行列数相等,B为标量。A^B的运算即相当于B个矩阵A相乘 |
5.矩阵的特殊运算
- 行列式运算
函数det用于计算矩阵的行列式。如果矩阵为方阵,则其存在行列式,可通过函数det计算出矩阵的行列式值,此值为一标量
- 逆运算
在线性代数中,若矩阵A是方阵,且为非奇异阵,即行列式值不为0,存在矩阵x使Ax=I和xA=I,x称为矩阵A的逆矩阵,记做A-1。在MATLAB中用函数inv()来计算矩阵的逆运算
- 秩运算
矩阵中线性无关的行数与列数称为矩阵的秩。在MATLAB 7.0中,函数rank()用于求矩阵的秩
- 特征值运算
1 | e=eig(x):其中e是由特征值组成的列向量,x是输入的方矩阵 |
6.数组特殊运算
在MATLAB中,数组的特殊运算主要包括关系运算、逻辑运算和集合运算,与一般的矩阵运算不同的是,这些运算都是基于数组中每个元素进行的
6.1 关系运算
MATLAB中的关系运算主要用于判断数组的大小关系,关系成立返回“1”,关系不成立则返回“0”。MATLAB中提供的关系符有大于(>),小于(<),大于等于(>=),小于等于(<=),等于(==),不等于(~=)。
其中,关系运算用于比较的两个对象如果都是数组,则要求数组大小相同,因为关系运算是判断两个数组相应位置上元素的大小关系;而如果比较的对象中有一个为标量,即标量与数组中每个元素进行比较。通过数组的关系运算可以方便地判断数组中元素的大小关系,同时数组与标量的关系运算也比较常用,结合查找函数find可以查找到符合一定条件的数组元素对应的位置信息
1 | 数组大于运算:C=A>B C=(A>B) C=gt(A,B) |
6.2 逻辑运算
MATLAB中提供的逻辑运算主要有与运算(&)、或运算(|)、非运算(~)、异或运算(xor)、快速逻辑与运算(&&)、快速逻辑或运算(||)和逻辑函数all、any
1 | 与运算(&):C=A&B,当数组A、B相应位置上的元素都为非零元素,即返回1,否则返回0 |
7.向量及其运算
7.1 向量的生成
只有一行或一列元素的数组或矩阵即为向量,向量可以看成一维的数组或矩阵。向量可分为行向量和列向量
- 使用冒号法生成向量
1 | 利用冒号法生成向量主要用于生成具有等间隔的向量,其格式为:x0:xstep:xend。其中,x0为向量的初始值,xstep为步长,xend为终止值 |
- 函数法生成向量
1 | linspace(a,b,n):a和b是生成向量的初值和终值,n是向量中元素的个数。当n默认时,默认生成a~b范围内的100个元素 |
7.2 向量的运算
常用函数
- 判断是否为向量:
isvector(x)
函数 - 向量内积:
dot(A,B)
函数 - 向量外积:
cross(A,B)
函数
- 判断是否为向量:
集合运算
- 交集:
intersect(A,B)
函数 - 并集:
union(A,B)
函数 - 差集:
setdiff(A,B)
函数 - 异或:
setxor(A,B)
函数、
- 交集:
8.高维数组操作
除上面的矩阵、数组、向量外,MATLAB还支持高维数组的使用,高维数组即二维以上的数组。不过一般情况下高维数组多用于存储数组,特别在图像处理中,对于一幅图像数据,多存储为高维数组
8.1 高维数组创建
- 直接输入法
通过给相应下标的数组元素赋值实现。**==三维数组在原来矩阵的行、列基础上,增加了页作为第三维数组的表示==**
- 函数法
使用zeros、ones、rand、repmat、reshape、cat等函数
1 | flipdim(A,dim)函数:实现高维数组的翻转操作 |
其余注意点
Cell模式是MATLAB的一大特色,通过Cell模式的使用可以让用户在调试某一段代码块的时候,方便地重复运行,同时也向用户提供了代码块的思想。不同的功能可以设计成不同的代码块,分块执行代码,便于程序的执行、查错。
一段代码以%%标记后加一个空格即为代码块生成了Cell模式,光标移动到Cell模式中时,背景将变为浅黄色。按“Ctrl+Enter”组合键或者选择“Cell”→“Evaluate Current Cell”命令控制执行当前Cell模块下的代码。同时Cell模式的开启与关闭分别通过菜单项Enable Cell Mode和Disable Cell Mode控制
MATLAB提供了nargin()函数和nargout())函数输入/输出参数
为测试程序执行的快慢,可以采用tic和toc函数计算代码运行时间
1 | 输入控制语句: input命令 |
1 | MATLAB提供的可具有警告提示功能的语句主要有warning语句、error语句、errordlg语句,其调用格式如下: |
第三章 图形处理
1.基本绘图处理
1.1 常用函数
plot()
函数:二维图形绘制plotyy()
函数:双y轴图形绘制(适用于两组数据的数据范围相差较大但又希望放在同一图形中比较分析)loglog()
函数:对数坐标图形绘制(x,y轴均为对数的坐标系)semilogx()/semilogy()
函数:半对数坐标图形绘制fplot()
函数:符号函数绘制
根据函数的表达式自动调整自变量的范围,无须给函数赋值,直接生成能反映函数变化规律的图形,在函数变化快的区域,采用小的间隔,否则采用大的坐标间,使绘制的图形计算量与时间最小,而又能尽可能精确反映图形的变化。fplot()函数一般在对横坐标取值间隔没有明确要求,仅查看函数的大致变化规律的情况下使用
ezplot()
函数:符号函数绘制
与fplot函数的功能基本类似,可以方便地绘制表达式或函数的图形。不同的是该函数的表达式显示在图形的上方,同时对坐标轴可不加任何限制做图
grid
函数:图形栅格控制hold
函数:图形保持控制ishold
函数测试图形的保持状态,返回值“1”表示图形处于叠加状态,“0”表示图形处于覆盖状态ginput()
函数:读点函数(交互式的从MATLAB绘制的图形中读取点坐标)zoom
函数:图形缩放saves()
函数:按照指定格式保存图形print()
函数:图形打印(打印图形窗口的图形,必须紧跟在plot()
函数后使用)
1.2 MATLAB图形窗口
- 图形窗口创建:
figure()
函数 - 图形句柄:
h=figure
,返回新创建的图形窗口句柄到变量h中
1 | h = gcf:其中变量h返回当前图形窗口的句柄 |
- 图形窗口常用操作命令
1 | clf:清除当前图形窗口的图形 |
1.3 坐标控制
- 坐标轴范围设置
1 | axis([Xmin,Xmax,Ymin,Ymax]):设置坐标轴的范围,指定当前坐标轴x轴和y轴的范围,其中Xmin为x轴范围下限,Xmax为x轴范围上限,Ymin为y轴范围下限,Ymax为y轴范围上限 |
- 坐标轴刻度设置
1 | set(gca,'XTick',[XTickmin:XTickstep:XTickmax]):设置数字刻度的显示范围和精度,与图形做图数据范围相对应 |
- 坐标轴字体设置
1 | FontName属性:字体的类型属性,包括常用的字体类型 |
- 坐标轴边框设置
1 | XDir属性:控制X轴方向属性,默认状态下属性值为"normal(正常)",可选属性值有"reverse(逆转)" |
- 坐标轴显示控制
axis on和axis off控制,默认状态下开启
1.4 图形标注
1 | title()函数用于给当前图形坐标轴的正上方添加标题 |
1.5 窗口分割
subplot()函数用于图形窗口的分割,即在同一个图形窗口可以同时显示多个坐标轴的图形。此函数可以用于设置多图形的同时显示,便于观察比对。
subplot()函数的使用原理为首先把图形窗口分为多个区域,然后依次在各区域绘制图形,其调用格式如下。
subplot(m,n,p):函数把图形窗口分为m×n个绘图子区,在第p个绘图子区绘制图形,绘图子区的编号按行方向编号。
2.特殊二维图形
MATLAB为用户提供的特殊二维图形包括条形图、面积图、饼图、散点图、柱状图、罗盘图、羽毛图、矢量图、杆型图、阶梯图、极坐标图、等势图等
2.1 条形图
1 | bar()函数:绘制垂直条形图 |
2.2 直方图
直方图和条形图区别:
(1)直方图是用矩阵的面积表示各组数据的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,其高度与宽度均有实际意义。条形图是用条形的长度表示各数据的多少,其宽度则是固定的,可任意设置,无实际意义;
(2)直方图的各矩形由于分组数据的连续性,一般情况下是连续排列的,而条形图在条形没有设置过大的情况下是分开排列的
1 | hist()函数:绘制直方图 |
2.3 面积图
面积图将数据点显示为一组由线连接的点,并填充线下方的所有区域
1 | area()函数:绘制面积图 |
2.4 饼图
饼图是一个被划分为多个扇区的圆形图表,每个扇区代表一个数据项,描述各数据项占数据总和的比例
1 | pie()函数:绘制二维饼图 |
2.5 散点图
散点图将数据序列显示为一组点。在回归分析中较为常用,反映了因变量随自变量而变化的趋势,便于观察两者关系
1 | scatter()函数:绘制散点图 |
2.6 排列图
排列图又称累托(Pareto)图,用于寻找主要问题或主要原因所使用的图。它是由两个纵坐标、一个横坐标、几个按高低顺序依次排列的条形和一条累计百分比的折线组成。其中,左纵坐标表示频数,右纵坐标表示频率,横坐标表示各因素,按各因素高低从左到右显示,折线表示累积的频率。通过排列图可以较好的分析各因素的重要性
1 | pareto()函数:绘制排列图 |
2.7 罗盘图
罗盘图绘制于一个圆盘中,从原点出发的箭头,箭头在圆盘中的角度用于表示数据的角度,箭头的长短用于表示数据的大小
1 | compass()函数:绘制罗盘图 |
2.8 羽毛图
羽毛图是以箭头的形式绘制矢量数据,与罗盘图不同的是数据绘制于直角坐标系中
1 | feather()函数:绘制羽毛图 |
2.9 矢量图
矢量图通常和其他图形一起使用,用于显示数据的方向
1 | quiver()函数:绘制矢量图 |
2.10 杆型图
杆型图主要用来表示离散数据的变化规律,以离散的圆点表示每个数据点,并用线段把数据点和坐标轴连接起来,形如杆型
1 | stem()函数:绘制杆型图 |
2.11 阶梯图
1 | stairs()函数:绘制阶梯图 |
2.12 极坐标图
1 | polar()函数:绘制极坐标图,在笛卡儿坐标系平面上绘制该函数,且画出极坐标形式的栅格 |
2.13 等值线图
等值线图可用于绘制地理数据中的等高图、气象数据中的等势图等。等值线图在二维图形中把第三维中相同大小的数据连接为等值线,一定程度上可以表示第三维的信息,同时,等值线图相比三维图更容易观察数据之间的关系,被广泛地应用于各个领域
1 | contour()函数:绘制二维等值线图 |
2.14 曲线误差添加
1 | errorbar()函数:绘制曲线误差 |
3.三维图形
3.1 三维图形绘制
三维网格图形是指在三维空间内连接相邻数据点,形成网格。在MATLAB中绘制三维网格图的函数主要有mesh()、meshc()和meshz(),另外函数ezmesh()、ezmeshc()、ezmeshz()可根据函数表达式直接绘制相应的三维网格图
由于网格线是不透明的,绘制的三维网格图有时只能显示前面的图形部分,而后面的部分可能被网格线遮住了,没有显示出来。MATLAB中提供了命令hidden用于观察图形后面隐藏的网格
三维表面图也可以用来表示三维空间内数据的变化规律,与之前讲述的三维网格图的不同之处在于对网格的区域填充了不同的色彩。在MATLAB中绘制三维表面图的函数主要有surf()、surfc()和surfl()
1 | plot3()函数:绘制三维曲线 |