MATLAB基础知识(01)

MathWorks公司创立于 1984 年,是领先的为工程师和科学家提供数学计算软件的供应商,旗下产品包括MATLAB产品家族、Simulink产品家族及 PolySpace产品家族。

MATLAB是矩阵实验室(Matrix Laboratory)的简称,是一种用于算法开发、数据可视化、数据分析及数值计算的高级技术计算语言和交互式环境。MATLAB的应用范围非常广,包括信号和图像处理、通信、控制系统设计、测试和测量、财务建模和分析,以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了MATLAB的使用环境,以解决这些应用领域内特定类型的问题。

Simulink是一个用于对动态系统进行多域建模和模型设计的平台。它提供了一个交互式图形环境,以及一个自定义模块库,并可针对特定应用加以扩展,可应用于控制系统设计、信号处理和通信及图像处理等众多领域。

PolySpace提供代码验证,可确保消除源代码中的溢出、除零、数组访问越界及其他运行错误。此类产品可以证明源代码中不存在某些运行错误,使工程师能够选择并跟踪嵌入式软件质量的指标和阈值,帮助软件团队更好地定义质量目标,并更快地实施。该软件已经在汽车、航空、国防及工业自动化和机械行业中得到广泛应用。

目前,经常使用的MATLAB软件集成了MATLABSimulink两大模块;而PolySpace 是独立于MATLAB 软件之外的,需要单独安装。

数学软件 备注
Mathematica Mathematica是一个综合的数学软件环境,具有数值计算、符号推导、数据可视化和编程等多种功能,在符号计算领域有很高的知名度。Mathematica软件分为两大部分:KemelFrontEndKemel是软件的计算中心,而FrontEnd负责与用户的交流,两者有一定的独立性。Mathematica的表达式含义十分丰富,几乎包含了一切要处理的对象。
Maple Maple是世界上较优秀的几款数学软件之一。它以友善的使用环境、强大的符号处理、精确的数值计算、灵活的图形显示、高效的编程功能为越来越多的教师、学生和科研人员所喜爱,并成为数学处理的首选工具。由于Maple软件原是为符号计算而设计的,因此在数值计算与绘图方面的运算速度要比MATLAB慢。Maple的帮助系统是用英语写的,这给英文差的人们带来了不便。

MATLAB作为和MathematicaMaple并列的三大数学软件之一,强项就是其强大的矩阵计算及仿真能力。每次 MathWorks公司发布MATLAB的同时,也会发布仿真工具SimulinkMATLAB以其良好的开放性和运行的可靠性,已经成为国际控制界公认的标准计算软件,MATLAB在数值计算方面独占鳌头。

  • 计算功能强大;
  • 绘图方便:它包括强力的二维及三维图形函数、图像处理和动画显示等函数;
  • 功能强大的工具箱(应用程序):功能性工具箱和学科性工具;
  • 帮助功能完整。

clc:清除命令窗口的内容,对工作环境中的全部变量无影响;

close:关闭当前的Figure窗口;

close all:关闭所有的Figure窗口;

clear:清除工作空间的所有变量;

clear all:清除工作空间所有变量、函数、MEX文件;

disp:用来展示变量的内容,可以是字符串、元胞、矩阵、结构体;

调用帮助:help ~;或demos;或doc;

whos函数:用来列出当前工作区中的变量名及它们的详细信息,如 size(大小)、bytes(字节)及class(数据类型)等;

数组/矩阵索引:从1开始;

命令行小细节:当命令后面有分号(半角符号格式)时,按Enter键后,命令行窗口中不显示运算结果;如果无分号,则在命令行窗口中显示运算结果。当希望先输入多条语句,然后再同时执行它们时,则在输入下一条命令时,要在按住Shift键的同时按Enter键进行换行输入。

⛄数据类型

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这 6 种基本的数据类型都是按照数组形式存储和操作的。

数值类型

基本的数值类型主要有整数、单精度浮点数和双精度浮点数。MATLAB中数值类型的数据包括有符号和无符号整数、单精度浮点数和双精度浮点数。在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作,相对于双精度浮点数格式,整数型与单精度浮点型的优点在于节省变量占用的内存空间,当然首先要在满足精度要求的前提下。

整数类型

MATLAB中提供了8种内置的整数类型,这8种类型的存储占用位数、能表示的数值范围和转换函数均不相同。不同的整数类型所占用的位数不同,因此能够表示的数值范围也不同。在实际应用中,应根据实际需要合理选择合适的整数类型。

整数类型 数值范围 转换函数
有符号 8 位整数 -27~27-1 int8
无符号 8 位整数 0~28-1 uint8
有符号 16 位整数 -215~215-1 int16
无符号 16 位整数 0~216-1 uint16
有符号 32 位整数 -231~231-1 int32
无符号 32 位整数 0~232-1 uint32
有符号 64 位整数 -263~263-1 int64
无符号 64 位整数 0~264-1 uint64

由于 MATLAB中数值的默认存储类型是双精度浮点类型,因此将变量设置为整数类型时,需要使用相应的转换函数,将双精度浮点数转换为指定的整数类型。MATLAB中还包含了几类不同运算法则的取整函数,也可以把浮点数转换成整数。在不超出数值范围的情况下,任意两个整数类型之间也可以通过转换函数进行相互转换。同时,由于不同的整数类型能够表示的数值范围不同,因此当运算结果超出相应的整数类型能够表示的范围时,就会出现一处错误,运算结果被置为该整数类型能够表示的最大值或最小值。

函数 运算法则 示例
floor(x) 向下取整 floor(1.2)=1;floor(2.5)=2;floor(-2.5)= -3
ceil(x) 向上取整 ceil(1.2)=2;ceil(2.5)=3;ceil(-2.5)=-2
round(x) 四舍五入 round(1.2)=1;round(2.5)=3;round(-2.5)=-3
fix(x) 向0取整 fix(1.2)=1;fix(2.5)=2;fix(-2.5)=-2
浮点数类型

MATLAB中提供了单精度浮点数类型和双精度浮点数类型,其存储位宽、能够表示的数值范围、数值精度各方面均不相同,单精度浮点类型的占用位数少,因此占用内存小,但能够表示的数值范围和数值的精度都比双精度浮点类型小。

浮点类型 存储位宽 数值范围 转换函数
单精度 32 -3.40282e+038 ~-1.17549e-038
1.17549e-038 ~ 3.40282e+038
single
双精度 64 -1.79769e+308 ~-2.22507e-308
2.22507e-308 ~ 1.79769e+308
double

双精度浮点数参与运算时,返回值的类型依赖于参与运算的其他数据类型。参与运算的其他数据为逻辑型、字符型时,返回结果为双精度浮点型;参与运算的其他数据为整数型时,返回结果为相应的整数类型;参与运算的其他数据为单精度浮点型时,返回结果为相应的单精度浮点型。

MATLAB中,单精度浮点类型不能与整数类型进行算术运算。

复数

复数包括实部和虚部两部分。MATLAB中默认使用字符ij作为虚部标志。创建复数时,可以直接按照复数形式进行输入或者利用 complex函数。

函数 说明 函数 说明
real(z) 返回复数 z 的实部 imag(z) 返回复数 z 的虚部
abs(z) 返回复数 z 的模 angle(z) 返回复数 z 的辐角
conj(z) 返回复数 z 的共轭复数 complex(a,b) 以 a 为实部、b 为虚部创建复数
无穷量(Inf)和非数值量(NaN

MATLAB中使用Inf-Inf分别代表正无穷量和负无穷量,NaN表示非数值量。正负无穷量的产生一般是由于运算溢出,产生了超出双精度浮点数数值范围的结果,非数值量则是由于0/0Inf/Inf类型的非正常运算而产生的,这两个NaN彼此是不相等的。

逻辑类型

逻辑类型的数据是指布尔类型的数据及数据之间的逻辑关系。作为所有关系和逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。所有关系和逻辑表达式的输出:对于真,输出为1;对于假,输出为0。逻辑类型数据进行运算时需要用到关系操作符和逻辑运算符。

关系操作符 说明
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
~= 不等于

MATLAB关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。在后一种情况中,标量和数组中的每一个元素相比较,结果与数组大小一样。

逻辑运算符 说明
&
|
~

xor(x , y )指令的功能为异或运算,x和y同为零(假)或非零(真)时返回0,否则返回1。
any(x)指令的功能为判断是否为零向量或零矩阵(即向量或矩阵中的元素全部为零),如果是零向量或零矩阵,则返回1,否则返回0。

MATLAB 还提供了大量的函数,在运算过程中用来测试特殊值或条件是否存在,并返回相应的表示结果的逻辑值。

函数名称 函数功能
finite 元素有限,返回真值
Isempty 参量为空,返回真值
isglobal 参量是一个全局变量,返回真值
ishold 当前绘图保持状态是“ON”,返回真值
isieee 计算机执行 IEEE 算术运算,返回真值
isinf 元素无穷大,返回真值
isletter 元素为字母,返回真值
isnan 元素为不定值,返回真值
isreal 参量无虚部,返回真值
isspace 元素为空格字符,返回真值
isstr 参量为一个字符串,返回真值
isstudent MATLAB 为学生版,返回真值
isunix 计算机为 UNIX 系统,返回真值

字符和字符串

一个字符串是存储在一个行向量中的文本,这个行向量中的每一个元素代表一个字符。实际上,元素中存放的是字符的内部代码,即ASCII码。由于字符串是以向量的形式来存储的,因此可以通过它的下标对字符串中的任何一个元素进行访问。字符矩阵也可以通过下标索引进行访问,但是矩阵的每行字符数必须相同。

String =
    'Every good boy does fun.'
>> size(String)

ans =
     1    24
>> whos 
  Name        Size            Bytes  Class     Attributes

  String      1x24               48  char                
  ans         1x2                16  double   

一个字符串是由单引号括起来的简单文本。在字符串里的每个字符是数组里的一个元素,字符串的存储要求每个字符8字节,如同MATLAB的其他变量。

>> String ='Every good boy does fun.'
String =
    'Every good boy does fun.'
>> a = String(7:10) 
a =
    'good'
>> b = String(10:-1:7) 
b =
    'doog'

字符串内的单引号是由两个连续的单引号来表示的。字符串的连接可以直接将字符串数组连接来实现。

>> String ='It''s not the manual!'
String =
    'It's not the manual!'
>> U ='Hello,'; 
>> V =' world!'; 
>> W = [U V] 
W =
    'Hello, world!'

函数句柄

MATLAB平台中,对函数的调用方法分为直接调用法和间接调用法。

  • 直接调用函数,被调用的函数通常被称为子函数。但是子函数只能被与其M文件同名的主函数或在M文件中的其他函数所调用,同时在一个文件中只能有一个主函数。
  • 而使用函数句柄对函数进行调用则避免了上述问题。函数句柄实际上提供了一种间接调用函数的方法。创建函数句柄需要用到操作符@。对MATLAB库函数中提供的各种M文件中的函数和使用者自主编写的程序中的内部函数,都可以创建函数句柄,从而可以通过函数句柄来实现对这些函数的间接调用。

创建函数句柄的一般句法格式为:

Function_Handle = @Function_Filename; 
% Function_Filename是函数所对应的M文件的名称或MATLAB内部函数的名称。
% @是句柄创建操作符。
% Function_Handle变量保存了这一函数句柄,并在后续的运算中作为数据流进行传递。

例如,F_Handle=@cos就创建了MATLAB内部函数cos的句柄,并将其保存在F_Handle变量中,后续的运算过程中就可以通过F_Handle(x)来实现cos(x)的功能。

结构体类型

MATLAB中的结构体与C语言中的结构体类似,一个结构体可以通过字段存储多个不同类型的数据。因此,结构体相当于一个数据容器,把多个相关联的不同类型的数据封装在一个结构体对象中。

一个结构体中可以具有多个字段,每个字段又可以存储不同类型的数据,通过这种方式就把多个不同类型的数据组织在一个结构体对象中。创建结构体对象的方法有两种,可以直接通过赋值语句给结构体的字段赋值,也可以使用结构体创建函数struct

(1)直接赋值创建

通过字段赋值创建结构体。在对结构体的字段进行赋值时,赋值表达式的变量名使用“结构体名称.字段名称”的形式书写,对同一个结构体可以进行多个字段的赋值。

Student.Name='Sam'; 
Student.Grade=6; 
Student.Subject={'Chinese','Math','English'}; 
Student.Result={99,99,99}; 

% 输出结果
>> Student
Student = 
  包含以下字段的 struct:
       Name: 'Sam'
      Grade: 6
    Subject: {'Chinese'  'Math'  'English'}
     Result: {[99]  [99]  [99]}
% Student 是一个 1×1 的结构体数组
>> whos
  Name         Size		Bytes  Class     Attributes

  Student      1x1			1450  		   struct  

(2)函数struct创建

struct函数的句法形式为:StrArray = struct('field1', var1, 'field2', var2,…,'fieldn', varn)

在进行字段赋值操作时,没有明确赋值的字段,MATLAB默认赋值为空数组。通过圆括号索引进行字段赋值,还可以创建任意尺寸的结构体数组。需要注意的是,同一个结构体数组中的所有结构体对象具有相同的字段组合。

Schedule(2)=struct('Day','Thursday','Time','15:00','Number',18) 
ScheduleArray=repmat(struct('Day','Thursday','Time','15:00','Number',18),1,2) 
newArray=struct('Day',{'Thursday','Friday'},'Time',{'15:00','9:00'}, 'Number',{18,6}) 

% 输出结果
Schedule = 
  包含以下字段的 1×2 struct 数组:
    Day
    Time
    Number
ScheduleArray = 
  包含以下字段的 1×2 struct 数组:
    Day
    Time
    Number
newArray = 
  包含以下字段的 1×2 struct 数组:
    Day
    Time
    Number
% 获取结构体某个元素
% 结构体第一个元素没有赋值,因此所有字段均为空数组
>> Schedule(1) 
ans = 
  包含以下字段的 struct:
       Day: []
      Time: []
    Number: []
% 1×2 的结构体数组ScheduleArray的两个元素完全相同
>> ScheduleArray(1) 
ans = 
  包含以下字段的 struct:
       Day: 'Thursday'
      Time: '15:00'
    Number: 18
>> ScheduleArray(2) 
ans = 
  包含以下字段的 struct:

       Day: 'Thursday'
      Time: '15:00'
    Number: 18
% newArray结构体中包含的结构体对象具有相同的字段组合
>> newArray(1) 
ans = 
  包含以下字段的 struct:
       Day: 'Thursday'
      Time: '15:00'
    Number: 18
>> newArray(2) 
ans = 
  包含以下字段的 struct:
       Day: 'Friday'
      Time: '9:00'
    Number: 6

数组类型

MATLAB中进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的,而二者在MATLAB中的基本运算性质不同,阵列强调元素对元素的运算,而矩阵则采用线性代数的运算方式。数组的属性及数组之间的逻辑关系,是编写程序时非常重要的两个方面。在MATLAB平台上,数组的定义是广义的,数组的元素可以是任意的数据类型,例如可以是数值、字符串、指针等。

Array = [1 2 3 4 5 6]
% 在MATLAB中可以使用冒号“:”来代表一系列数值,有时也使用它来定义数组。
% 创建从i开始、步长为1、到k结束的数字序列
% 如果i>k,MATLAB则返回一个空矩阵。数字i和k不必是整数,该序列的最后一个数小于或等于k。
Array = i:k 
% 创建从i开始、步长为j、到k结束的数字序列
% 如果j=0,则返回一个空矩阵。数字i、j和k不必是整数,该序列的最后一个数小于或等于k。
Array = i:j:k

% 预定义函数也可以用来创建线性序列和逻辑序列
% 在区间[a,b]上创建一个有n个元素的向量,这n个数把整个区间线性分隔。
% 当数组的元素个数为0时,就称数组为空。空数组是特殊的数组,它不含有任何元素。空数组主要用于逻辑运算、数组声明、数组的清空等。
Array = linspace(a,b,n) 

% 创建空数组
Array_Empty=[] 

单元数组类型

单元(Cell)数组是一种无所不包的广义矩阵。组成单元数组的每一个元素称为一个单元。每一个单元可以包括一个任意数组,如数值数组、字符串数组、结构体数组或另外一个单元数组,因而每一个单元可以具有不同的尺寸和内存占用空间。MATLAB中使用单元数组的目的在于,它可以把不同类型的数据归并到一个数组中。

和一般的数值数组一样,单元数组的维数不受限制,可以是一维、二维或多维。

单元数组的创建

单元数组的创建有两种方法:使用赋值语句创建单元数组和利用cell函数创建数组。

(1)赋值语句创建单元数组

与一般数组有所不同的是,单元数组使用花括号“{}”来创建,使用逗号“,”或空格来分隔每一个单元,使用分号“;”来分行。

>> C = {'x',[1;3;6];10,pi} 
C =
  2×2 cell 数组
    {'x' }    {3×1 double}
    {[10]}    {[  3.1416]}
>> whos
  Name      Size    Bytes  Class    Attributes
  C         2x2          490           cell     

(2)cell函数创建单元数组

cell函数的调用格式如下:

% cell函数创建一个 m×n 的空单元数组,其每一个单元均为空矩阵。
cellName = cell(m,n)

同一般的数值数组一样,单元数组的内存空间也是动态分配的。因此,使用cell函数创建空单元数组的主要目的是为该单元数组预先分配连续的存储空间,以节约内存占用,提高执行效率。

单元数组的寻访

在单元数组中,单元和单元中的内容是两个不同范畴的东西,因此,寻访单元和单元中的内容是两个不同的操作。MATLAB为两种操作设计了相对应的操作对象:单元外标识(Cell Indexing)和单元内编址(Content Addressing)。

对于单元数组CC(m,n)指的是单元数组中第m行第n列的单元,而 C{m,n}指的是单元数组中第m行第n单元中的内容

>> C = {3,[4 7;6 6;80 9],'string';sin(pi/8),3>10,'code'}
C =
  2×3 cell 数组
    {[     3]}    {3×2 double}    {'string'}
    {[0.3827]}    {[       0]}    {'code'  }

>> unitVal_1 = C(2,2) 
unitVal_1 =
  1×1 cell 数组
    {[0]}
>> class(unitVal_1) 
ans =
    'cell'
>> unitVal_2 = C{2,2} 
unitVal_2 =
  logical
   0
>> class(unitVal_2) 
ans =
    'logical'
单元数组的操作

单元数组的操作包括合并、删除单元数组中的指定单元、改变单元数组的形状等。

(1)单元数组的合并

a{1,1}='cellclass'; 
a{1,2}=[1 2 2];
a{2,1}=['a','b','c']; 
a{2,2}=[9 5 6];
a
b = {'Jan'} 
c = {a b}

% 输出结果
a = 
 'cellclass' [1x3 double] 
 'abc' [1x3 double] 
b = 'Jan' 
c = {2x2 cell} {1x1 cell} 

(2)单元数组中指定单元的删除

如果要删除单元数组中指定的某个单元,只需要将空矩阵赋给该单元,即:

C{m,n} = [] 

(3)单元数组的形状修改

使用reshape函数改变单元数组的形状。reshape函数的调用格式为:

% reshape函数将单元数组C改变成一个具有M行N列的新单元数组。
trimC = reshape(C, M, N)

map容器类型

map的本意是映射,是可以将一个量映射到另一个量。比如将一个字符串映射为一个数值,那个字符串就是 map的键(key),那个值就是map的数据(value)。因此,可以将map容器理解为一种快速查找数据结构的键。

对一个map元素进行寻访的索引称为“”。一个“”可以是以下任何一种数据类型:

  • 1×N 字符串;
  • 单精度或双精度实数标量;
  • 有符号或无符号标量整数。

这些键和其对应的数据存储在map中。一个map的每一个条目都包括唯一的键和相对应的数据。map中存储的数据可以是任何类型,包括数值类型、字符或字符串类型、结构体类型、单元类型或其他map。一个mapMATLAB类的一个对象。map类的所有对象具有3种属性。用户不能直接对这些属性进行修改,但可以通过作用于map类的函数进行修改。

属性 说明 默认值
Count 无符号 64 位整数,表示 map 对象中存储的 key/value 对的总数 0
KeyType 字符串,表示 map 对象中包括的 key 的类型 char
ValueType 字符串,表示 map 对象中包括的数据类型 any

map属性的查看方法为map名+小数点“.”+map的属性名。例如,为了查看mapW对象包括的数据类型,需要使用 mapW.ValueType

创建map对象

map是一个map类中的对象,由MATLAB中名为“容器”的一个包来定义,通过构造函数来创建,其创建方法如下:

mapObj = containers.Map({key1,key2,},{val1,val2,}) 
% 当键和值是字符串时,需要对上述语法稍作变更,即:
mapObj = containers.Map({'key1','key2',},{val1,val2,}) 

map对象的创建可以分为两个步骤:首先创建一个空map对象;然后使用keysvalues方法对其内容进行补充。空map对象的创建方法如下:

>> newMap = containers.Map() 
>> newMap
newMap = 
 Map (带属性): 
 Count: 0 
 KeyType: char 
 ValueType: any 
查看/读取 map 对象

(1)查看map对象

map对象中的每个条目包括两个部分:一个唯一的键及其对应的值。可以通过使用keys函数查看map对象中包含的所有键;通过values函数查看所有的值。

>> schedulemap = containers.Map({'Monday','Tuesday','Wednesday','Thursday','Friday'}, {'Maths','Chinese','History','Geography','Biology'}) 
schedulemap = 
  Map - 属性:
        Count: 5
      KeyType: char
    ValueType: char
>> keys(schedulemap) 
ans =
  1×5 cell 数组
    {'Friday'}    {'Monday'}    {'Thursday'}    {'Tuesday'}    {'Wednesday'}
>> values(schedulemap) 
ans =
  1×5 cell 数组
    {'Biology'}    {'Maths'}    {'Geography'}    {'Chinese'}    {'History'}

(2)读取map对象

在创建好一个map对象后,用户可以对其进行数据的寻访。寻访指定键(keyName)所对应的值(valueName)使用的格式如下:

valueName = mapName(keyName)
% 当键名是一个字符串时,需使用单引号将键名括起来。

>> course = schedulemap('Wednesday') 
course =
    'History'
% 如果需要对多个键进行访问,可以使用 values 函数,如:
>> values(schedulemap,{'Monday','Thursday'}) 
ans =
  1×2 cell 数组
    {'Maths'}    {'Geography'}

在对多个键进行访问时,不能像在其他数据类型中那样使用冒号“:”,这将导致错误产生。例如输入:
schedulemap('Monday':'Thursday')
结果弹出如下错误信息:
警告: 冒号操作数必须为实数标量。

编辑map对象

(1)从map对象中删除keys/values

用户可以使用remove函数从map对象中删除keys/values对,该函数的调用格式为:

% mapName和keyName分别为map对象名称及需要删除的键名。
% 执行该命令后,MATLAB 系统删除指定的键名及其相对应的值。
remove('mapName', 'keyName') 

% 删除schedulemap中的“星期四”及其对应的科目。
>> remove(schedulemap,'Thursday') 
ans = 
  Map - 属性:
        Count: 4
      KeyType: char
    ValueType: char
>> keys(schedulemap) 
ans =
  1×4 cell 数组
    {'Friday'}    {'Monday'}    {'Tuesday'}    {'Wednesday'}
>> values(schedulemap) 
ans =
  1×4 cell 数组
    {'Biology'}    {'Maths'}    {'Chinese'}    {'History'}

(2)添加keys/values对象

当用户向一个map对象中写入新元素的值时,需要提供键名,而且该键的类型必须和map中的其他键一致。该操作的调用格式为:

existingMapObj(newKeyName)= newValue 

% 为schedulemap添加“星期六”及其对应的科目“public elective course”
>> schedulemap('Saturday') = 'public elective course' 
schedulemap = 
  Map - 属性:
        Count: 5
      KeyType: char
    ValueType: char
>> keys(schedulemap) 
ans =
  1×5 cell 数组
    {'Friday'}    {'Monday'}    {'Saturday'}    {'Tuesday'}    {'Wednesday'}
>> values(schedulemap) 
ans =
  1×5 cell 数组
    {'Biology'}    {'Maths'}    {'public elective…'}    {'Chinese'}    {'History'}

(3)修改keys

如果需要在保持值不变的情况下对键名进行更改,首先要删除键名和对应的值,然后再添加一个有正确键名的新条目。

% 修改“星期六”及其对应的科目“公共选修课”为“星期天”及其对应的科目“MBA”
>> remove(schedulemap,'Saturday');
>> schedulemap('Sunday') = 'MBA'; 
>> keys(schedulemap) 

ans =
  1×5 cell 数组
    {'Friday'}    {'Monday'}    {'Sunday'}    {'Tuesday'}    {'Wednesday'}
>> values(schedulemap) 
ans =
  1×5 cell 数组
    {'Biology'}    {'Maths'}    {'MBA'}    {'Chinese'}    {'History'}

(4)修改values

通过赋值操作,覆盖原有的值,即可对map对象中的值进行修改。

% 修改“星期一”的科目为“英语”
>> schedulemap('Monday')
ans =
    'Maths'
>> schedulemap('Monday') = 'english'; 
>> keys(schedulemap) 
ans =
  1×5 cell 数组
    {'Friday'}    {'Monday'}    {'Sunday'}    {'Tuesday'}    {'Wednesday'}
>> values(schedulemap) 
ans =
  1×5 cell 数组
    {'Biology'}    {'english'}    {'MBA'}    {'Chinese'}    {'History'}

⛄基本矩阵操作

对矩阵的基本操作,主要有矩阵的构建、矩阵维度与矩阵大小的改变、矩阵的索引、矩阵属性信息的获取、矩阵结构的改变等。对于这些操作,MATLAB中都有固定指令或相应的库函数与之相对应。

矩阵最早来自于方程组的系数及常数所构成的方阵,这一概念由19世纪英国数学家凯利首先提出。数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。

MATLAB中,一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、单元数组、结构数组等各种类别。

由此可见,矩阵和数组在MATLAB中存在很多方面的区别,主要有以下几个方面:

  • 矩阵是数学上的概念,而数组是计算机程序设计领域的概念。
  • 作为一种变换或者映射算符的体现,矩阵运算有着明确而严格的数学规则。而数组运算是 MATLAB 软件定义的规则,其目的是为了使数据管理方便,操作简单,命令形式自然,执行计算有效。

两者间的联系主要体现在:在MATLAB中,矩阵是以数组的形式存在的。因此,一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。

矩阵的构造

矩阵的构建方式有两种,一种与单元数组相似,可以对变量直接进行赋值;另一种是MATLAB中提供构建特殊矩阵的指令。特殊矩阵的构建函数:

1矩阵ones()

0矩阵zeros()

单位矩阵eyes()

行/列和相等的矩阵magic()

随机矩阵rand()randn()

其它矩阵(对角线、上三角形、下三角形)diag()triu()tril()

(1)建立简单矩阵

简单矩阵采用矩阵构造符号——方括号“[]”,将矩阵元素置于方括号内,同行元素之间用空格逗号隔开,行与行之间用分号“;”隔开,格式如下:

matrixName = [element11,element12,element13;element21,element22,element23] 
matrixName = [element11 element12 element13;element21 element22 element23] 

(2)建立特殊矩阵

特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,常见的有对称矩阵、三角矩阵和对角矩阵等。

(3)向量、标量和空矩阵

通常情况下,矩阵包含m行和n列,即m×n。当m和n取一些特殊值时,得到的矩阵具有一些特殊的性质。

向量:当m=1或n=1,即1×n或m×1时,建立的矩阵称为向量。

标量:当m=n=1时,建立的矩阵称为标量。任意以1×1的矩阵形式表示的单个实数复数都是标量。单个实数或者复数在MATLAB中都是以矩阵的形式存储的;在MATLAB中,单个数据或由单个数据构造的矩阵都是标量。

空矩阵:当m=n=0,或者m=0,或者n=0,即0×0、0×n、m×0 时,创建的矩阵称为空矩阵。空矩阵可以通过赋值语句建立。空矩阵0矩阵的本质区别在于:空矩阵内没有任何元素,因此不占用任何存储空间;而 0 矩阵表示该矩阵中的所有元素全部为0,需要占用一定的存储空间。

矩阵大小及结构的改变

根据运算时的不同情况和需要,矩阵大小和结构的改变,主要的方式有旋转矩阵、改变矩阵维度、删除矩阵元素等。

函数名称 函数功能
fliplr(A) 矩阵每一行均进行逆序排列
flipud(A) 矩阵每一列均进行逆序排列
flipdim(A,dim) 生成一个在dim维矩阵A内的元素交换位置的多维矩阵
rot90(A) 生成一个由矩阵A逆时针旋转90°而得到的新矩阵
rot90(A,k) 生成一个由矩阵A逆时针旋转k×90°而得到的新矩阵
reshape(A,m,n) 生成一个m×n×…×p维的矩阵,其元素以线性索引的顺序从矩阵A中取得
如果矩阵A中没有m×n×…×p个元素,将返回一个错误信息
repmat(A,[m n…p]) 创建一个和矩阵A有相同元素的m×n×…×p块的多维矩阵
shiftdim(A,n) 矩阵的列移动n步。n为正数,矩阵向左移;n为负数,矩阵向右移
squeeze(A) 返回没有空维的矩阵A
cat(dim,A,B) 将矩阵A和B组合成一个dim维的多维矩阵
permute(A,order) 根据向量order来改变矩阵A中的维数顺序
ipermute(A,order) 进行命令permute的逆变换
sort(A) 对一维或二维矩阵进行升序排序,并返回排序后的矩阵;
当A为二维矩阵时,对矩阵的每一列分别进行排序
sort(A,dim) 对矩阵按指定的方向进行升序排序,并返回排序后的矩阵。
当dim=1时,对矩阵的每一列排序;dim=2时,对矩阵的每一行排序
sort(A,dim,mode) mode为’ascend’时,进行升序排序;mode为’descend’时,进行降序排序
[B,IX] = sort(A,…) IX为排序后备元素在原矩阵中的行位置或列位置的索引

矩阵下标引用

MATLAB中,普通二维数组元素的数字索引分为双下标索引单下标索引双下标索引是通过一个二元数组对来对应元素在矩阵中的行列位置,例如A(2,3)表示矩阵A中第2行第3列的元素。单下标索引的方式是采用列元素优先的原则,对m行n列的矩阵按列排序进行重组,成为一维数组,再取新的一维数组中的元素位置对应的值作为元素在原矩阵中的单下标,例如对于4×4的矩阵,A(7)表示矩阵A中第3行第2列的元素,而 A(13)表示矩阵A中第1行第4列的元素。

(1)矩阵下标访问单个矩阵元素

索引表达式 函数功能
A(1) 将二维矩阵A重组为一维数组,返回数组中第一个元素
A(:,j) 返回二维矩阵A中第j列列向量
A(i,:) 返回二维矩阵A中第i行行向量
A(:,j:k) 返回由二维矩阵A中的第j列到第k列列向量组成的子矩阵
A(i:k,:) 返回由二维矩阵A中的第i行到第k行行向量组成的子矩阵
A(i:k,j:l) 返回由二维矩阵A中的第i行到第k行行向量
和第j列到第l列列向量的交集组成的子矩阵
A(:) 将矩阵A中的每列合并成一个长的列向量
A(j:k) 返回一个行向量,其元素为A(:)中的第j个元素到第k个元素
A([j1 j2 …]) 返回一个行向量,其元素为A(:)中的第j1j2元素
A(:,[j1 j2…]) 返回矩阵A的第j1列、第j2列等的列向量
A([i1 i2 …],:) 返回矩阵A的第i1行、第i2行等的行向量
A([i1 i2…],[j1 j2…]) 返回矩阵第i1行、第i2行等和第j1列、第j2列等的元素

(2)线性应用矩阵元素

矩阵中某一元素的单下标索引值和双下标索引值之间,可以通过MATLAB内部函数进行转换。

% 将双下标索引值转换为单下标索引值
% siz是一个包含两个元素的数组,代表了转换矩阵的行列数,一般可以直接用size(A)表示;
% i与j分别是双下表索引中的行、列值,IND是转换后的单下标索引值。
IND = sub2ind(siz, i, j) 
% 将单下标索引值转换为双下标索引值,各变量意义同上
[I J] = ind2sub(siz, ind) 

(3)访问多个矩阵元素

在下标表达式里,可以用冒号来表示矩阵的多个元素。例如,A(1:k,j)表示矩阵第j列的前k个元素。在 MATLAB中提供了一个关键字end,用于表示该维中的最后一个元素。

A=magic(4)% 利用冒号,第4列元素的和可以用更为简洁的式子
sum(A(1:4,4)) 
% 冒号本身可以表示一列或者一行的所有元素,上式还可写为:
sum(A(:,4)) 
% 关键字end,用于表示该维中的最后一个元素,上式还可写为:
sum(A(:,end)) 

% 还可以用冒号来表示非相邻的多个元素
B=1:10 
C=B(1:3:10) 

矩阵信息的获取

矩阵的信息主要包括矩阵结构、矩阵大小、矩阵维度、矩阵的数据类型及内存占用等。

(1)矩阵结构

矩阵的结构是指矩阵子元素的排列方式。这类函数的返回值是逻辑类型的数据。返回值为“1”表示该矩阵是某一特定类型的矩阵;返回值为“0”表示该矩阵不是该特定类型的矩阵。

函数名称 函数功能
isempty(A) 检测矩阵是否为空
isscalar(A) 检测矩阵是否是单元素的标量矩阵
isvector(A) 检测矩阵是否是只具有一行或一列元素的一维向量
issparse(A) 检测数组是否是稀疏矩阵

(2)矩阵大小

矩阵的形状信息反映了矩阵的大小,通常又包括以下几个方面的内容:

  • 矩阵的维数。
  • 矩阵各维(例如最长维、用户指定的维)的长度。
  • 矩阵元素的个数。
函 数 描 述
ndims n=ndims(X) 获取矩阵的维数
size [m,n]=size(X) 获取矩阵在各维上的长度
length n=length(X) 获取矩阵最长维的长度
numel n=numel(X) 获取矩阵元素的个数
A = eye(5,3) 
[m,n] = size(A) 
m = 5 
n = 3 
d = size(A) 
d = 5 3 
e1 = size(A,1) 
e1 = 5 
e2 = size(A,2) 
e2 = 3 

size函数的应用可知:①size函数的返回值可以是分开显示的单个实数变量,也可以是一个行向量;②在size函数的输入参数中增加维度参数可以获取指定维度的长度,其中“1”表示行,“2”表示列。

(3)矩阵维度

对于空矩阵、标量矩阵、一维矩阵和二维矩阵,MATLAB都将其作为普通二维数组对待。特别需要注意的是,用[]产生的空矩阵是作为二维矩阵的,但是在高维矩阵中也有空矩阵的概念,此时空矩阵则具有多个维度。

A = []; B = 5; C = 1:3; D = magic(2); E(:,:,2) = [1 2; 3 4]; 
Ndims = [ndims(A) ndims(B) ndims(C) ndims(D) ndims(E)] 
% 输出结果
Ndims = 2 2 2 2 3 

(4)矩阵的数据类型

矩阵作为MATLAB的内部数据存储和运算结构,其元素可以是各种各样的数据类型,对应不同数据类型的元素,可以是数值、字符串、元胞、结构体等。这类函数的返回值也是逻辑类型的数据。返回值为“1”表示是某一特定的数据类型;返回值为“0”表示不是该特定的数据类型。

函数名称 函数功能
isnumeric 检测矩阵元素是否为数值型变量
isreal 检测矩阵元素是否为实数数值型变量
isfloat 检测矩阵元素是否为浮点数值型变量
isinteger 检测矩阵元素是否为整数型变量
islogical 检测矩阵元素是否为逻辑型变量
ischar 检测矩阵元素是否为字符型变量
isstruct 检测矩阵元素是否为结构体型变量
iscell 检测矩阵元素是否为元胞型变量
iscellstr 检测矩阵元素是否为结构体的元胞型变量

(5)矩阵占用的内存

了解矩阵的内存占用情况,对于优化MATLAB代码性能是十分重要的。使用者可以通过whos命令查看当前工作区中指定变量的所有信息,包括变量名、矩阵大小、内存占用和数据类型等。

矩阵的保存和加载

矩阵在MATLAB中的存储方式、矩阵元素的寻址方法、矩阵元素的赋值及扩展。MATLAB就是将矩阵元素按列优先排列的原则依次放置在相应的格子内。因此,可以看成是一个长列向量。MATLAB采用了两种元素寻址方式:①矩阵下标寻址;②线性寻址。

矩阵元素的寻址

(1)矩阵下标寻址方法

MATLAB中,使用A(i,j)来表示一个矩阵A从左上角数起的第i行、第j列上的元素,这就是矩阵下标寻址方法。这种方法和线性代数中矩阵元素的引用方法一致,通俗易懂。

单元素的寻访:当使用双下标访问一个二维矩阵中的某个元素时,必须同时指定该元素所在的行号和列号,访问格式为:A(numRow,numColumn) ,其中,numRownumColumn分别代表行号和列号。

矩阵元素区域的寻访:访问矩阵的多个元素,可以是某一行、某一列或者其中的部分元素,也可以是矩阵中的某一块区域。在MATLAB中,元素区域的访问需要用到冒号“:”来表示矩阵中的多个元素,具体的访问格式如下:

  • A(1:m,n):表示访问第n列的第一个元素至第m个元素。
  • A(m,:):表示访问第m行的所有元素。
  • A(i:j,m:n) :表示访问从第i 行至第j行、从第m列至第n列的矩阵区域。
  • A(i:inc1:j,m:inc2:n) :表示访问从第i行至第j行,行间隔为inc1行;从第m列至第n列,列间隔为inc2的非相邻的多个矩阵元素。

(2)线性寻址

线性寻址的原理来自于MATLAB将矩阵元素存储在内存空间的存储方法。与矩阵下标寻址相比,只需要单一下标即可实现矩阵中任意位置元素的寻访。线性寻址的下标是通过矩阵的双下标换算得到的。

一般,设A是一个m×n的矩阵,位于第i行、第j列上的元素A(i,j)的单一下标为A((j-1)·m+i)

A = hilb(3) 
A(2,3) % 采用矩阵下标寻址的方法访问第 2 行第 3 列的元素
A(8) 

% 输出结果
A = 
 	1.0000 0.5000 0.3333 
 	0.5000 0.3333 0.2500 
	0.3333 0.2500 0.2000 
ans = 0.2500 
ans = 0.2500 
矩阵元素的赋值及扩展

(1)矩阵元素的赋值

MATLAB使用赋值语句对矩阵元素进行赋值,基本语法如下:

  • A(i,j) = value:等号左侧为矩阵中的某个元素;等号右侧为值。
  • A = []:删除矩阵中的所有元素。

(2)矩阵元素的扩展与删除

增加或删除矩阵元素最常用的办法是使用赋值语句。此外,MATLAB提供了多个函数进行矩阵合并操作,从而实现将多个矩阵合并成一个矩阵。

函数 调用格式 描述
cat cat(DIM,A,B) 在DIM指定的维度上合并矩阵 A 和 B。
DIM=1表示按行(竖直方向)合并;DIM=2表示按列(水平方向)合并
horzcat horzcat(A,B) 在水平方向上合并矩阵A和B
vertcat vertcat(A,B) 在竖直方向上合并矩阵A和B
repmat B=repmat(A,M,N) 通过复制M×N个矩阵A来构造新的矩阵B
blkdiag Y=blkdiag(A,B,...) 用已知的A、B等多个矩阵构造块对角化矩阵Y

cat及其相关的函数在将两个矩阵按某个维度进行合并操作时,原始的两个矩阵要在某一个维度上具有相同的长度,否则 MATLAB 在进行计算时就会发生错误。

⛄运算符

MATLAB中的运算符分为算术运算符、关系运算符和逻辑运算符。这三种运算符可以分别使用,也可以在同一运算式中出现。当在同一运算式中同时出现两种或两种以上运算符时,运算的优先级排列如下:算术运算符优先级最高,其次是关系运算符,最低级别是逻辑运算符。

算术运算符

MATLAB中的算术运算符有加、减、乘、除、点乘、点除等。

算术运算符 运算法则 算术运算符 运算法则
A+B A与B相加
(A、B为数值或矩阵)
A-B A与B相减
(A、B为数值或矩阵)
A * B A与B相乘
(A、B为数值或矩阵)
A.* B A与B相应元素相乘
(A、B为相同维度的矩阵)
A / B A与B相除
(A、B为数值或矩阵)
A./ B A与B相应元素相除
(A、B为相同维度的矩阵)
A ^ B A的B次幂
(A、B为数值或矩阵)
A.^ B A的每个元素的B次幂
(A 为矩阵,B为数值)

MATLAB平台上还提供了大量的运算函数:exp(x)log(x)log10(x)sqrt(x)sin(x)cos(x)tan(x)asin(x)acos(x)atan(x)mod(a,b)min(a,b)max(a,b)mean(x)median(x)sum(x)prod(x)cumsum(x)cumprod(x)sign(x)rem(x,y)diff(x)sort(x)fft(x)rank(x)

关系运算符

MATLAB中的关系运算符有6个。关系运算符可以用来对两个数值、两个数组、两个矩阵或两个字符串等数据类型进行比较,同样也可以进行不同类型两个数据之间的比较。比较的方式根据所比较的两个数据类型的不同而不同。例如对矩阵和一个标量进行比较时,需将矩阵中的每个元素与标量进行比较。关系运算符通过比较对应的元素,产生一个仅包含1和0的数值或矩阵。

  • 返回值为 1,比较结果是真。
  • 返回值为 0,比较结果是假。
关系运算符 关系说明 关系运算符 关系说明
< 小于 <= 小于等于
> 大于 >= 大于等于
== 等于 ~= 不等于

=”和“==”的区别:“==”的运算法则是比较两个变量,当它们相等时返回 1,当它们不相等时返回 0;而“=”则是被用来将运算的结果赋给一个变量。

逻辑运算符

逻辑运算符提供了一种组合或否定关系表达式。

逻辑运算符 说明
&
|
~

与关系运算符一样,逻辑运算符也可以进行矩阵与数值之间的比较,比较的方式为将矩阵的每一个元素都与数值进行比较,比较结果为一个相同维数的矩阵,新生成矩阵的每一个元素都代表着原来矩阵中相同位置上的元素与该数值的逻辑运算结果。使用逻辑运算符比较两个相同维数的矩阵时,是按元素来进行比较的,其比较结果是一个包含1和0的矩阵。元素0表示逻辑为假,元素1表示逻辑为真。

除了上面的逻辑运算符,MATLAB还提供了各种逻辑函数:

函数 运算法则
xor(x,y) 异或运算。x与y不同时,返回1;x与y相同时,返回0
any(x) 如果在一个向量x中,有任何元素是非零,返回1;否则返回0
如果矩阵x中的每一列有非零元素,返回1;否则返回0
all(x) 如果在一个向量x中,所有元素非零,返回1;否则返回0
矩阵x中的每一列所有元素非零,返回1;否则返回0

⛄字符串处理函数

MATLAB提供了大量的字符串函数:

字符串函数 函数功能
eval(string) 作为一个MATLAB命令求字符串的值
blanks(n) 返回一个n个零或空格的字符串
deblank 去掉字符串中后拖的空格
feval 求由字符串给定的函数值
findstr 从一个字符串内找出字符串
isletter 字母存在时返回真值
isspace 空格字符存在时返回真值
Isstr 输入一个字符串,返回真值
iasterr 返回上一个产生 MATLAB 错误的字符串
strcmp 字符串相同,返回真值
strrep 用一个字符串替换另一个字符串
strtok 在一个字符串里找出第一个标记

字符串的构造

字符串或字符串数组的构造可以通过直接给变量赋值来实现,具体表达式中字符串的内容需要写在单引号内。如果字符串的内容包含单引号,那么以两个重复的单引号来表示。

构造多行字符串时,若字符串内容写在[]内,那么多行字符串的长度必须相同;若字符串内容写在{}内,则这多行字符串的长度可以不同。

>> Str_mat = ['July';'August';'September';] 
要串联的数组的维度不一致。
>> Str_mat2 = {'July';'August';'September';} 
Str_mat2 =
  3×1 cell 数组
    {'July'     }
    {'August'   }
    {'September'}

MATLAB中还提供了strvcatchar函数用于纵向连接多个字符串。strvcat函数连接多行字符串时,每行字符串的长度不要求相等,所有非最长字符串的右边会自动补偿空格,使得每行字符串的长度相同。char函数与strvcat函数类似,不过当多行字符串中有空字符串时,strvcat函数会自动进行忽略,而char函数会把空字符串也用空格补偿后再进行连接。

A='top'; B=''; C='Bottom'; 
sABC=strvcat(A,B,C),cABC=char(A,B,C),size=[size(sABC);size(cABC)] 

% 输出结果
sABC = 
	top 
	Bottom 
cABC = 
	top 
	
	Bottom 
size = 
 	2 6 
 	3 6 

字符串比较函数

两个字符串之间的关系可以通过关系运算符来比较,也可以使用strcmp函数来比较两个字符串是否相同。

>> A = (' Hello ' == ' Word ') 
矩阵维度必须一致。
>> A = (' Hello ' == ' World ')
A =
  1×7 logical 数组
   1   0   0   0   1   0   1
>> C = strcmp(' Hello ', ' World ')
C =
  logical
   0

使用关系运算符进行比较时,会对字符串的每个字符进行比较,返回值是一个与字符串长度相同大小的数组,因此被比较的两个字符串的长度必须相同;而strcmp函数则根据两个字符串相同与否,返回值为数值0或 1。

字符串查找和替换函数

字符串的查找与搜索可以通过findstr函数来实现。findstr函数对字母的大小写是敏感的。另外,findstr函数对字符串矩阵不起作用,因此对字符串矩阵的搜索只能通过循环索引矩阵内的元素进行搜索。

字符串的替换可以通过对字符串数组中相应的元素直接赋值来实现,也可以使用strrep函数来实现。直接赋值方法并不能使两个不同长度的字符串相互替换,而strrep函数可以替换两个任意长度的字符串。与findstr函数类似,strrep函数也对字符串矩阵不起作用。

>> String ='Peter Piper picked a peck of pickled peppers.'
String =
    'Peter Piper picked a peck of pickled peppers.'
>> findstr(String,'pick')
ans =
    13    30
>> String = strrep(String, 'Peter Piper', 'Sabrina Crame') 
String =
    'Sabrina Crame picked a peck of pickled peppers.'

数值转换

MATLAB还提供了大量字符串与各种数据类型之间的转换函数:

函数名称 函数功能
abs 字符转换成 ASCII
dec2hex 十进制数转换成十六进制字符串
fprintf 把格式化的文本写到文件中或显示屏上
hex2dec 十六进制字符串转换成十进制数
hex2num 十六进制字符串转换成 IEEE 浮点数
int2str 整数转换成字符串
lower 字符串转换成小写
num2str 数字转换成字符串
setstr ASCII 转换成字符串
sprintf 用格式控制数字转换成字符串
sscanf 用格式控制字符串转换成数字
str2mat 字符串转换成一个文本矩阵
str2num 字符串转换成数字
upper 字符串转换成大写

⛄数组与矩阵

数组运算

数组运算是MATLAB计算的基础。由于MATLAB面向对象的特性,这种数值数组成为MATLAB最重要的一种内建数据类型,而数组运算就是定义这种数据结构的方法。

数组的创建和操作

MATLAB中一般使用方括号“[ ]”、逗号“,”、空格号和分号“;”来创建数组,数组中同一行的元素使用逗号或空格进行分隔,不同行之间用分号进行分隔。

% 空数组
A=[]
% 行向量
B=[6 5 4 3 2 1]
C=[6,5,4,3,2,1]
% 列向量
D=[6;5;4;3;2;1]
% 转置
E=B'

F=[6 5 4 3 2 1]
% 访问数组第 3 个到最后一个元素
a3=F(3:end)
% 数组元素反序输出
a4=F(end:-1:1) 
% 访问数组第1个及第6个元素
a5=F([1 6])

(1)通过冒号创建一维数组

% A是创建一维数组的第一个变量,step是每次递增或递减的数值,直到最后一个元素和B的差的绝对值小于等于step的绝对值为止。
X=A:step:B

A=2:6 
B=2.1:1.5:6 
C=2.1:-1.5:-6 
D=2.1:-1.5:6 
% 输出结果
A = 2 3 4 5 6 
B = 2.1000 3.6000 5.1000 
C = 2.1000 0.6000 -0.9000 -2.4000 -3.9000 -5.4000 
D = Empty matrix: 1-by-0 

(2)通过函数创建一维数组

logspace()函数创建一维数组;linspace()函数创建一维数组

数组的常见运算

(1)数组的算术运算

数组的运算是从数组的单个元素出发,针对每个元素进行的运算。在MATLAB中,一维数组的基本运算包括加、减、乘、左除、右除和乘方。

数组的加减运算:通过格式A+B或A-B可实现数组的加减运算。但是运算规则要求数组A和B的维数相同

数组的乘除运算:通过格式“.*”或“./”可实现数组的乘除运算。但是运算规则要求数组A和B的维数相同

乘法:数组A和B的维数相同,运算为数组对应元素相乘,计算结果与A和B是相同维数的数组。
除法:数组A和B的维数相同,运算为数组对应元素相除,计算结果与A和B是相同维数的数组。
右除和左除的关系:A./B=B.\A,其中A是被除数,B是除数。

乘方格式“.^”实现数组的乘方运算。数组的乘方运算包括:数组间的乘方运算、数组与某个具体数值的乘方运算,以及常数与数组的乘方运算。

函数dot()可实现数组的点积运算,但是运算规则要求数组A和B的维数相同,其调用格式如下

C = dot(A,B)
C = dot(A,B,dim)

clear all
A=[1 5 6 8 9 6]
B=[9 5 6 2 4 0]
% 数组的点积
C=dot(A,B)
% 数组元素的乘积之和
D=sum(A.*B)

% 输出结果
A = 1 5 6 8 9 6 
B = 9 5 6 2 4 0 
C = 122 
D = 122 

(2)数组的关系运算

MATLAB中提供了6种数组关系运算符,即<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(恒等于)、~=(不等于)。关系运算的运算法则如下:

  • 当两个比较量是标量时,直接比较两个数的大小。若关系成立,则返回的结果为1,否则为0。
  • 当两个比较量是维数相等的数组时,逐一比较两个数组相同位置的元素,并给出比较结果。最终的关系运算结果是一个与参与比较的数组维数相同的数组,其组成元素为0或1。
clear all
A=[1 5 6 8 9 6]
B=[9 5 6 2 4 0]
% 数组与常数比较,小于
C=A<6
% 数组与常数比较,大于等于
D=A>=6

% 输出结果
A = 1 5 6 8 9 6 
B = 9 5 6 2 4 0 
C = 1 1 0 0 0 0 
D = 0 0 1 1 1 1 

(3)数组的逻辑运算

MATLAB中数组提供了3种数组逻辑运算符,即&(与)、|(或)和~(非)。逻辑运算的运算法则如下:

  • 如果是非零元素则为真,用1表示;如果是零元素则为假,用0表示。
  • 当两个比较量是维数相等的数组时,逐一比较两个数组相同位置的元素,并给出比较结果。最终的关系运算结果是一个与参与比较的数组维数相同的数组,其组成元素为0或1。
  • 与运算(a&b)时,a、b全为非零,则为真,运算结果为1;或运算(a|b)时,只要a、b有一个为非零,则运算结果为1;非运算(~a)时,若a为0,运算结果为1,a为非零,运算结果为0。
clear all
A=[1 5 6 8 9 6]
B=[9 5 6 2 4 0]
% 与、或、非
C=A&B
D=A|B
E=~B

% 输出结果
A = 1 5 6 8 9 6 
B = 9 5 6 2 4 0 
C = 1 1 1 1 1 0 
D = 1 1 1 1 1 1 
E = 0 0 0 0 0 1 

矩阵操作

创建矩阵

零矩阵、单位矩阵和全1矩阵等特殊矩阵,MATLAB中提供了函数生成试验矩阵。还有一些其他特殊矩阵的指令集。

希尔伯特(Hilbert)矩阵,它是一个条件数差的矩阵,所以将它用来作为试验矩阵。

hilb(n)invhilb(n)

托普利兹(Toeplitz)矩阵,它由两个向量定义,一个行向量和一个列向量。对称的托普利兹矩阵由单一向量来定义。

toeplitz(k,r)toeplitz(c)

0~1间均匀分布的随机矩阵,产生 0~1 间均匀分布的随机矩阵。

rand(n)rand(m,n)rand(m,n,p,...)rand(size(A))

标准正态分布随机矩阵,产生均值为 0、方差为 1 的随机矩阵。

randn(n)randn(m,n)randn(m,n,p,...)randn([m,n,p,...])randn(size(A))

魔方矩阵,每行、列和两条对角线上的元素和相等。

magic(n)

帕斯卡矩阵。

pascal(n)pascal(n,1)pascal(n,2)

范德蒙(Vandermonde)矩阵。

vander(v),生成范德蒙矩阵,矩阵的列是向量v的幂,输入向量可以使行向量或列向量。

改变矩阵大小

(1)矩阵的合并

矩阵的合并就是把两个或者两个以上的矩阵数据连接起来得到一个新的矩阵。

矩阵构造符[]不仅可用于构造矩阵,同时还可以作为一个矩阵合并操作符。表达式C=[A B]在水平方向合并矩阵A和B,而表达式C=[A;B]在竖直方向合并矩阵A和B。

除了使用矩阵合并符“[]”来合并矩阵,还可以使用矩阵合并函数来合并矩阵。

可以用矩阵合并符来构造任意大小的矩阵。不过需要注意的是,在矩阵合并的过程中一定要保持矩阵的形状是方形,否则矩阵合并将无法进行。

(2)矩阵行列的删除

要删除矩阵的某一行或者某一列,只要把该行或者该列赋予一个空矩阵“[]”即可。

重构矩阵

矩阵重构的两个比较重要的运算是转置和共轭转置,在MATLAB中,用在函数后面加撇号“'”来表示。在线性代数的专业书籍中,这种运算经常用*H表示。

如果A是一个实数矩阵,那么它被转置时,第1行变成第1列,第2行变成第2列……以此类推,一个m×n矩阵变为一个n×m矩阵。如果矩阵是方阵,那么这个矩阵在主对角线上反映出来。如果矩阵A的元素aij是复数,那么所有元素也是共轭的。如果仅希望转置,在撇号“'”之前输入一点,即成为“.'”,A.‘表示转置,其结果与conj(A’)相同。如果A是实数矩阵,那么A’与A.'相同。

矩阵元素的运算

矩阵的加、减、乘、除、比较运算和逻辑运算等代数运算是MATLAB数值计算最基础的部分。

矩阵的加减运算。进行矩阵加法、减法运算的前提是参与运算的两个矩阵或多个矩阵必须具有相同的行数和列数,即A、B、C等多个矩阵均为m×n矩阵;或者其中有一个或多个矩阵为标量。

矩阵的乘法运算MATLAB中矩阵的乘法运算包括两种:数与矩阵的乘法;矩阵与矩阵的乘法。

  • 数与矩阵的乘法:由于单个数在MATLAB中是以标量来存储的,因此数与矩阵的乘法也可以称为标量与矩
    阵的乘法。
  • 矩阵与矩阵的乘法:两个矩阵的乘法必须满足被乘矩阵的列数与乘矩阵的行数相等。

矩阵的除法运算。矩阵的除法是乘法的逆运算,分为左除和右除两种,分别用运算符号“\”和“/”表示。

  • A\B表示矩阵A的逆乘以B,A/B表示矩阵A乘以矩阵B的逆。除非矩阵A和矩阵B相同,否则A/B和A\B是不等价的。
  • 对于一般的二维矩阵A和B,当进行A\B运算时,要求A的行数与B的行数相等;当进行A/B运算时,要求A的列数与B的列数相等。

矩阵的幂运算。当矩阵A为方阵时,可进行矩阵的幂运算,使用运算符号“^”表示幂运算。

矩阵元素的查找。函数find()的作用是进行矩阵元素的查找,它通常与关系函数和逻辑运算相结合。其调用格式如下:

  • ind = find(X):该函数查找矩阵X中的非零元素,函数返回这些元素的单下标。
  • [row,col] = find(X, ...):该函数查找矩阵X中的非零元素,函数返回这些元素的双下标i和j。

矩阵元素的排序。函数sort()的作用是按照升序排序,排序后的矩阵和原矩阵的维数相同。其调用格式如下:

  • B = sort(A):该函数对矩阵A进行升序排列。A可为矩阵或向量。
  • B = sort(A,dim):该函数对矩阵 A 进行升序排列,并将结果返回在给定的维数dim上按照升序排列。当dim=1时,按照列进行排序;当dim=2时,按照行进行排序。
  • B = sort(...,mode):该函数对矩阵 A 进行排序,mode可指定排序的方式。ascend指定按升序排列,为默认值;descend指定按降序排列。

矩阵元素的求和。函数sum()cumsum()的作用是对矩阵的元素求和。函数cumsum()的调用格式与sum()类似,不同的是其返回值为矩阵。其调用格式如下:

  • B = sum(A):该函数对矩阵A的元素求和,返回由矩阵A各列元素的和组成的向量。通过sum(sum())可求出矩阵所有元素的和。
  • B = sum(A,dim):该函数返回在给定的维数dim上元素的和。当dim=1时,计算矩阵A各列元素的和;当dim=2时,计算矩阵A各行元素的和。
  • B = cumsum(A)
  • B = cumsum(A,dim)

矩阵元素的求积。函数prod()cumprod()的作用是对矩阵的元素求积。函数cumprod()的调用格式与prod()类似,不同的是其返回值为矩阵。其调用格式如下:

  • B = prod(A):该函数对矩阵A的元素求积,返回由矩阵A各列元素的积组成的向量。
  • B = prod(A,dim):该函数返回在给定的维数dim上元素的积。当dim=1时,计算矩阵A各列元素的积;当dim=2时,计算矩阵A各行元素的积。
  • B = cumprod(A)
  • B = cumprod(A,dim)

矩阵元素的差分。函数diff()的作用是计算矩阵的差分。其调用格式如下:

  • Y = diff(X):计算矩阵各列元素的差分。
  • Y = diff(X,n):计算矩阵各列元素的n阶差分。
  • Y = diff(X,n,dim):计算矩阵在给定的维数dim上元素的n阶差分。当dim=1时,计算矩阵各列元素的差分;当dim=2时,计算矩阵各行元素的差分。当参数n≥size(x,dim)时,函数的返回值是空矩阵。

矩阵运算

矩阵运算是线性代数中极其重要的部分,包括矩阵分析、特征值求解和奇异值等。

(1)矩阵分析

函数名 功能描述
norm 求矩阵或者向量的范数
normest 估计矩阵的 2 阶范数
rank 矩阵的秩,即求对角元素的和
det 矩阵的行列式
trace 矩阵的迹
null 0 空间
orth 正交化空间
rref 约化行阶梯形式
subspace 求两个矩阵空间的角度

(2)矩阵分解

矩阵分解是把一个矩阵分解成几个“较简单”的矩阵连乘的形式。

函数 功能描述
chol Cholesky分解
cholinc 稀疏矩阵的不完全Cholesky分解
lu 矩阵LU分解(高斯消去法分解)
luinc 稀疏矩阵的不完全LU分解
qr 正交三角分解
svd 奇异值分解
gsvd 一般奇异值分解
schur 舒尔分解

(3)特征值和特征向量

MATLAB中的命令计算特征值和特征向量十分方便,可以得到不同的子结果和分解,这在线性代数学习中十分有意义。

稀疏矩阵

在许多问题中提到了含有大量0元素的矩阵,这样的矩阵称为稀疏矩阵。为了节省存储空间和计算时间,MATLAB考虑到矩阵的稀疏性,在对它进行运算时有特殊的命令。稀疏矩阵大部分的元素是0,因此只需存储非零元素的下标和元素值,这种特殊的存储方式可以节省大量的存储空间和不必要的运算。

稀疏矩阵的存储方式

对于稀疏矩阵,MATLAB仅存储矩阵所有的非零元素的值及其位置(行号和列号)。显然,这对于具有大量0元素的稀疏矩阵来说是十分有效的。

稀疏矩阵的生成

MATLAB提供了多种创建稀疏矩阵的方法。

  • 利用sparse函数从满矩阵转换得到稀疏矩阵。
  • 利用一些特定函数创建包括单位稀疏矩阵在内的特殊稀疏矩阵。

(1)利用sparse函数建立一般的稀疏矩阵

函数名称 表示意义
sparse(A) 由非零元素和下标建立稀疏矩阵A。如果A已是一个稀疏矩阵,则返回A本身
sparse(m,n) 生成一个m×n的所有元素都是0的稀疏矩阵
sparse(u,v,a) 生成大小为max(u)×max(v)的稀疏矩阵。其中u和v是整数向量,a为实数或复数向量
sparse(u,v,a,m,n) 生成一个m×n的稀疏矩阵,(ui,vi)对应值 ai。向量u,v和a长度必须相同
spconvert(D) 生成一个稀疏矩阵。D共有3列,第1列为行下标,第2列为列下标,最后一列为元素值
full(S) 将稀疏矩阵S转换成一个满矩阵

MATLAB提供了full()函数把稀疏矩阵转换为满矩阵。full()函数的调用格式如下:

  • A = full(S):S为稀疏矩阵。
A = [1 0 0 0;0 5 0 0;2 0 0 7] 
S = sparse(A)
B = full(S) 
% 输出结果
S = 
     (1,1) 1 
     (3,1) 2 
     (2,2) 5 
     (3,4) 7 
B = 
     1 0 0 0 
     0 5 0 0 
     2 0 0 7 

查看稀疏矩阵中非零的信息示例:

clear all 
a=[0 0 0 1;0 0 8 0;4 0 0 0;0 0 0 0]; 
S=sparse(a); % 创建稀疏矩阵
whos; 
n1=nnz(S) % 查看非零元素的个数
n2=nonzeros(S) % 非零元素的值
n3=nzmax(S) % 查看稀疏矩阵的存储空间
% spy()函数对稀疏矩阵中非零元素的分布进行图形化显示,
spy(S) 
% 采用nnz(S)/prod(size(S))计算稀疏矩阵的非零元素密度
n4=nnz(S)/prod(size(S)) 
% 输出结果
Name      Size            Bytes  Class     Attributes
 S         4x4                88  double    sparse    
 a         4x4               128  double 
n1 = 3 
n2 = 
     4 
     8 
     1 
n3 = 3 
n4 = 0.1875 

(2)利用特定函数建立稀疏矩阵

函数 调用格式 描述
speye S = speye(m,n) 创建单位稀疏矩阵
spones S = spones(X) 创建非零元素为1的稀疏矩阵
sprand S = sprand(X) 创建非零元素为均匀分布的随机数的稀疏矩阵
sprandn S = sprandn(X) 创建非零元素为高斯分布的随机数的稀疏矩阵
sprandsym S = sprandsym(X) 创建非零元素为高斯分布的随机数的对称稀疏矩阵
spdiags S = spdiags(X) 创建对角稀疏矩阵
spalloc S = spalloc(X) 为稀疏矩阵分配空间
稀疏矩阵的运算
  • 满矩阵的四则运算对稀疏矩阵同样有效,但是返回结果有可能是稀疏矩阵或者满矩阵。
  • 对于单个稀疏矩阵的输入,大部分函数输出的结果都是稀疏矩阵,有部分函数输出的结果是满矩阵。对于多个矩阵的输入,如果其中至少有一个矩阵是满矩阵,那么大部分函数的输出结果是满矩阵。
  • 对于矩阵的加、减、乘、除运算,只要其中有一个是满矩阵,则输出的结果都是满矩阵。
  • 稀疏矩阵的数乘为稀疏矩阵;稀疏矩阵的幂为稀疏矩阵。

笔者不才,请多交流!!!

欢迎大家关注预览我的博客Blog:HeartLoveLife
能力有限,敬请谅解!!

你可能感兴趣的:(MATLAB,科学计算,面向对象,matlab,开发语言)