MATLAB学习笔记

注:本篇学习笔记来自《MATLAB从基础到精通》,书中采用MATLAB 7.0,因此后面相关函数在新版本MATLAB中可能需要做些修改才能运行。

第一章 MATLAB常用数据类型:

整型、浮点型、逻辑类型、结构体、元胞数组及字符串等

MATLAB数据类型在使用中与其他编程语言相比,有一个突出的特点,即不用对变量的数据类型进行定义,MATLAB软件会自动依据变量被赋值的情况,生成相应数据类型的数据。(和JavaScript有点像)

1.整型

1
2
>>whos	%查看工作空间变量
>>isinteger(value) %判断变量value数据类型是否是整型
  • intmin()intmax()函数可用于确定整型数据类型的数据范围(最大值和最小值),其中intmin()函数用于求数据类型的下限,intmax()函数用于求数据类型的上限。

2.浮点型

1
2
single()/double()函数:单精度/双精度浮点型(32/64位)
>> isfloat(value) %判断变量value数据类型是否是浮点型(是返回"1",否则返回"0")
  • 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
2
3
ischar(s):判断s数据类型是否为字符串	
isletter(s):判断s中每个字符元素是否为字母
isspace(s):判断s中每个字符元素是否为空格
  • 字符串访问

通过下标法来实现的,即根据字符元素在字符串中的位置来访问,其中位置的确定包括行列坐标和线性索引坐标两种方式。在MTALAB中字符数组是按列存储的。

  • 字符串查找和替换
1
2
3
4
5
strfind(str,s):在字符串str中查找字符s
findstr(s1,s2):在长字符串中查找短字符串
strrep(s1,s2,s3):在字符串s1中查找字符串s2并将其替换为字符串s3
i = strmatch(s1,s2):在字符串s1中匹配查找与字符串s2起始一致的字符行,返回行号
i = strmatch(s1,s2,’exact’):在字符串s1中匹配查找与字符串s2完全一致的字符行,返回行号
  • 字符串比较
1
2
3
k=strcmp(s1,s2):比较字符串s1和s2是否相同
k=strncmp(s1,s2,n):比较字符串s1和s2前n个字符是否相同
k=strcmpi(s1,s2):比较字符串s1和s2是否相同,不区分字符串字母的大小写
  • 字符串大小写转换
1
2
str=lower(s):将字符串s中的大写英文字母全部转换为小写
str=upper(s):将字符串s中的小写英文字母全部转换为大写
  • 字符串执行
1
2
3
eval()函数可用于字符串表达式的执行,函数的具体用法如下:
eval(expression):用于在命令行执行expression中的字符串表达式
[a1,a2,a3,...]=eval(‘function(b1,b2,b3,...)’):其中"function(b1,b2,b3,...)"为待执行的字符串表达式,"a1,a2,a3,..."为字符串表达式的输出结果
  • 字符串空格操作相关函数
1
2
3
4
str=strtok(s):查找字符串第一个空格前的字符,返回到字符串str中
str=deblank(s):去除字符串s末尾的空格,返回去除空格的字符串str
str=strtrim(s):删除字符串s头尾的空格,返回去除空格的字符串str
blanks(n):生成含n个空格的字符串

5.元胞数组

元胞数组是由可以包括任何数据类型的元胞组成的数组

5.1元胞数组创建
  • 直接赋值法:直接在命令行中给元胞数组的每个元素赋值,或者使用大括号“{ }”创建元胞数组
  • 函数法:使用cell()函数创建(先对元胞内存空间预分配,再对元胞中的元素进行赋值)
5.2元胞数组访问
  • 大括号访问元胞数组:可对其数据执行操作
  • 小括号访问元胞数组:不可对其数据执行操作
5.3元胞数组显示
1
2
3
4
celldisp(s):用于显示元胞数组s中的具体内容
celldisp(s,name):以字符串name为元胞名,显示元胞数组s中的具体内容
cellplot(s):以图形化的方式显示元胞数组s
cellplot(s,'legend'):以图形化的方式显示元胞数组s,同时显示不同数据类型的颜色图例标注
5.4元胞数组删除

元胞数组的删除主要是通过把需要删除的元胞赋值为空来实现。通过大括号和小括号访问元胞并将其置空,可以分别删除元胞数组的内容或整体

6.结构体

结构体数据类型可以把不同数据类型的变量放到同一个变量名下,通过不同“域”的概念对结构体中的不同数据进行赋值、操作。结构体中的数据存储在相应的“域”中

6.1结构体生成
  • 命令行直接赋值法:直接把不同类型的数据赋值给结构体变量不同的域中
1
2
3
4
5
6
7
结构与域之间用点号“.”连接,不同域中可保存不同数据类型的变量
>>ss.str='abc'
>>ss.num=[1 2 3]
>>ss
ss=
str:'abc'
num:[1 2 3]
  • 函数法:struct()函数创建结构体变量
1
s=struct('field1',values1,'field2',value2,...)	% “'field1'”和“'field2'”为域名,“values1”和“values2”为域中的值
6.2结构体操作
  • 结构体元素访问
  • 结构体显示
1
2
fieldnames()函数显示结构体的域名
getfield()函数显示结构体各域中的具体内容
  • 结构体删除
1
2
s = rmfield(ss,'field'):用于删除结构体中的域“field”
s = rmfield(ss,FIELDS):用于同时删除结构体中的多个域,FIELDS为需要删除的多个域的域名的字符串

7.不同数据类型转化

  • 数组与字符串转换
1
2
3
4
str = num2str(A):把数值型数据数组A转换为字符型数据,默认情况下转换的数据精度为5位有效数字
str = num2str(A,precision):按照指定的数据精度转换数组A到字符串类型数据str,precision为字符串中数据的有效位数
str = num2str(A,format):按照指定的数据格式转换数组A到字符串类型数据str。format的书写格式为%m1.m2g/f/e,其中m1指定总共显示的有效数字位数,m2代表小数点后的有效数字位数,“g”格式代表用指数或定点标记,“e”格式代表用指数标记,“f”格式代表用定点标记,与函数sprinf()的输出显示设置相同
x = str2num('str'):字符串转化为数组

int2str()函数和str2int()函数可以完成整型数据与字符串的转换,即取整数据与字符串的转换。mat2str()函数和str2mat()函数可以实现矩阵与字符串的转换,其用法类似于num2str()函数和str2num()函数,但不可以用于高维数组

  • 不同进制数据转换
1
2
3
dec2hex(x)和hex2dec(x):用于十六进制数和十进制数之间的相互转换
dec2bin(x)和bin2dec(x):用于二进制数和十进制数之间的相互转换
str=dec2base(d,base)和d=base2dec('strn',base):用于任意进制的数与十进制数之间的转换
  • 元胞数组与数值类型转换
1
2
c = num2cell(A):转换数组A到元胞数组c
c = num2cell(A,dims):按照指定的维数转换数组A到元胞数组c

char()函数和cellstr()函数用于元胞数组和字符串之间的转换;

cell2struct()函数和struct2cell()函数可用于元胞数组和结构体的转换

第二章 矩阵和数组

1.矩阵和数组的概念

数组为具有相同数据类型的数据组合,矩阵的概念主要应用于数学中,在MATLAB中矩阵一般即指二维数组,但是矩阵与数组在部分运算上又是有很大区别的

2.矩阵和数组创建

  • 直接输入法

同一行中的数据使用空格或者逗号分隔

分号表示每一行数据输入结束

所有数据都包含在方括号“[ ]”中

  • 函数法
1
2
3
4
5
6
7
8
9
10
zeros()函数:全零矩阵生成。一般用于初始变量创建时预留内存空间,在后面的计算中再为矩阵元素赋具体的值
eye()函数:单位矩阵生成。用法与全零矩阵生成方法类似,但是eye()函数不支持二维以上矩阵的生成
ones()函数:全1矩阵生成,用法同zeros()函数
rand()函数:随机矩阵生成。只用于生成0~1的平均分布的随机数,不包括0和1
randn()函数:用于生成均值为0,方差为1的正态分布的随机数,其他用法同rand()函数
randperm(n)函数:用于生成1:n随机分布的n个正整数
compan()函数:生成伴随矩阵,只适用于向量
magic()函数:生成魔方矩阵,矩阵每行、每列及两条对角线上元素和都相等
diag()函数:生成对角矩阵,即只有对角线上有非零元素的矩阵
triu()/tril函数:上/下三角矩阵,即对角线以下/上元素全为0的矩阵
  • 外部导入法

通过数据导入平台或者文件输入函数,把txt、excel、mat等文件中存储的数据导入MATLAB工作空间内,并以矩阵的形式存储数据

3.矩阵和数组基本操作

3.1 基本信息获取
  • 数据显示: disp(x)函数在命令行窗口输出矩阵x,不显示矩阵名(语句后不加分号也能显示)
  • 矩阵判断
1
2
3
4
5
isempty(A):判断矩阵是否为空,若为空返回1,否则返回0
空矩阵是指没有任何元素的矩阵,一般的使用过程中,对空矩阵执行操作会出错,因而在对矩阵进行一些操作前需要判断矩阵是否为空
isequal(A,B):判断矩阵A、B的数值是否相等,仅当A、B矩阵所有元素都相等时返回1,否则返回0
isfloat(A):判断矩阵A的数据类型是否为浮点型,如果是则返回1,否则返回0
isinteger(A):判断矩阵A的数据类型是否为整数型,如果是则返回1,否则返回0
  • 大小信息获取
1
2
3
4
size(X):用于获取矩阵X的行数和列数
length(X):用于获取矩阵X的长度,即矩阵行数或列数中的较大值
numel(X):用于获取矩阵X中元素个数总和
ndims(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
2
3
4
5
6
indices=find(X):查找矩阵X中的非零元素,返回矩阵X中非零元素的线性索引
indices=find(X,k):查找矩阵X中的非零元素,返回矩阵X中前k个非零元素的线性索引
indices=find(X,k,’last’):查找矩阵X中的非零元素,返回矩阵X中后k个非零元素的线性索引
[row,col]=find(X):查找矩阵X中的非零元素,返回矩阵X中非零元素的行列下标
[row,col]=find(X,k):查找矩阵X中的非零元素,返回矩阵X中前k个非零元素的行列下标
[row,col]=find(X,k,’last’):查找矩阵X中的非零元素,返回矩阵X中后k个非零元素的行列下标

4.矩阵及数组简单运算

4.1 基本函数
  • 连接函数

矩阵的连接包括水平方向左右连接和垂直方向上下连接,水平连接的矩阵需要具有相同的行数,垂直连接的矩阵需要具有相同的列数。而矩阵连接可以通过中括号“[]”或连接函数实现

1
2
3
4
5
[A;B] :用于垂直方向连接具有相同列数的矩阵A和B
[A B]或[A,B]:用于水平方向连接具有相同行数的矩阵A和B
cat(dim,A,B):在指定维数上连接矩阵A和B,其中cat(1,A,B)相当于[A;B],cat(2,A,B)相当于[A,B]和[A B]
horzcat(A,B):用于水平方向连接矩阵A和B
vertcat(A,B):用于垂直方向连接矩阵A和B
  • 翻转函数
1
2
3
4
fliplr(A):用于矩阵A的左右翻转,不适用于二维以上矩阵或数组
flipud(A):用于矩阵A的上下翻转,不适用于二维以上矩阵或数组
rot90(A):用于矩阵A逆时针90度翻转,rot90(A,k)可按逆时针方向90*k度旋转矩阵A
transpose(A):用于返回转置后的矩阵A,同A'
  • 改变矩阵大小

矩阵的大小即矩阵的行列数。在MATLAB 7.0中矩阵大小的改变可以通过添加、删除、拼接元素的方法来实现,同时可以通过函数重现排列、复制矩阵,达到改变矩阵大小的目的

1
2
3
4
B = reshape(A,m,n):用于重新排列矩阵A,返回大小为m×n的矩阵B,矩阵A的元素个数需要等于m×n
B = reshape(A,m,n,p,...):用于重新排列矩阵A,返回大小为m×n×p…的矩阵B,矩阵A的元素个数需要等于m×n×p…,用于高维数组的重排
B = reshape(A,...,[],...):重排矩阵A,其中一维的大小可以使用默认值
B = reshape(A,size):根据size函数得出的矩阵大小值重排矩阵

MATLAB 7.0提供了repmat()函数复制矩阵。矩阵的复制在矩阵运算中具有较大的用处,因为一般的矩阵加、减等运算要求矩阵具有相同的大小。而如果遇到一个矩阵每列(行)需要都加上或减去一个数值时,即矩阵与向量的操作,不同大小的矩阵无法相加减。如果通过循环,基于矩阵中每列(行)相加减,算法的效率不高,特别是当需要计算的矩阵很大时,对算法运行时间影响很大,而函数repmat()通过复制矩阵,可以向量生成与需要加、减的矩阵相同的矩阵,进行矩阵间的运算,算法效率较高

1
2
B = repmat(A,m,n):以A为重复单元,把A看做整体,返回m×n个A组成的矩阵B
B = repmat(A,n):以A为重复单元,把A看做整体,返回n×n个A组成的矩阵B
  • 其他常用函数
1
2
3
4
5
6
7
B=unique(A):去除矩阵A中的重复元素,返回无重复元素的A到新变量B,B以向量形式存在,并按从小到大的顺序排列A中无重复的元素
[B, m, n]=unique(A):去除A中重复元素,返回无重复元素的A到新向量B,m为B在A中的线性索引值,即b=A(m),n为A在B中的索引值,即A=b(n)
B=unique(A,'rows'):去除矩阵A中的重复行,返回新矩阵B,其中矩阵B中行的排列是按照第一列元素从小到大排列,如果第一列元素相同,则依次比较后面的列
[B, m, n]=unique(A,'rows'):去除矩阵A中的重复行,返回新矩阵B,m为矩阵B在A中对应的行索引,即B=A(m,:),n为矩阵A在B中对应的行索引,即A=B(n,:)

indces=sub2ind(size, i, j):用于把矩阵的行列下标转换为线性索引下标,其中size为需要转换的矩阵的维数,i和j分别为需要转换的行、列下标值,indices返回大小为size的矩阵i行j列对应的线性索引值
[i,j] = ind2sub(size, indces):用于将矩阵的线性索引下标转换为行列下标,其中size为需要转换的矩阵的维数,indices为需要转换的线性索引下标值,函数返回的i和j分别为indices对应的行、列下标值
4.2 加减运算

矩阵的加减运算要求相加减的矩阵有相同的维数,即相同的行列数,与线性代数中的运算法则是相同的

4.3 乘法运算

矩阵与数组在乘法运算中有所区别,矩阵的乘法是线性代数中常用的运算,要求被乘矩阵的列数等于相乘矩阵的行数。而数组的乘法是点乘运算,即数组具有相同下标的元素相乘,运算时在一般乘法运算的“*”前加上“.”,需要两数组具有相同的维数

C=A*B:用于矩阵的乘法,要求矩阵A的列数等于矩阵B的行数

C=A.*B:用于数组的乘法,要求矩阵A和B具有相同的大小

注意,如果A和B中有一个为标量,则不需要遵守上述规则,标量与矩阵中每个元素相乘

4.4 除法运算

矩阵的除法与数组的除法有一定差异,其中矩阵的除法对应与线性代数中的逆运算相关,而数组的除法则是点除,是数组中相同下标元素的相除。同时除法运算又分为左除和右除

  • 矩阵的除法
1
2
A\B:矩阵的左除,如果A为方阵,即n*n阶矩阵,可用于计算方程Ax=B的解,等效于inv(A)*B
B/A:矩阵的右除,用于计算方程xA=B的解,等效于B*inv(A)
  • 数组的除法
1
2
A./B:数组的左除,即A(i,j)/B(i,j)
A.\B:数组的右除,即B(i,j)/A(i,j)

注意,如果A是标量,数组的左除A./B即A除以矩阵数组B的每一个元素,右除A.\B即矩阵数组B的每个元素除以标量A;如果B是标量,则数组的左除A./B即矩阵数组A的每个元素除以B,右除A.\B即标量B除以矩阵数组A的每一个元素

4.5 乘方运算

矩阵与数组在乘方运算中也有不同,矩阵的乘方相当于多个矩阵相乘,而数组的乘方即数组中每个元素的乘方运算

1
2
矩阵的乘方运算:C=A^B。其中,A需为方阵,即矩阵的行列数相等,B为标量。A^B的运算即相当于B个矩阵A相乘
数组的乘方运算:C=A.^B。其中,当A、B都为数组时,需大小相等;C(i,j)的计算结果即为A(i,j)的B(i,j)次方;如果A为标量,A.^B的运算即相当于分别对元素A做B(i,j)次方;如果B为标量,A.^B的运算即相当于对数组A中的每个元素做B阶乘方运算

5.矩阵的特殊运算

  • 行列式运算

函数det用于计算矩阵的行列式。如果矩阵为方阵,则其存在行列式,可通过函数det计算出矩阵的行列式值,此值为一标量

  • 逆运算

在线性代数中,若矩阵A是方阵,且为非奇异阵,即行列式值不为0,存在矩阵x使Ax=I和xA=I,x称为矩阵A的逆矩阵,记做A-1。在MATLAB中用函数inv()来计算矩阵的逆运算

  • 秩运算

矩阵中线性无关的行数与列数称为矩阵的秩。在MATLAB 7.0中,函数rank()用于求矩阵的秩

  • 特征值运算
1
2
e=eig(x):其中e是由特征值组成的列向量,x是输入的方矩阵
[v,d]=eig(x):方阵x的全部特征值,构成对角阵d,其对角线即为特征值,v是一个与x相同大小的矩阵,每一列是矩阵x的一个特征值所对应的特征向量

6.数组特殊运算

在MATLAB中,数组的特殊运算主要包括关系运算、逻辑运算和集合运算,与一般的矩阵运算不同的是,这些运算都是基于数组中每个元素进行的

6.1 关系运算

MATLAB中的关系运算主要用于判断数组的大小关系,关系成立返回“1”,关系不成立则返回“0”。MATLAB中提供的关系符有大于(>),小于(<),大于等于(>=),小于等于(<=),等于(==),不等于(~=)。

其中,关系运算用于比较的两个对象如果都是数组,则要求数组大小相同,因为关系运算是判断两个数组相应位置上元素的大小关系;而如果比较的对象中有一个为标量,即标量与数组中每个元素进行比较。通过数组的关系运算可以方便地判断数组中元素的大小关系,同时数组与标量的关系运算也比较常用,结合查找函数find可以查找到符合一定条件的数组元素对应的位置信息

1
2
3
4
5
6
数组大于运算:C=A>B	C=(A>B)		C=gt(A,B)
数组大于等于运算:C=A>=B C=(A>=B) C=ge(A,B)
数组小于运算:C=A<B C=(A<B) C=lt(A,B)
数组小于等于运算:C=A<=B C=(A<=B) C=le(A,B)
数组等于运算:C=A==B C=(A==B) C=eq(A,B)
数组不等于运算:C=A~=B C=(A~=B) C=ne(A,B)
6.2 逻辑运算

MATLAB中提供的逻辑运算主要有与运算(&)、或运算(|)、非运算(~)、异或运算(xor)、快速逻辑与运算(&&)、快速逻辑或运算(||)和逻辑函数all、any

1
2
3
4
5
6
7
8
与运算(&):C=A&B,当数组A、B相应位置上的元素都为非零元素,即返回1,否则返回0
或运算(|):C=A|B,当数组A、B相应位置上的元素至少一个为非零元素,即返回1,否则返回0
非运算(~):C=~A,当数组A相应位置上的元素都为非零元素,即返回0,否则返回1
异或运算(xor):C=xor(A,B),当数组A、B相应位置上的元素一个为非零元素,一个为零,即返回1,否则返回0
快速逻辑与运算(&&):C=A&&B,其中,A、B需为逻辑变量或标量,当A、B都为真或为标量时不为0,即返回1,否则返回0。在进行快速逻辑与运算的时候,如果A已发现是零,则不去判断B是否为零,直接返回结果“0”;但是如果A为1,即仍然要判断B是否为零
快速逻辑或运算(||):C=A||B,A、B需为逻辑变量或标量,当A、B存在一个为真或一个标量不为0,即返回1,否则返回0。快速逻辑或运算当A判断结果为非零后,无须继续判断B,即返回结果“1”;如果A为零,则需进一步判断B是否为非零
all(x):判断数组x中的元素是否都为非零元素,是则返回“1”,否则返回“0”。当x为数组时,默认对列数据进行判断,即判断数组中各列元素是否都为非零元素。而如果需要判断行元素是否都为非零元素即指定判断的维数,all(x,dim),其中dim=2用于行数据判断
any(x):判断数组x中的元素是否存在任何一个元素为非零元素,是则返回“1”,否则返回“0”。当x为数组时,默认对列数据进行判断,即判断数组中各列元素是否都为非零元素。而如果需要判断行元素是否存在非零元素即指定判断的维数,any(x,dim),其中dim=2用于行数据判断

7.向量及其运算

7.1 向量的生成

只有一行或一列元素的数组或矩阵即为向量,向量可以看成一维的数组或矩阵。向量可分为行向量和列向量

  • 使用冒号法生成向量
1
利用冒号法生成向量主要用于生成具有等间隔的向量,其格式为:x0:xstep:xend。其中,x0为向量的初始值,xstep为步长,xend为终止值
  • 函数法生成向量
1
2
linspace(a,b,n):a和b是生成向量的初值和终值,n是向量中元素的个数。当n默认时,默认生成a~b范围内的100个元素
logspace(a,b,n):10a和10b是生成向量的初值和终值,n是向量中元素的个数。当n默认时,默认生成10a~10b范围内的50个元素
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
2
flipdim(A,dim)函数:实现高维数组的翻转操作
A为需要翻转的数组,dim为翻转的基准维数,当dim为3时即对高维数组按页翻转

其余注意点

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
2
3
4
5
输入控制语句: input命令
键盘输入语句: keyboard命令
暂停语句: pause命令
指令显示控制语句: echo命令
返回语句: return命令
1
2
3
4
5
MATLAB提供的可具有警告提示功能的语句主要有warning语句、error语句、errordlg语句,其调用格式如下:
warning('message'):"message"中为程序出错的提示信息,出错警告后,程序继续执行
error('message'):"message"中为程序出错的提示信息,出错警告后,程序将终止运行
errordlg('errorstring'):"errorstring"中为程序出错的提示信息,显示在警告对话框中,出错警告后,单击"ok"按钮,结束弹出式出错提示框,但代码仍会执行完毕
errordlg('errorstring','dlgname'):弹出警告对话框,'dlgname'为对话框中的标题

第三章 图形处理

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
2
3
4
5
6
7
h = gcf:其中变量h返回当前图形窗口的句柄
h = gca:其中变量h返回当前坐标轴对象的句柄
h = gco:其中变量h返回当前对象的句柄
h=findobj:返回根对象与其所有子对象的句柄值

get(h)函数用于获取指定句柄下的图形对象的属性
set(h)函数用于设置指定句柄下的图形对象的属性
  • 图形窗口常用操作命令
1
2
3
4
5
clf:清除当前图形窗口的图形
cla:清除当前图形窗口坐标轴内的图形,保留坐标轴
delete()函数用于删除文件或图形对象,将永久性地删除文件,文件不进入回收站
close()函数用于关闭指定的图形窗口
reset()函数用于重置图形窗口的属性,使其恢复为默认值
1.3 坐标控制
  • 坐标轴范围设置
1
2
3
4
5
6
axis([Xmin,Xmax,Ymin,Ymax]):设置坐标轴的范围,指定当前坐标轴x轴和y轴的范围,其中Xmin为x轴范围下限,Xmax为x轴范围上限,Ymin为y轴范围下限,Ymax为y轴范围上限
axis([xmin xmax ymin ymax zmin zmax cmin cmax]):设置坐标轴x轴、y轴和z轴的范围,以及坐标轴的颜色显示范围
xlim([xmin xmax]):仅设置x轴范围
ylim([ymin ymax]):仅设置y轴范围
zlim([zmin zmax]):仅设置z轴范围
axis tight:按紧凑方式显示坐标轴范围,即坐标轴范围为绘图数据范围
  • 坐标轴刻度设置
1
2
3
set(gca,'XTick',[XTickmin:XTickstep:XTickmax]):设置数字刻度的显示范围和精度,与图形做图数据范围相对应
set(gca,'XTickLabel',[XTickLabelmin:XTickLabelstep:XTickLabelmax]):设置坐标轴刻度线下的数值显示,默认状态下为做图数据相应坐标轴数据范围和刻度
set(gca,'XTickLabel',string):设置文本坐标轴刻度。坐标系横纵坐标轴刻度的比例往往是根据数据自动设置的,比例有时可能不一样,通过执行语句axis equal可以获得等比例的坐标轴刻度
  • 坐标轴字体设置
1
2
3
4
FontName属性:字体的类型属性,包括常用的字体类型
FontSize属性:字体的大小属性
FontUnits属性:字体的单位属性
FontWeight属性:字体样式属性,包括normal(正常)、bold(加粗)、light(倾斜)、demi(黑体)
  • 坐标轴边框设置
1
2
3
4
XDir属性:控制X轴方向属性,默认状态下属性值为"normal(正常)",可选属性值有"reverse(逆转)"
XColor属性:设置X轴边框的颜色属性
LineStyleOrder属性:设置坐标轴边框的线条类型属性
LineWidth属性:设置坐标轴边框的线条颜色属性
  • 坐标轴显示控制

axis on和axis off控制,默认状态下开启

1.4 图形标注
1
2
3
4
title()函数用于给当前图形坐标轴的正上方添加标题
xlabel()/ylabel()函数给x轴和y轴坐标轴设置
text()函数用于文本标注 gtext()函数用于交互式文本标注
legend()函数用于添加图例标注
1.5 窗口分割

subplot()函数用于图形窗口的分割,即在同一个图形窗口可以同时显示多个坐标轴的图形。此函数可以用于设置多图形的同时显示,便于观察比对。

subplot()函数的使用原理为首先把图形窗口分为多个区域,然后依次在各区域绘制图形,其调用格式如下。

subplot(m,n,p):函数把图形窗口分为m×n个绘图子区,在第p个绘图子区绘制图形,绘图子区的编号按行方向编号。

2.特殊二维图形

MATLAB为用户提供的特殊二维图形包括条形图、面积图、饼图、散点图、柱状图、罗盘图、羽毛图、矢量图、杆型图、阶梯图、极坐标图、等势图等

2.1 条形图
1
2
bar()函数:绘制垂直条形图
barh()函数:绘制水平条形图
2.2 直方图

直方图和条形图区别:

(1)直方图是用矩阵的面积表示各组数据的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,其高度与宽度均有实际意义。条形图是用条形的长度表示各数据的多少,其宽度则是固定的,可任意设置,无实际意义;

(2)直方图的各矩形由于分组数据的连续性,一般情况下是连续排列的,而条形图在条形没有设置过大的情况下是分开排列的

1
2
hist()函数:绘制直方图
rose()函数:在极坐标内绘制直方图
2.3 面积图

面积图将数据点显示为一组由线连接的点,并填充线下方的所有区域

1
area()函数:绘制面积图
2.4 饼图

饼图是一个被划分为多个扇区的圆形图表,每个扇区代表一个数据项,描述各数据项占数据总和的比例

1
2
pie()函数:绘制二维饼图
pie3()函数:绘制三维饼图
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
2
3
contour()函数:绘制二维等值线图
contourf()函数:绘制带填充的二维等值线图
clabel()函数:在等值线图上添加数据标签
2.14 曲线误差添加
1
errorbar()函数:绘制曲线误差

3.三维图形

3.1 三维图形绘制

三维网格图形是指在三维空间内连接相邻数据点,形成网格。在MATLAB中绘制三维网格图的函数主要有mesh()、meshc()和meshz(),另外函数ezmesh()、ezmeshc()、ezmeshz()可根据函数表达式直接绘制相应的三维网格图

由于网格线是不透明的,绘制的三维网格图有时只能显示前面的图形部分,而后面的部分可能被网格线遮住了,没有显示出来。MATLAB中提供了命令hidden用于观察图形后面隐藏的网格

三维表面图也可以用来表示三维空间内数据的变化规律,与之前讲述的三维网格图的不同之处在于对网格的区域填充了不同的色彩。在MATLAB中绘制三维表面图的函数主要有surf()、surfc()和surfl()

1
2
3
4
5
6
7
8
9
10
11
plot3()函数:绘制三维曲线
meshgrid()函数:生成网格数据
mesh()函数:绘制三维网格图
meshc()函数:绘制带有等值线的三维网格图,不支持对图形网格线或等高线指定属性设置
meshz()函数:绘制带有图形底边的三维网格图,不支持对图形网格线指定属性的设置
contour3()函数:绘制三维等值线图,即在三维栅格图形上进一步添加等值线(类似于二维等值线图绘制函数contour())
slice()函数:绘制三维切片图,三维切片图可形象地称为“四维图”,可以在三维空间内表达第四维的信息,用颜色来标识第四维数据的大小
waterfall()函数:瀑布图
cylinder()函数:生成关于z轴旋转对称的柱面体,结合surf()或mesh()生成柱面体的三维曲面图
sphere()函数:在直角坐标系内绘制球形图
ellipsoid()函数:生成绘制椭圆球体图的坐标数据,结合surf()或mesh()绘制三维椭球体图