MATLAB 学习笔记

Posted by 3nit on 2024-06-26

格式化

format()

https://ww2.mathworks.cn/help/matlab/ref/format.html?searchHighlight=format&s_tid=srchtitle_support_results_1_format

format(style)

formate style
Style 结果 示例
short 短固定十进制小数点格式,小数点后包含 4 位数。这是默认数值设置。 3.1416
long 长固定十进制小数点格式,double 值的小数点后包含 15 位数,single 值的小数点后包含 7 位数。 3.141592653589793
shortE 短科学记数法,小数点后包含 4 位数。 3.1416e+00
longE 长科学记数法,double 值的小数点后包含 15 位数,single 值的小数点后包含 7 位数。 3.141592653589793e+00
shortG 短固定十进制小数点格式或科学记数法(取更紧凑的一个),总共 5 位。 3.1416
longG 长固定十进制小数点格式或科学记数法(取更紧凑的一个),对于 double 值,总共 15 位;对于 single 值,总共 7 位。 3.14159265358979
shortEng 短工程记数法,小数点后包含 4 位数,指数为 3 的倍数。 3.1416e+000
longEng 长工程记数法,包含 15 位有效位数,指数为 3 的倍数。 3.14159265358979e+000
+ 正/负格式,对正、负和零元素分别显示 +- 和空白字符。 +
bank 货币格式,小数点后包含 2 位数。 3.14
hex 二进制双精度数字的十六进制表示形式。 400921fb54442d18
rational 小整数的比率。 355/113
Style 结果 示例
compact 隐藏过多的空白行以便在一个屏幕上显示更多输出。 theta = pi/2 theta = 1.5708
loose 添加空白行以使输出更易于阅读。这是行距的默认设置。 theta = pi/2 theta = 1.5708


矩阵

索引和元素编辑

  • 使用()索引

位置索引

线性索引

  • 按列索引

逻辑值索引

  • 按列输出

删除元素

1
2
3
4
5
A(:,3) = []
A(2,:) = []

A(2,2)=[]
% A null assignment can have only one non-colon index.

创建

zeros 创建全零数组
ones 创建全部为 1 的数组
rand 均匀分布的随机数
true 逻辑值 1(真)
false 逻辑 0(假)
eye 单位矩阵
diag 创建对角矩阵或获取矩阵的对角元素
blkdiag 分块对角矩阵
  • sparese()

    S = sparse(A)
    S = sparse(m,n)
    

合并

cat 串联数组。
horzcat 水平串联数组
vertcat 垂直串联数组
  • [A, B], [A; B]

网格

linspace 生成线性间距向量
logspace 生成对数间距向量
meshgrid 二维和三维网格
ndgrid N 维空间中的矩形网格

size & shape

length 最大数组维度的长度
size 数组大小
ndims 数组维度数目
numel 数组元素的数目
isempty 确定数组是否为空
resize Resize data by adding or removing elements (自 R2023b 起)
reshape 通过重新排列现有元素来重构数组
  • reshape()

    >> reshape(A,2,3)
    ans =
         1     3     5
         2     4     6
    >> reshape(A,[2],3)
    ans =
         1     3     5
         2     4     6
    

重排

sort 对数组元素排序
sortrows 对矩阵行或表行进行排序
flip 翻转元素顺序
fliplr 将数组从左向右翻转
flipud 将数组从上向下翻转
rot90 将数组旋转 90 度
transpose 转置向量或矩阵
  • isempty()

数据类型

数值

double 双精度数组
single 单精度数组
int8 8 位有符号整数数组
int16 16 位有符号整数数组
int32 32 位有符号整数数组
int64 64 位有符号整数数组
uint8 8 位无符号整数数组
uint16 16 位无符号整数数组
uint32 32 位无符号整数数组
uint64 64 位无符号整数数组
  • double()

    >> a = double(10.00)
    

显示转换

cast 将变量转换为不同的数据类型
typecast 在不更改基础数据的情况下转换数据类型
  • class()

    >> class(a)
    ans =
        'double'
    
    >> class(ones(3))
    ans =
        'double'
    
  • cast()

    B = cast(A,newclass)
    B = cast(A,"like",p)
    

复数

  • x = 2 + 3i
  • z = complex(x, y)
  • real(), imag()

    zr = real(z)
    zr =
        4.7842    0.8648    1.2616
        2.6130    4.8987    4.3787
        4.4007    1.3572    3.6865
    
    zi = imag(z)
    zi =
       -1.0921   -1.5931   -2.2753
       -0.0941   -2.3898   -3.7538
       -7.1512   -5.2915   -0.5182
    

Inf,NaN

字符

字符串

结构体

创建、引用结构体

Student.name = 'wangx';
Student.sex = 'Male';
Student.height = '170';

Student(2).name = 'zhangsan';
Student(2).sex = 'Male';
Student(2).height = 172;

field1 = 'f1';  value1 = zeros(1,10);
field2 = 'f2';  value2 = {'a', 'b'};
field3 = 'f3';  value3 = {pi, pi.^2};
field4 = 'f4';  value4 = {'fourth'};
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)

元胞

创建元胞

c = {42,rand(5),"abcd"}
c =
  1×3 cell array
    {[42]}    {5×5 double}    {["abcd"]}

C = {1,2,3;
 'text',rand(5,10,2),{11; 22; 33}}
C=_2×3 cell array_
    {[   1]}    {[          2]}    {[     3]}
    {'text'}    {5x10x2 double}    {3x1 cell}

C = cell(n)
C = cell(sz1,...,szN)
C = cell(sz)
D = cell(obj)

访问元胞元素

例如,假设有一个包含混合数据的 2×3 元胞数组。

C = {'one','two','three'; 
     100,200,rand(3,3)}

C=_2×3 cell array_
    {'one'}    {'two'}    {'three'   }
    {[100]}    {[200]}    {3x3 double}

每个元素都包含在一个元胞内。如果使用标准圆括号对该数组进行索引,得到的结果是一个包含元胞的元胞数组子集。

C2 = C(1:2,1:2)

C2=_2×2 cell array_
    {'one'}    {'two'}
    {[100]}    {[200]}

要向特定元胞读取或写入内容,请用花括号将索引括起来。

R = C{2,3}

R = _3×3_

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

函数句柄



函数

函数声明

function [y1,...,yN] = myfun(x1,...,xM)
    %code
end

function [y1,...,yN] = myfun(x1,...,xM) 声明名为 myfun 的函数,该函数接受输入 x1,...,xM 并返回输出 y1,...,yN。此声明语句必须是函数的第一个可执行代码行。有效的函数名称以字母字符开头,并且可以包含字母、数字或下划线。

  • return

    匿名函数

    h = @(arglist)anonymous_function

    sqr = @(n) n.^2;
    x = sqr(3)
    x =

    9
    


运算和数学

运算符

算数运算

加法
+ 添加数字,追加字符串
sum 数组元素总和
减法
- 减法
diff 差分和近似导数
乘法
.* 乘法
* 矩阵乘法
prod 数组元素的乘积
除法
./ 数组右除
.\ 数组左除
/ 求解关于 x 的线性方程组 xA = B
\ 求解关于 x 的线性方程组 Ax = B
.^ 按元素求幂
^ 矩阵幂
转置
.' 转置向量或矩阵
' 复共轭转置
模除法和舍入
mod 除后的余数(取模运算)
rem 除后的余数
idivide 带有舍入选项的整除
ceil 向正无穷舍入
fix 向零舍入
floor 向负无穷舍入
round 舍入至最近的小数或整数

关系运算

== 确定相等性
>= 决定大于或等于
> 确定大于
<= 确定小于等于
< 确定小于
~= 确定不相等性

逻辑运算

& 计算逻辑 AND
~ 计算逻辑 NOT
[`\ `](https://ww2.mathworks.cn/help/matlab/ref/or.html) 计算逻辑 OR
xor 计算逻辑异 OR
all 确定所有的数组元素是为非零还是 true
any 确定是否有任何数组元素非零
find 查找非零元素的索引和值

集合运算

intersect 设置两个数组的交集
ismember 判断数组元素是否为集数组成员
setdiff 设置两个数组的差集
setxor 设置两个数组的异或
union 设置两个数组的并集
unique 数组中的唯一值
ismembertol 容差范围内的集合成员
uniquetol 容差内的唯一值
join 使用键变量按行合并两个表或时间表
innerjoin 两个表或时间表之间的内联

离散数学

factor 质因数
factorial 输入的阶乘
gcd 最大公约数
isprime 确定哪些数组元素为质数
lcm 最小公倍数
nchoosek 二项式系数或所有组合
perms 所有可能的排列
matchpairs 求解线性分配问题
primes 小于等于输入值的质数
rat 有理分式近似值
rats 有理输出

线性代数

inv 矩阵求逆
cross 叉积
dot 点积
det 矩阵行列式
rank 矩阵的秩
rref 简化的行阶梯形矩阵(Gauss-Jordan 消去法)
trace 对角线元素之和
tril 矩阵的下三角形部分
triu 矩阵的上三角部分

随机数生成

rand 均匀分布的随机数
randn 正态分布的随机数
randi 均匀分布的伪随机整数
randperm 整数的随机排列
  • rand()
    X = rand 返回从区间 (0,1) 的均匀分布中得到的随机标量。
    X = rand(n) 返回一个由均匀分布的随机数组成的 n×n 矩阵。
    X = rand([sz1,...,szN]) 返回由随机数组成的 sz1×…×szN 数组,其中 sz1,...,szN 指示每个维度的大小。例如:rand(3,4) 返回一个 3×4 的矩阵。

    X = rand
    X = rand(n)
    X = rand(sz1,...,szN)
    
  • randi()
    X = randi([imax]) 返回一个介于 1imax 之间的伪随机整数标量。

    X = randi(imax)
    X = randi(imax,n)
    X = randi(imax,sz1,...,szN)
    
    X = randi([imin,imax],___)
    


流程控制

if, elseif, else 条件为 true 时执行语句
switch, case, otherwise 执行多组语句中的一组
for 用来重复指定次数的 for 循环
while 条件为 true 时重复执行的 while 循环
try, catch 执行语句并捕获产生的错误
break 终止执行 for 或 while 循环
return 将控制权交还给调用脚本或函数
continue 将控制传递给 forwhile 循环的下一迭代
pause 暂时停止执行 MATLAB
parfor 并行 for 循环
end 终止代码块或指示最大数组索引
  • if, elseif, else

    if `expression`
        `statements`
    elseif `expression`
        `statements`
    else
        `statements`
    end
    
  • switch

    switch `switch_expression`
       case `case_expression`
          `statements`
       case `case_expression`
          `statements`
        ...
       otherwise
          `statements`
    end
    
  • for

    for v = 1.0:-0.2:0.0
       disp(v)
    end
    
    for v = [1 5 8 17]
       disp(v)
    end
    
  • try, catch

    try
       `statements`
    catch `exception`
       `statements`
    end
    
  • pause(n)



代数

多项式

MATLAB® 将多项式表示为行向量,其中包含按降幂排序的系数。

 %p(x)=x2−4x+4。
p = [1 -4 4];

 %p(x)=4x5−3x2+2x+33。
p = [4 0 0 -3 2 33];
poly 具有指定根的多项式或特征多项式
polydiv Polynomial long division (自 R2024a 起)
polyfit 多项式曲线拟合
residue 部分分式展开(部分分式分解)
roots 多项式根
polyval 多项式计算
polyint 多项式积分
polyder 多项式微分

符号运算

Symbolic Math Toolbox

符号创建

  • sym(), syms符号变量

    % 创建符号
    a1Sym = sym(1/3)
    a2Sym = sym(pi)
    bSym = sin(sym(pi))
    sym('1234567 + 1i')
    
    y = sym('y')
    syms x
    syms a b c
    A = sym('a',[1 10])
    
    %符号表达式
    phi = (1 + sqrt(sym(5)))/2;
    f = phi^2 - phi - 1
    
    syms a b c x
    f = a*x^2 + b*x + c
    
    %等式
    eqn = (x^2 + y^2)^4 == (x^2 - y^2)^2;
    
  • syms符号函数

    syms f(x,y)
    f(x,y) = x^2*y
        f(x, y) =
        x^2*y
    
    %Find the value of `f` at `(3,2)`.
    f(3,2)
        ans =
        18
    
    %Symbolic functions accept array inputs.
    xVal = 1:5;
    yVal = 3:7;
    f(xVal,yVal)
        ans =
        [ 3, 16, 45, 96, 175]
    %从隐函数生成
    y1 = @(a,b) cos(a) + cos(b); 
    ys1 = sym(y1);
    

    运算

    多项式
  • collect(f)
  • factor(f)

    syms x
    g = x^3 + 6*x^2 + 11*x + 6;
    factor(g)
    
    ans =
    [ x + 3, x + 2, x + 1]
    
  • expand(f)
  • simplify(f)
  • subs(f,[x,y,z],[a,b,c])
  • coeffs()

    syms x y
    cx = coeffs(x^3 + 2*x^2*y + 3*x*y^2 + 4*y^3, x)
    cy = coeffs(x^3 + 2*x^2*y + 3*x*y^2 + 4*y^3, y)
        cx =
        [ 4*y^3, 3*y^2, 2*y, 1]
    
        cy =
        [ x^3, 2*x^2, 3*x, 4]
    
  • coeffs(f,x)
  • sym2poly(f)
  • poly2sym(pl,x)
  • [N,D] = numden(A)
  • finverse(f)
  • compose(f,g)

    微积分
  • diff(f,x,y)

  • int(f,x,[0,1])
  • limit(f,x,0,"left")
  • `taylor(f,x,0,’Order’,10)
  • symsum(f,k,[0,Inf])

    求解

  • solve()

    syms x
    solve(x^3 - 6*x^2 == 6 - 11*x)
    
    solve(x^3 - 6*x^2 + 11*x - 6)
    
    %If you do not specify any variable, you get the solution of an equation for the alphabetically closest to `x` variable.
    syms x y
    solve(6*x^2 - 6*x^2*y + x*y^2 - x*y + y^3 - y^2 == 0, y)
        ans =
            1
          2*x
         -3*x
    
    syms x y z
    [x, y, z] = solve(z == 4*x, x == y, z == x^2 + y^2)
    
  • dsolve(ode,[cond])

    syms y(x)
    Dy = diff(y);
    
    ode = diff(y,x,2) == cos(2*x)-y;
    cond1 = y(0) == 1;
    cond2 = Dy(0) == 0;
    
    %Solve `ode` for `y`. Simplify the solution using the `simplify` function.
    
    conds = [cond1 cond2];
    ySol(x) = dsolve(ode,conds);
    ySol = simplify(ySol)
        ySol(x) =
        1 - (8*sin(x/2)^4)/3
    

绘图

  • fplot(), fplot3(), fpolarplot()

    syms x
    f = x^3 - 6*x^2 + 11*x - 6;
    fplot(f)
    
    %参数方程
    syms t
    fplot3(t^2*sin(10*t), t^2*cos(10*t), t)
    
  • fimplicit()

    %设定界限
    syms x y
    eqn = (x^2 + y^2)^4 == (x^2 - y^2)^2;
    fimplicit(eqn, [-1, 1])
    

绘图

网格

  • meshgrid()

    [X,Y] = meshgrid(x,y)
    [X,Y] = meshgrid(x)
    [X,Y,Z] = meshgrid(x,y,z)
    [X,Y,Z] = meshgrid(x)
    
    %使用均匀间隔的 _x_ 坐标和 _y_ 坐标在区间 [-2,2] 内创建二维网格。
    x = -2:0.25:2;
    y = x;
    [X,Y] = meshgrid(x);
    

在二维网格上计算并绘制函数 f(x,y)=xe−x2−y2。

Get

F = X.*exp(-X.^2-Y.^2);
surf(X,Y,F)

图形对象 figure

  • get(h,propName), set(h,propName,Value)

    子图 subplot

    ubplot(m,n,p)
    subplot(m,n,p,’replace’)
    subplot(m,n,p,’align’)
    ax = subplot(___)
    subplot(ax)
    %eg1

    subplot(2,2,1);
    x = linspace(-3.8,3.8);
    y_cos = cos(x);
    plot(x,y_cos);
    title('Subplot 1: Cosine')
    
    subplot(2,2,2);
    y_poly = 1 - x.^2./2 + x.^4./24;
    plot(x,y_poly,'g');
    title('Subplot 2: Polynomial')
    
    subplot(2,2,[3,4]);
    plot(x,y_cos,'b',x,y_poly,'g');
    title('Subplot 3 and 4: Both')
    

    绘图类型

    线图

  • plot(), plot3()

    plot(X,Y)
    plot(X,Y,LineSpec)
    
    plot(X1,Y1,...,Xn,Yn)
    plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)
    
    plot(Y)
    plot(Y,LineSpec)
    
    % 指定属性
    figure
    plot(x,y,'--gs',...
        'LineWidth',2,...
        'MarkerSize',10,...
        'MarkerEdgeColor','b',...
        'MarkerFaceColor',[0.5,0.5,0.5])
    
    • Area 属性
    • Line 属性

      p = plot(x,y1,x,y2);
      
      p(1).LineWidth = 2;
      p(2).Marker = '*';
      
    • title

      title(titletext)
      title(titletext,subtitletext)
      title(___,Name,Value)
      
      title(ax1,'Top Plot')
      title(ax2,'Bottom Plot')
      
      t = title(___)
      t.Color = 'red';
      
    • xlabel, ylabel

      xlabel(txt)
      xlabel(target,txt)
      xlabel(___,Name,Value)
      t = xlabel(___)
      
    • xlim, ylim

      xlim(limits)
      xlim(limitmethod)
      xlim(limitmode)
      xl = xlim
      limmethod = xlim("method")
      limmode = xlim("mode")
      ___ = xlim(target,___)
      
      %eg1
          xlim([0 5])
          xlim([0 inf])
          xlim tight
          xlim auto
      
      %eg2
          xl = xlim
          xl = _1×2_
              -3     4
      
    • legend

      legend
      legend(label1,...,labelN)
      legend(labels)
      legend(subset,___)
      legend(target,___)
      
      legend(___,Name,Value)
      
      legend(vsbl)
      legend('off')
      
      lgd = legend(___)
      
      %eg1
          x = linspace(0,pi);
          y1 = cos(x);
          plot(x,y1)
      
          hold on 
          y2 = cos(2*x);
          plot(x,y2)
      
          legend('cos(x)','cos(2x)')
      
          y3 = cos(3*x);
          plot(x,y3,'DisplayName','cos(3x)')
      
      %eg2
          tiledlayout(2,1)
          y1 = rand(3);
          ax1 = nexttile; 
          plot(y1)
      
          y2 = rand(5);
          ax2 = nexttile; 
          plot(y2)
      
          legend(ax1,{'Line 1','Line 2','Line 3'})
      
    • hold on, hold off

    • axis equal
    • grid on, grid off
    • yyaxis

      yyaxis left
      yyaxis right
      yyaxis(ax,___)
      %eg1
          load('accidents.mat','hwydata')
          ind = 1:51;
          drivers = hwydata(:,5);
          pop = hwydata(:,7);
      
          yyaxis left
          scatter(ind,drivers)
          title('Highway Data')
          xlabel('States')
          ylabel('Licensed Drivers (thousands)')
      
          yyaxis right
          scatter(ind,pop)
          ylabel('Vehicle Miles Traveled (millions)')
      
    • text

      x = linspace(-5,5);
      y = x.^3-12*x;
      plot(x,y)
      
      xt = [-2 2];
      yt = [16 -16];
      str = {'local max','local min'};
      text(xt,yt,str)
      
    • colormap

      colormap map
      colormap(map)
      colormap(target,map)
      cmap = colormap(___)
      cmap = colormap
      cmap = colormap(target)
      
  • loglog, semilogx, semilogy
  • scatter()
  • polarplot()

  • fplot, fimplicit, fplot3

  • area

数据分布图

等高线图

contour 矩阵的等高线图
contourf 填充的二维等高线图
contourc 低级等高线矩阵计算
contour3

向量场图

quiver 箭头图或向量图
quiver3 三维箭头图或向量图
streamline 基于二维或三维向量数据绘制流线图
streamslice 在切片平面中绘制流线图
  • quiver

    quiver(X,Y,U,V)
    quiver(U,V)
    

曲面图

  • surf(), mesh()

    动画

  • movie, getframe, drawnow

    movie(M)
    movie(M,n)
    movie(M,n,fps)
    %g1
        h = figure;
        Z = peaks;
        surf(Z)
    
        loops = 40;
        M(loops) = struct('cdata',[],'colormap',[]);
    
        h.Visible = 'off';
        for j = 1:loops
            X = sin(j*pi/10)*Z;
            surf(X,Z)
            drawnow
            M(j) = getframe;
        end
    
        h.Visible = 'on';
        movie(M);
    

图像输出

exportgraphics 将绘图或图形内容保存到文件 (自 R2020a 起)
copygraphics 将绘图或图形内容复制到剪贴板 (自 R2020a 起)
exportapp 以图像或 PDF 格式捕获 App (自 R2020b 起)
getframe 捕获坐标区或图窗作为影片帧
saveas 将图窗保存为特定文件格式

show


GUI


数据导入

  • readtable

    T = readtable("patients.xls");
    T(1:5,1:5)
    
    ans =
    
      5×5 table
    
          LastName        Gender      Age              Location               Height
        ____________    __________    ___    _____________________________    ______
    
        {'Smith'   }    {'Male'  }    38     {'County General Hospital'  }      71  
        {'Johnson' }    {'Male'  }    43     {'VA Hospital'              }      69  
        {'Williams'}    {'Female'}    38     {'St. Mary's Medical Center'}      64  
        {'Jones'   }    {'Female'}    40     {'VA Hospital'              }      67  
        {'Brown'   }    {'Female'}    49     {'County General Hospital'  }      64
    
  • readmatrix

    M = readmatrix("basic_matrix.xls")
    
    M = 5×4
    
         6     8     3     1
         5     4     7     3
         1     6     7    10
         4     2     8     2
         2     7     5     9
    
  • readcell

    C = readcell("basic_cell.xls")
    
    C = 3×3 cell array
        {[                   1]}    {[    2]}    {[        3]}
        {'hello'               }    {'world'}    {[      NaN]}
        {[10-Oct-2018 10:27:56]}    {[    1]}    {1x1 missing}
    


???

  • sum()
  • 幻方
  • 线性方程解法