本文记录MATLAB的基础知识, 包括MATLAB的基础知识介绍, MATLAB的基础运算以及通过MATLAB语言进行编程.
目录
Matlab基础
主界面窗体
启动MATLAB程序后, 程序界面如下所示:
可以分成以下的几个界面
- 命令窗口: 在此窗口可以直接输入MATLAB指令
- 工作空间窗口: 此窗口显示了当前状态下保存的各种变量, 可通过工作空间窗口对这些变量进行操作
- 当前目录窗口: 显示了当前的目录,只有位于当前目录和搜索路径下的文件才能被直接使用
- 历史命令窗口: 自动保留自安装起所有用过的命令的历史记录, 从而方便用户查询
MATLAB搜索过程
在MATLAB的命令窗口中输入一个名称以后, MATLAB按照以下顺序进行检测
- 是否为变量
- 是否为内部函数
- 是否为当前目录下的M文件
- 是否为其他搜索路径下的文件
目录操作
修改启动目录
- matlab默认的启动位置位于其安装路径, 通常该位置不适合作为工作目录
- 通过修改快捷方式中的启动位置, 即可修改matlab启动位置
- 可在命令窗口中使用
cd
指令切换当前目录 - 可以通过
path(path,'C:/WorkSpace')
指令将指定目录C:/WorkSpace
临时加入搜索路径(添加到末尾)
系统目录和用户目录
- 系统目录
- 系统目录指的是matlab本身提供的各种包所在的路径
- 可以通过输入
matlabroot
查看 - 通常是matlab的安装路径,例如
C:\Program Files\MATLAB\MATLAB Production Server\R2015a
- 用户目录
- 用户自定义的代码可以存放的路径
- 可以通过输入
userpath
查看 - 通常位于用户的文档文件夹下,例如
C:\Users\lizec\Documents\MATLAB
- 点击
HOME
界面上ENVIROMENT
区域的Set Path
,可以设置搜索路径- 位于搜索路径中的文件可以直接被调用
- 如果同时存在多个同名文件,Matlab采用最先出现的
- 默认情况下用户目录是第一个路径,所以用户定义的任何同名函数都会覆盖系统提供的函数
帮助系统
help命令
- 无参数,显示当前帮助系统的所有项目,及搜索路径的所有目录名称
- +函数名,显示该函数的帮助说明
- +目录名,显示某一类函数
lookfor命令
- help指令是完全匹配,而lookfor进行关键字匹配
- 无参数,在M文件的第一行进行搜索
- -all参数,搜索全文
模糊查询
- 输入开头几个字母,使用tab建进行补全
演示系统
- 在命令行中输入demos
- 实际上是项目文档合集,包括文档,示例,以及联网资料
资源站
清空
- 使用
clear
指令清除工作区变量 - 使用
clc
清除命令行
MATLAB计算基础
变量定义
- 变量以字母开始,以字母数字下划线构成的,长度不超过63个字符
- 变量名区分大小写
- 标准库函数始终由全部小写字母构成
语句
- 直接输入表达式,命令行会显示运行结果
- 每条命令后加上分号,则命令执行后不输出结果
注释和节
- matlab中注释以
%
开始,仅支持单行注释 - 如果需要注释多行,直接选择需要注释的内容后点击界面上的commet按钮
- 使用
%%
开始的注释称为节,可以将一段代码分成若干节,使用界面上的按钮来以节为单位执行代码
预定义变量
- 表示圆周率的
pi
- 表示虚数的
i
和j
- 预定义可以被用户自定义变量覆盖
内存控制
- clear
- 无参数,清除工作空间全部变量
- 指定变量名,则清除指定的变量
- who/whos
- who显示当前工作空间全部变量名称
- whos显示当前工作空间全部变量详细信息
- save
save filename
将工作空间保存到指定的文件中-append
追加模式,即将新的变量和修改的变量追加保存到文件中-ascii
以文本模式保存,不过实在是没啥优势,不建议使用- 可以在filename后指定变量名,则只保存指定的变量
- load
load filename
将指定的文件中保存的变量加入工作空间
MATBLAB常用函数
abs函数
- 获得实数的绝对值
- 获得复数的模
- 获得字符串的ASCII码
取整函数
函数名称 | 含义 | 示例1 | 示例2 |
---|---|---|---|
fix | 向零取整 | fix(3.5) = 3 | fix(-3.5) = -3 |
floor | 不大于指定数据的最大整数 | floor(3.5) = 3 | floor(-3.5) = -4 |
ceil | 不小于指定数据的最小整数 | ceil(3.5) = 4 | ceil(-3.5) = -3 |
round | 四舍五入 | round(3.5) =4 | round(-3.5) = -4 |
求余数
函数名称 | 含义 | 示例1 |
---|---|---|
rem | 余数与被除数符号相同 | rem(-3,-4) = -3 |
mod | 余数与除数符号相同 | mod(7,-4) = -1 |
格式化输出
使用format格式进行输出格式化,format函数用法为format 格式 变量
. 其中格式有如下若干选项:
名称 | 含义 |
---|---|
SHORT | Scaled fixed point format with 5 digits. |
LONG | Scaled fixed point format with 15 digits for double and 7 digits for single. |
SHORTE | Floating point format with 5 digits. |
LONGE | Floating point format with 15 digits for double and 7 digits for single. |
SHORTG | Best of fixed or floating point format with 5 digits. |
LONGG | Best of fixed or floating point format with 15 digits for double and 7 digits for single. |
SHORTENG | Engineering format that has at least 5 digits and a power that is a multiple of three |
LONGENG | Engineering format that has exactly 16 significant digits and a power that is a multiple of three. |
MATLAB模式使用SHORT模式, 其他细节可以使用help指令查阅format文档
矩阵输入方式
- 直接在交互窗口编辑矩阵
- 使用M文件
- 即在M文件中先定义矩阵,之后使用文件名导入矩阵
- 从而可以一次输入,反复使用
- 使用冒号表达式
- e1:e2:e3 从e1开始以e2为步长,到e3结束的行向量
- 可以省略e2,此时e2默认等于1, 由于步长原因,最后可能不包含元素e3
- 与使用linspace(a,b,n)效果类似,从a到b,产生n个元素(且必定包含边界值b)
- 使用小矩阵构建大矩阵
- 空矩阵
- 创建空矩阵后使用IDE提供的编辑器进行编辑
矩阵引用的转换
矩阵的引用
- 可以使用形如A(m,n)的方式引用矩阵A的第m行,第n列的元素
- 如果引用越界,程序不会报错,而是自动扩展到相应的大小
- 可以使用形如A(n)的方式引用矩阵第n个元素, MATLAB按列存储且从1开始计数
序号和下标的转换
使用sub2ind和ind2sub可以将序号(Index)和下标(Subscript)相互转换,例如
1 | >> a = [10,20,30;40,50,60;70,80,90] |
矩阵拆分
reshape(A,m,n)函数
- 在元素不变的情况下,将矩阵A变成m*n的矩阵
- 仅仅改变逻辑结构,不改变物理结构
冒号表达式
- 使用冒号表达式获得一段数据
- 使用单独的冒号表示获得一整行或者一整列
- 冒号表达式配合end表示获取直到末尾
使用空矩阵删除部分元素
- 将矩阵的一部分置为空矩阵
[]
, 即可将部分元素删除
矩阵拆分举例
1 | >> A = magic(5) |
特殊矩阵
通用特殊矩阵
函数名 | 效果 |
---|---|
zeros | 全零矩阵 |
ones | 全1矩阵 |
eye | 单位矩阵 |
rand | 0-1之间的随机数矩阵 |
randn | 均值为0,方差为1的标准正态分布随机矩阵 |
上述函数具有以下的调用方法,其中f表示上表的任意一个函数
调用方法 | 效果 |
---|---|
f(m) | 产生一个m*m的矩阵 |
f(m,n) | 产生一个m*n的矩阵 |
f(size(A)) | 产生一个同A一样大小的矩阵 |
学科特殊矩阵
函数名 | 效果 |
---|---|
magic(n) | 每行,每列和两条对角线上元素之相等 |
vander(V) | 最后一列全为1,倒数第二列为一个指定的向量(基础向量), 其他各列是其后列与倒数第二列的点乘积 |
hilb(n) | H(i,j) = 1/(i+j-1) ,高度病态的矩阵 |
invhilb(n) | 希尔伯特矩阵对应的逆矩阵 |
toeplitz(x,y) | 托普利兹矩阵,除第一行和第一列外, 其他每个元素都与左上角的元素相同 |
compan(p) | 伴随矩阵,其中p是一个多项式的系数向量, 高次幂系数排在前, 低次幂排在后 |
pascal(n) | 生成一个n阶帕斯卡矩阵 |
注意:
- 多项式对应的伴随矩阵的特征值是多项式的根
- 求5次方系数时, 应该使用pascal(6)
特殊矩阵使用举例
1 | >> Vand = vander([1;2;3;5]) |
MATLAB运算符
算数运算
基础规则
Matlab的矩阵加,减,乘法都和数学定义一致,且不可运算时报错. 对于除法运算, 提供了两种除法
A/B
(右除) 等价于A*INV(B)
.A\B
(左除) 等价于INV(A)*B
注意:
- 矩阵乘法不可交换,所以注意矩阵位置,这也决定了A和B行,列数的关系
- 逆矩阵和原矩阵的行列数交换,例如3x2矩阵的逆矩阵是2x3矩阵
- 当除数可逆时(非奇异方阵),被除数要能和除数的逆进行运算即可,而不必是方阵
- 当除数不可逆时(奇异或者非方阵或者两者均有), 使用求广义逆(即pinv)代替.
深入探讨除法
除法A\B
实际上可以认为是线性方程组Ax=B
的解,即x = inv(A)*B
. 当A是方阵时,运算结果就是其解向量.
当A是MxN矩阵时, 有两种情况
M > N
, 即方程数大于未知量数, 此时方程无解,A\B
给出最小二乘法下的近似解M < N
, 即未知量数大于方程数, 此数方程无穷多解,A\B
给出一个特解
关系运算
- 同维矩阵之间可以进行关系运算, MATLAB将两个矩阵中的同一位置元素逐一比较,并返回一个同维的矩阵
- 当标量和矩阵比较时, 标量与矩阵逐一比较并且返回一个同纬度的矩阵.
- 关系运算符基本与各个语言使用的格式一致,但不等于使用
~=
表示. - 充分利用矩阵和矩阵的比较, 矩阵和标量的比较可以简化代码,提高运行速度.
逻辑运算
- 逻辑运算的符号分别为
&
,|
,~
- 和关系运算一样,可以在同维矩阵直接进行或者矩阵与标量之间进行.
- 和C语言的位运算一样, 这些符号的运算结果只能为0或者1.
运算优先级
算数运算 > 关系运算 > 逻辑运算
MATLAB运算示例
建立矩阵A, 找出大于4的元素的位置, 并输出这些元素的序号
1 | A=[4,-65,-54,0,6;56,0,67,-45,0]; |
MATLAB矩阵操作
本节介绍MATLAB中关于矩阵的各种操作, 大部分操作都涉及线性代数的有关内容, 有关线性代数的定义可以查阅相关课本, 本节直接使用而不进行解释.
对角阵
- diag函数可以提取一个矩阵的对角线,组成一个向量,或者将一个向量变成一个对角阵
- 当输入的矩阵不是一个方阵时, 尽可能的获得对角线的元素
- 可以指定一个数字k来提取第k条对角线的元素(与主对角线平行, 往上为第1, 2, …, n条对角线, 往下为第-1, -2, …, -n条对角线, 主对角线为第0条对角线).
- 当输入是向量时, 将向量还原成一个矩阵, 同时也可以指定一个数字k来指定是还原成那一条对角线.
1 | >> A=[4,-65,-54,0,6;56,0,67,-45,0] |
上三角矩阵和下三角矩阵
- triu函数将给定的矩阵提取称为上三角矩阵
- tril函数将给定的矩阵提取为下三角矩阵
- 与diag函数一样,两个函数都可以指定一个数字k来决定从哪一条对角线开始提取.
1 | >> A = [1,2,3;4,5,6;7,8,9] |
矩阵的转置和旋转
- 使用’表示转置
- 使用rot90函数以90为单位旋转矩阵
- 使用fliplr和flipud进行左右反转或者上下翻转.
1 | >> A = [1,2;3,4] |
矩阵的逆和伪逆
- 使用inv函数求非奇异矩阵的逆矩阵
- 使用pinv求解矩阵的伪逆
1 | >> A = [1,2;3,4] |
行列式
使用det函数求解矩阵的行列式
1 | >> A = [1,2;3,4] |
矩阵的秩和迹
- 使用rank函数求解矩阵的秩
- 矩阵的秩可以分为行秩和列秩, 两种总是相等的, 统称为秩. 矩阵的秩也称为奇异值数.
- 使用trace函数求解矩阵的迹, 矩阵的迹等于矩阵对角线元素之和,或特征值之和.
向量和矩阵的范数
度量矩阵或者向量在某种意义下的长度.
- 使用norm(V,1)计算1范数
- 使用norm(V,2)或者norm(V)计算2范数
- 使用norm(V,Inf)计算无穷范数
矩阵的条件数
- 如果在表达式AX=B中解向量X随矩阵A的微小扰动而发生很大变化, 则称矩阵A是病态矩阵, 否则称A为良性矩阵
- 条件数是用来描述矩阵良性或者病态性能的参数.
矩阵A的条件数 = A的范数* A的逆矩阵的范数
- 任何矩阵的条件数都大于1, 条件数越接近1, 则矩阵越接近良性.
- 使用cond计算条件数, cond函数的参数与norm类似,从而可以使用3种范数方法计算条件数.
特征值和特征向量
使用如下的函数获得特征值或特征向量
函数 | 效果 |
---|---|
E = eig(A) | 获得特征值组成的向量 |
[V,D] = eig(A) | 全部特征值构成的对角阵D,特征向量组成V的列向量 |
[V,D] = eig(A,’nobalance’) | 不做相似变换,直接求特征值和特征向量 |
矩阵的超越函数
对矩阵整体进行运算,而不是对各个元素进行运算. 各种运算都要求矩阵必须是方阵.例如
- sqrtm(A) 求解矩阵X,使得X*X=A
- funm(A,’fun’) 用指定的函数计算相应的矩阵版本,例如 funm(A,’sqrt’)等价于sqrtm(A)
其他数据类型
字符串
定义
- MATLAB种使用单引号括起来的字符序列表示字符串
- MATLAB将字符串视为一个行向量
- 可以使用字符串构成矩阵,每行字符数必须相同
- 字符串中的
'
使用''
表示1
2
3
4>> ch = ['abcdef';'123456']
ch =
abcdef
123456
转换
- 使用abs和double函数获得字符串矩阵对应的ASCII码数值矩阵
- 使用char获得ASCII码数值矩阵对应的字符串
代码示例
在使用MATLAB对字符串进行操作时, 也应该充分的使用MATLAB提供的矩阵操作, 从而更加高效的完成任务
以下代码演示将字符串逆序排列
1
revch = ch(end:-1:1)
以下代码演示将小写字符转化为大写字母,其他字符不变
1
2
3ch = 'Good Good';
k = find(ch>='a' & ch <='z');
ch(k) = ch(k) - ('a'-'A');
输出函数
使用disp函数, 此函数接受一个向量, 输出向量元素依次连接构成的字符串
1 | f = 12.33 |
结构矩阵
使用结构可以存储不同元素,并且将不同类型的元素使用同一个变量名进行管理
结构矩阵的建立
1 | >> a.x1 = 12; a.x2 = 'LiZeC'; a.x3 = [12;32]; |
从定义方式来看, MATLAB的结构与Python的类很相似, 可以动态的添加属性. 定义的时候,可以将a(1)写成a, 后续引用的时候,a就表示整个结构数组了
结构矩阵的引用
- 引用结构变量(矩阵本身): 显示矩阵大小,成员名
- 引用结构矩阵元素:
- 成员是矩阵时,显示矩阵大小
- 成员不是矩阵时,显示成员的值
- 引用元素的成员: 显示值
1 | >> a(1) |
结构矩阵的修改
- 矩阵大小,成员都可以动态的添加, 如果赋值的属性不存在,则自动扩展
- 使用rmfield函数删除成员
1 | >> a = rmfield(a,'x2') |
单元数据(Cell)
单元数据的每个元素都可以是不同的类型, 通过下标或者序号直接访问各个元素
1 | >> b = {10,'Hello',[1,2,3];12,'LiZeC',[4,5,6];'GGBoy',[23,33,3],23} |
稀疏矩阵
稀疏存储矩阵的创建
- 稀疏存储矩阵仅存储矩阵所有的非零元素的值及其位置, 从而节省存储空间
- 使用sparse函数创建一个稀疏矩阵
1 | >> A = sparse(4,5) |
转化和产生
- 使用sparse函数将一个完全存储的矩阵转化为稀疏存储的矩阵
- 使用full函数将一个稀疏存储的矩阵转化为完全存储矩阵
- 使用spconvert产生一个指定格式的稀疏矩阵
1 | >> I = eye(5) |
带状稀疏矩阵
带状稀疏矩阵指非零元素主要分布在对角线或其平行线上的矩阵. 例如下面的矩阵A就是一个带状稀疏矩阵
1 | A = |
对于上述矩阵,可以按照以下方式创建
1 | m = 5; % 最终矩阵的行数 |
注意:
- 对于B矩阵, 如果
m < n
, 则对于每条对角线,从第一行开始补零, 如果m >= n
, 则对于每条对角线,从第一列开始补零 - 例如上述矩阵A的-3对角线上,第一个元素是第4行,因此前面补3个零
- 分析可知, 补零无论是从行数还是从列数, 总是试图加入少的零, 相等时数列
其他格式介绍
调用方法 | 效果 |
---|---|
[B,d] = spdiags(A) | 根据矩阵A提取前述的矩阵B和d |
B = spdiags(A,d) | 根据d提取矩阵A指定的对角线(符合B的格式) |
E = spdiags(B,d,A) | 使用B替换矩阵A中由d指定的对角线 |
speye(m,n) | 产生稀疏单位矩阵 |
MATLAB程序设计
M文件分类
- M文件可以分为命令文件(Script)和函数文件(Function)
- 使用命令文件时可以直接操作工作空间中的变量, 和直接在命令行上执行其中的命令一样
- 使用函数文件时, 函数的变量会作为函数的局部变量在执行完毕后清除
数据的输入与输出
- 输入使用 A = input(‘提示信息’,选择), 选项为’s’时表示作为字符串处理,否则始终视为数字
- 输出使用 disp([输出项1,输出项2,…])
MATLAB其他特殊语法结构
switch语句
1 | switch 表达式 |
注意:
- 不需要break, 执行一个语句组以后直接退出
- switch表达式可以时标量或者字符串, case语句可以时标量,字符串以及单元矩阵
try语句
1 | try |
注意:
- 抛出异常后,保存在lasterr中,通过该变量获得异常信息
- 各种错误(包括指令拼写错误等)都可以被catch, 因此可以保证程序执行不出现错误
函数文件
function 输出形参表 = 函数名(输入形参表)
注释说明部分
函数体语句
函数是按照文件名调用的, 因此一定要保证文件名和函数名一致
函数参数可调性
- nargin 调用函数时, 输入变量的个数
- nargout 调用函数时,输出变量的个数
全局变量
- 使用global声明全局变量
- 在工作空间使用global定义全局变量后, 函数内部使用global再次声明
- 大量数据的传递可以使用全局变量
MATLAB符号计算
产生符号
1 | syms x y a b |
求导
function | description |
---|---|
diff(S,’v’) | 对符号对象S 中指定的符号变量v, 求其1阶导数 |
diff(S) | 对符号对象S 中的默认的独立变量求其1阶导数 |
diff(S,n) | 对符号对象S中的默认的独立变量求其n阶导数 |
diff(S,’v’,n) | 对符号对象S 中指定的符号变量v求其n阶导数 |
符号表达式求值
1 | subs(f,x,1) % 将x替换为1 |
符号求解
1 | sol = solve(eq1, eq2, …, eqn, var1, var2, …, varn) |
其中eq1到eqn为表达式,var1到varn为未知变量, 例如
1 | syms x y |
补充阅读
最后更新: 2024年04月18日 13:26
版权声明:本文为原创文章,转载请注明出处
原始链接: https://lizec.top/2018/03/07/MATLAB%E7%AC%94%E8%AE%B0/