MATLAB简介
MATLAB简介
本文为Oakland University EGR 1400:工程与计算机科学领域的计算机问题的笔记,并假设读者已具有线性代数、C及Python基础。
EGR 1400:
- Part Ⅰ 工程程序(C+外教C#)
- Part Ⅱ 科学计算(MATLAB简介)
MATLAB运行环境
MATLAB简介
-
MATLAB:中文意为矩阵实验室(Matrix Lab),美国MathWorks出品的高端商业(付费)数学软件,基于C++开发,以数值分析、矩阵运算、数据可视化、建模仿真等方面见长。
-
MATLAB拥有丰富的生态,以工具箱(Toolbox)提供,涵盖科学计算、信号处理、图像处理、控制工程、人工智能、金融建模等各个前沿领域,是工业和科研界的“瑞士军刀”。
-
前沿应用:
-
控制工程:飞行器、汽车、机器人系统设计,使用Simulink进行建模与仿真;
-
数据分析与科学计算:处理大规模实验数据、算法验证、优化计算;
-
数字信号处理与通信:滤波器设计、通信信号仿真;
-
人工智能与机器学习:通过专门的工具箱快速搭建神经网络、训练模型。
-
-
可用于数学建模竞赛的模型建立求解与可视化。
-
进入美国“实体清单”的中国高校被禁止使用MATLAB,如哈工大、西工大、哈工程、北航等。常见替代方案包括Python、Octave等。
MATLAB窗口

- MATLAB是一门解释型语言。与Python相同,MATLAB也分为命令行模式与脚本文件(扩展名
.m)模式。 - 命令行模式:输入表达式后立即返回其值,并继续读取输入。这一过程称为REPL(Read-Eval-Print Loop 阅读-执行-打印 循环)。若要取消表达式输出,则在命令后加
;。对于较大规模的数据集,则必须取消输出以加快程序执行速度。
变量、数据类型及基本I/O
变量
- MATLAB中变量与Python相同,无需定义,在第一次使用时赋值即可。
- 若不将表达式赋给变量,则其将被赋值给默认变量
ans。 - 变量名规则:
-
必须以字母开头,之后可以是任意字母、数字、下划线。变量名对大小写敏感,不能超过31个字符。
-
禁止使用内置关键字作为变量名,使用
iskeyword查看MATLAB保留关键字。 -
允许占用内置变量和函数名作为变量名,使用
which 符号名查看当前符号所指向的是谁。使用clear 符号名,通过清除工作区内特定变量,从而恢复系统默认指向。 -
两个重要无理数变量:
pi(\(\pi\)),e(\(e\))
-
- 所有变量均被保存在工作区,在工作区能看到其信息。
- 清除命令行:
clc;清除工作区:clear
数据类型及运算符
- 数据类型:整型、浮点型、复数(\(a+bi\))
- 算术运算符:
+,-,*,/,^ - 关系运算符:
==,~=(不等号),>,>=,<,<=。关系运算符组成了仅返回0(假)或1(真)的布尔表达式。 - 逻辑运算:
&/&&/and(&不具有短路效应,&&具有短路效应,下同),|/||/or,~/not,xor(逻辑异或),any(有0为真),all(无0为真)
基本I/O
input(str):从stdin获取输入,str为输入提示信息字符串(不可省略)。input(str,'s'):从stdin获取一个字符串('s'指定,MATLAB中字符串为单引号'包围)。disp(x):将变量 \(x\) 输出到stdout,\(x\) 可为标量、向量、矩阵。
disp([x y]):对多个变量进行输出。当输出包含字符串时,必须将其他内容也转为字符串。num2str:将数字转换为字符串。fprintf:格式化输出,其用法及行为与C中的printf一致。
向量及矩阵代数
向量
-
向量:分为行向量和列向量。使用以下方法创建向量:
-
直接输入:使用
[]创建一个向量或矩阵。在向量中,;代表分行符,,代表分列符。
如[2,3,4]或[2 3 4]为创建行向量\((2,3,4)\),[2;3;4]代表创建列向量\(\begin{pmatrix}2\\3\\4\end{pmatrix}\)。一般情况下,,用空格代替。也可通过其他向量名创建:如
A=[2 3 4],B=[A A],则\(B=(2,3,4,2,3,4)\)。 -
冒号法:
a:i:b,在 \([a,b]\) 区间内以步长为 \(i\) 创建行向量,注意步长为第二个参数。 -
linspace(a,b,N):在 \([a,b]\) 中生成 \(N\) 个线性等距点(即等差数列),公差为 \((b-a)/(n-1)\)。 -
logspace(a,b,N):在 \([10^a,10^b]\) 生成 \(N\) 个对数等距点(即等比数列),公比为 \(10^{(b-a)/(N-1)}\)。logspace的实现原理:先按原参数生成linspace,再将各个分量 \(x_i\) 替换为 \(10^{x_i}\)。
-
-
向量尺寸:
size(a),返回一个行向量,第一个分量为 \(a\) 的行数,第二个分量为 \(a\) 的列数。 -
向量中分量的下标从1开始。
-
向量中分量的访问:基本格式:
x(sth.),其中sth.可为:-
单个元素:如
x(i)为访问分量 \(x_i\)。 -
向量:常用方法为使用冒号运算符生成向量:
-
x(a:b):切片出子向量\((x_a,x_{a+1},\dots ,x_{b-1},x_b)\),步长为1。 -
x(a:i:b):切片出子向量,步长为 \(i\)。
-
-
布尔表达式:如
x(x>=6),返回向量 \(x\) 中所有满足 \(x_i\ge 6\) 的分量所组成的新向量,新向量方向与原向量相同。使用find(布尔表达式)返回所有满足该条件的值的索引,因此等价于x(find(x>=6))。
注意不能访问越界。
-
-
向量代数:
x':向量的转置 \(x^T\)。- 线性运算:即
+,-,*,/,与线性代数的法则及要求一致。- 向量与数运算:向量中逐分量与该数运算。对于
+和-,直接使用即可;对于*和/,必须显式写为.*或./。 - 向量与向量运算:
- 对于
+和-:对应分量做运算,要求两向量大小必须相等。 - 对于
*:向量乘法。对于 \(a\times b\),要求 \(a\) 的列数必须等于 \(b\) 的行数。 - 对于
/(右除):对于 \(a/b\),解 \(xb=a\)。 - 对于
\(左除):对于 \(a\verb|\| b\),解 \(ax=b\)。
- 对于
- 向量与数运算:向量中逐分量与该数运算。对于
- 其他运算:基本初等函数(反对幂指三):逐分量计算。其中逐分量计算幂函数为
.^。 norm(a):求向量模长。dot(a,b):求两向量的点积,等价于 \(a^Tb\)。cross(a,b):求两向量的叉积,要求两向量的分量数必须为 \(3\)。sum(a):向量中各分量之和;prod(a):向量中各分量之积。cumsum(a):向量中各分量的前缀和;cumprod(a):向量中各分量的前缀积。
矩阵
-
创建矩阵:
-
直接输入:矩阵可视为若干个行向量拼接而成,使用
;分隔矩阵的行即可。A=[ 1 2 3; 4 5 6; 7 8 9 ]也可通过其他向量及矩阵名创建,如
A=[2 3 4],B=[A';A'],则\(B=\begin{bmatrix} 2 & 2 \\ 3 & 3 \\ 4 & 4 \end{bmatrix}\)。 -
脚本文件:对于高阶的矩阵,可将其保存到
.m文件中,在命令行中输入该文件名,导入文件中的矩阵。注意需要使用;取消输出,否则程序执行可能非常缓慢。 -
load命令:创建一个纯文本文件,文件名即为该矩阵名,一个文件只能代表一个矩阵。文件中直接填充矩阵内容,使用load 文件名加载该矩阵。
-
-
矩阵尺寸:
size(A)。返回一个行向量,第一个分量为 \(A\) 的行数,第二个分量为 \(A\) 的列数。 -
在内存中,矩阵为按列存储。矩阵中每个元素具有一个索引,其编号规则为从1开始,按列优先,从上到下,从左到右。如\(B=\begin{bmatrix} 2 & 2 \\ 3 & 3 \\ 4 & 4 \end{bmatrix}\) 中各元素编号为\(\begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix}\)。
-
矩阵元素索引、行下标、列下标均为从1开始。
-
矩阵元素访问:基本格式:
A(sth.),其中sth.可为:- 按行列定位:如
A(2,3)即访问 \(a_{2,3}\)。 - 向量:上述方法的行号与列号均可替换为向量,常用方法为使用冒号运算符生成向量:
a:b或a:i:b:如A(2:3,1:4)表示第2-3行、第1-4行组成的子矩阵。::表示某一维度上的所有。如A(2,:)表示第2行的所有元素组成的子矩阵。end关键字:表示某一维度上的最后一项。如A(end,:)表示矩阵 \(A\) 中最后一行最后一列的所有元素。
- 按索引:
A(idx),其中idx为索引编号。 - 布尔表达式:如
A>=6,返回矩阵 \(A\) 中所有满足 \(a_{i,j}\ge 6\) 的元素所组成的列向量。使用find(布尔表达式)返回所有满足该条件的值的索引,因此等价于A(find(A>=6))。
- 按行列定位:如
-
矩阵代数:
+,-,*:与线性代数运算法则及要求一致。- 矩阵与数运算:矩阵中逐元素与该数运算。对于
+和-,直接使用即可;对于*和/,必须显式写为.*和./。 - 矩阵与矩阵运算:
- 对于
+和-:矩阵尺寸必须一致,为逐元素运算。 - 对于
*:矩阵乘法。对于\(A\times B\),要求 \(A\) 的列数必须等于 \(B\) 的行数。 - 对于
/(右除):对于 \(A/B\),解 \(XB=A\)。 - 对于
\(左除):对于 \(A\verb|\| B\),解 \(AX=B\)。
- 对于
- 矩阵与数运算:矩阵中逐元素与该数运算。对于
- 其他运算:基本初等函数均能作用于矩阵,为逐元素计算。
A':求矩阵转置 \(A^T\)diag(A):提取矩阵 \(A\) 主对角线上的元素;trace(A):矩阵 \(A\) 的迹。det(A):方阵 \(A\) 的行列式inv(A):方阵\(A\) 的逆矩阵sum:对矩阵为各列之和;prod:对矩阵为各列之积cumsum:对矩阵做各列前缀和;cumprod:对矩阵做各列前缀积
-
矩阵操作:
- 变维:
reshape(A,n,m):将矩阵 \(A\) 中所有元素重排为 \(n\) 行 \(m\) 列的矩阵。重排规则为从上到下,从左到右。 - 旋转:
rot90(A):将矩阵 \(A\) 逆时针旋转 \(90^\text{o}\);rot90(A,k):将矩阵 \(A\) 逆时针旋转 \(k\cdot90^\text{o}\);fliplr(A):将矩阵 \(A\) 左右(left & right)翻转;flipud(A):将矩阵 \(A\) 上下(up & down)翻转。
- 变维:
-
特殊的矩阵:
eye(n):创建 \(n\) 阶单位阵。(单位阵:主对角线为 \(1\),其余均为 \(0\) 的方阵)ones(n,m):创建 \(n\times m\) 的全 \(1\) 矩阵;ones(n):创建 \(n\) 阶全 \(1\) 方阵;ones(size(A)):创建与矩阵 \(A\) 尺寸相同的全 \(1\) 矩阵。zeros(n,m):创建 \(n\times m\) 的全 \(0\) 矩阵;zeros(n):创建 \(n\) 阶全 \(0\) 方阵;zeros(size(A)):创建与矩阵 \(A\) 尺寸相同的全 \(0\) 矩阵。rand(n,m):创建 \(n\times m\) 的随机矩阵,其中元素范围在 \([0,1]\) 区间;rand(size(A)):创建与矩阵 \(A\) 尺寸相同的随机矩阵。magic(n):创建 \(n\) 阶魔方方阵。(魔方方阵:每行、每列、主副对角线元素之和均相等的方阵。可证 \(1\) 阶魔方阵唯一,不存在 \(2\) 阶魔方阵,\(n\ge 3\) 阶魔方阵数量巨大。MATLAB中魔方阵构造算法固定,每阶只能构造出一个魔方阵。)vander(x):以向量 \(x\) 创建范德蒙德矩阵。(范德蒙德矩阵:形如 \(\begin{bmatrix} x_1^m & \cdots & x_1^1 & x_1^0\\ x_2^m & \cdots & x_2^1 & x_2^0\\ \vdots & \ddots & \vdots & \vdots\\ x_n^m & \cdots & x_n^1 & x_n^0 \end{bmatrix}\) 的矩阵,其中低次幂在右,高次幂在左。)hilb(n):创建 \(n\) 阶希尔伯特矩阵。(希尔伯特矩阵:每一项 \(H_{i,j}=\frac{1}{i+j-1}\) 的矩阵)
常用函数
-
帮助函数:
help -
运算函数:
rem(a,b):取余sign(x):符号函数
-
基本初等函数(反对幂指三):
sqrt(x):\(\sqrt x\),nthroot(x,n):\(\sqrt[n]{x}\)exp(x):\(e^x\)log(x):\(\ln x\),log10(x):\(\lg x\),log2(x):\(\log_2 x\)- 三角及反三角函数:
deg2rad:角度制转弧度制,rad2deg:弧度制转角度制sin,asin;sind,asind:弧度制/角度制下的正弦及反正弦cos,acos;cosd,acosd:弧度制/角度制下的余弦及反余弦tan,atan,atan2(y,x);tand,atand,atan2d(y,x):弧度制/角度制下的正切及反正切,其中atan返回值为\([-\frac{\pi}{2},\frac{\pi}{2}]\),atan2返回值是\([-\pi,\pi]\)。cot,acot;cotd,acotd:弧度制/角度制下的余切及反余切sec,asec;secd,asecd:弧度制/角度制下的正割及反正割csc,acsc;cscd,acscd:弧度制/角度制下的余割及反余割
- 双曲及反双曲函数:
sinh,asinh:双曲正弦及反双曲正弦cosh,acosh:双曲余弦及反双曲余弦tanh,atanh:双曲正切及反双曲正切coth,acoth:双曲余切及反双曲余切sech,asech:双曲正割及反双曲正割csch,acsch:双曲余割及反双曲余割
-
舍入函数:
round:四舍五入fix:向 \(0\) 取整floor:向下取整ceil:向上取整
-
数论:
factor:分解质因数gcd(x,y):最大公约数lcm(x,y):最小公倍数primes(x):求 \(<x\) 的所有质数isprime(x):判断 \(x\) 是否为质数,返回一个布尔值
-
数理统计:
max/min:求向量/矩阵中的最大/最小值,默认返回一个参数。第二个参数为最值的下标,需使用形如[a,idx]=max(x)的形式显式调用。mean:均值median:中位数mode:众数std:标准差var:方差
-
排序:
sort:对向量为升序排列,对矩阵为按列升序排列;sort(x,'descend')降序排列。
流程控制
选择结构
-
if语句-
单分支结构:
if condition % command end -
双分支结构:
if condition % command1 else % command2 end-
多分支结构:
if condition1 % command1 elseif condition2 % command2 else % command3 end
-
-
switch...case语句switch variable case condition1 % command1 ... case condition n % command n otherwise % command n+1 -
实例——
menu函数:menu('Tip', 'Option1', 'Option2', ...),用于创建一个图形化菜单,其中参数从提示开始从0顺次编号,返回值即为点选的选项编号。
循环结构
-
while循环:while condition % command end -
for循环:for 迭代变量 = 可迭代对象 % command end可迭代对象可以为向量、矩阵。在迭代矩阵时,为列优先原则。
Python中用range进行的范围迭代,在MATLAB中通常为使用冒号运算符创建向量代替。 -
跳转语句:
break和continue。
文件及自定义函数
-
MATLAB文件:
.m,分为命令文件与函数文件。函数文件不能独立运行,必须被命令文件调用运行。 -
在MATLAB中,每个函数必须被定义为独立文件,文件名必须为函数名。
-
设当前函数名为
f,参数为x,返回值为y,则函数头为:function y=f(x) % command end -
函数可接受多个形参,也可有多个返回值:
function [a,b,c,...]=f(x,y,z,...) % command end调用时返回值取决于调用方式。若为
f(x)为只接收第一个返回值,[a,b]=f(x)为接收前两个返回值。必须按顺序接收返回值,不能跳过。若无需接收,则需用~占位(相当于C++中的ignore和Python的_)。 -
若无返回值且无形参,则直接写作:
function f() % command end -
注:函数体需以
end结束。
-
-
函数名命名规则:必须以字母开头,可包含字母、数字、下划线,不能使用保留关键字。
-
行内注释:
%;块注释:%{ }%。help命令原理即为打印函数文件开头且连续的注释。 -
查看参数数量:
nargin。若在函数文件中使用,则为接收到的形参数量。 -
变是的作用域:命令文件中变量为基工作区变量,其对函数不可见;函数中的变量为局部工作区变量,其生存周期仅限于该函数;使用
global标签所定义的变量为全局工作区变量,其对所有工作区可见,global标签需先声明后使用。 -
type(s):查看文件内容,其中s为函数文件名。
可视化
基本二维绘图
- 可视化的层级:
- Canvs(画布):底层隐藏画布
- Figure(图):图的独立窗口
- Subplot(子图):画布上的子图
- Plot(线):图上绘制的真实图形
- 使用
clf命令清除当前Figure;使用close(x)关闭第x个Figure;使用close all关闭所有Figure。
二维笛卡尔坐标系
-
plot:基础绘图命令,为二维笛卡尔坐标系下的绘图。调用时会打开一个新的Figure。使用figure(x)新建第 \(x\) 个Figure。-
plot(x):当 \(x\) 为向量时,以分量下标为横坐标,分量值为纵坐标绘图;当 \(X\) 为矩阵时,按列进行绘制,以行下标为横坐标,元素值为纵坐标绘图。
注:在同一子图上进行plot,则会进行覆盖。使用hold on从而保持该子图中先前绘图,实现追加绘图。 -
plot(x,y):当 \(x\) 和 \(y\) 是同维向量时,以 \((x_i,y_i)\) 绘图。 -
plot(x1,y1,x2,y2,...):绘制多条曲线,等价于hold on并顺序执行多个plot。 -
plot(x,y,s):s为样式控制字符串(以单引号包围),用于控制线条颜色、粗细,数据点类型、形状等,不同选项可互相叠加。 -
plot(x1,y1,s1,x2,y2,s2,...):绘制多条曲线,并进行样式控制。样式控制字符串可包含以下内容:


-
-
subplot(n,m,p):将当前Figure分割为 \(n\times m\) 个子图区域,并将第 \(p\) 个子图用作当前子图。子图编号从左到右,从上到下递增。 -
fplot(f,range):在给定区间range内绘制一元函数 \(f(x)\)。例:fplot(@(x) sin(x), [0, 10]);为绘制 \(\sin x\) 在 \([1,10]\) 内的函数图像。其中@(x) sin(x)为匿名函数,@为函数句柄,(x)为输入参数。
极坐标系
polar(theta,rho):极坐标系下的以 \(\theta\) 为极角,\(\rho\) 为极径进行绘图
绘图标注
-
axis(xmin,xmax,ymin,ymax):设置 \(x,y\) 轴最小值和最大值。 -
area(x,y):绘制面积图 -
title(s):添加题注,其中s为单引号字符串 -
xlabel(s):添加 \(x\) 轴标签;ylabel(s):添加 \(y\) 轴标签。其中s为单引号字符串。注:MATLAB中字符串使用单引号标注。若要在字符串中使用单引号,使用两个单引号进行转义。字符串中支持简化的 \(\TeX\) 语法。
-
grid on:对笛卡尔坐标系绘制网格图 -
legend(s1,s2,...):按照plot的顺序,为曲线添加图例,其中s1,s2代表字符串。
保存图形
saveas(gcf,s):保存当前Figure到s,其中s是图片路径。可选扩展名有.png、.jpg、.fig等。

浙公网安备 33010602011771号