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~/notxor(逻辑异或),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:ba: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:弧度制转角度制
      • sinasinsindasind:弧度制/角度制下的正弦及反正弦
      • cosacoscosdacosd:弧度制/角度制下的余弦及反余弦
      • tanatanatan2(y,x)tandatandatan2d(y,x):弧度制/角度制下的正切及反正切,其中atan返回值为\([-\frac{\pi}{2},\frac{\pi}{2}]\)atan2返回值是\([-\pi,\pi]\)
      • cotacotcotdacotd:弧度制/角度制下的余切及反余切
      • secasecsecdasecd:弧度制/角度制下的正割及反正割
      • cscacsccscdacscd:弧度制/角度制下的余割及反余割
    • 双曲及反双曲函数:
      • sinhasinh:双曲正弦及反双曲正弦
      • coshacosh:双曲余弦及反双曲余弦
      • tanhatanh:双曲正切及反双曲正切
      • cothacoth:双曲余切及反双曲余切
      • sechasech:双曲正割及反双曲正割
      • cschacsch:双曲余割及反双曲余割
  • 舍入函数:

    • 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中通常为使用冒号运算符创建向量代替。

  • 跳转语句:breakcontinue

文件及自定义函数

  • 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等。
posted @ 2025-12-07 15:50  椰萝Yerosius  阅读(17)  评论(0)    收藏  举报