一、MATLAB基础知识

1.1 MATLAB系统环境

命令行窗口:

  • >> 为命令提示符,在其后输入命令
  • … 为续行符,可以在下一行继续输入

当前文件夹:

  • CD命令选择工作文件夹
  • 导航栏直接输入选择

工作区:

  • 保存变量
  • 可以直接编辑

搜索路径(优先级):

  1. 变量
  2. 内部函数
  3. 程序文件

    1. 当前文件夹下的程序文件
    2. 文件搜索路径文件夹中的程序文件
    >> clear
    >> x=sin(1)
    x =
        0.8415
    >> sin=[1,2,3,4,5]
    sin =
        1 2 3 4 5
    >> x=sin(1)
    x =
        1

不要定义与matlab库重复的函数

设置文件搜索路径:

  • 用path命令设置文件搜索路径:

    >> path(path,'e:\work')
  • 用对话框设置文件搜索路径、或右键选中文件夹添加到搜索路径

1.2 MATLAB数值数据

数值数据类型的分类

  • 整型(8种)

    • 无符号整数:
      uint8(x)函数,将数值数据转换为无符号8位整数,超过位数范围则只显示最大值

      • 无符号8位整数:数据范围:00000000~11111111(0~2^8^-1)
      • 无符号16位整数
      • 无符号32位整数
      • 无符号64位整数
    • 带符号整数:
      int8(x)函数,将数值数据转换为带符号8位整数,超过位数范围则只显示最大值

      • 带符号8位整数:数据范围:10000000~11111111(-2^7^~2^7^-1)
      • 带符号16位整数
      • 带符号32位整数
      • 带符号64位整数
  • 浮点型(2种)

    • 单精度型:
      single(x)函数,将其他类型的数据转换为单精度型

    内存中占用4个字节

    • 双精度型:==matlab默认类型==
      double(x)函数,将其他类型的数据转换为双精度型

    内存中占用8个字节

    >> class(4)    //调用class函数
    ans =
        double
    >> class(single(4))    //调用single函数转换为单精度
    ans =
        single
  • 复数型
    复型数据包括实部和虚部两个部分,实部和虚部默认为双精度型,虚数单位用ij 来表示。(6+5i与6+5j为同一个数)

    • 实部:
      real(x)函数,求复数的实部
    • 虚部:
      imag(x)函数,求复数的虚部

数值数据的输出格式

  • format命令:format 格式符

    >> format long
    >> 50/3
    ans =
        16.666666666666668
    >>format
    >> 50/3
    ans =
        16.6667

    】format命令只影响输出格式,而不影响数据的计算和存储

常用数学函数

  1. 函数的调用格式:==函数名(函数自变量的值)==

    • 函数的自变量规定为矩阵变量,也可以是标量(标量本身是矩阵的一种特例)
    • 函数在运算时是将函数逐项作用于矩阵的每个元素上,所以最后运算的结果就是一个与自变量同型的矩阵
    >> A=[4,2;3,6]
    A = 
        4 2
        3 6
    >> B=exp(A)        //调用exp函数求自然指数
    B =
        54.5982    7.3891
        20.0855 403.4288
  2. 常用函数的应用

    1. 三角函数sin(x)
      有以弧度为单位的函数和以角度为单位的函数,如果是以角度为单位的函数,就在函数名后面加“d”,以示区别

      • sin(x):输入弧度,pi
      • sind(x):输入角度,90°、180°
      >> sin(pi/2)
      ans =
          1
      >> sind(90)
      ans =
          1
    2. abs(x)函数

      • 求实数的绝对值
      • 复数的模
      • 字符串的ASCii码值
      >> abs(-4)
      ans =
          4
      >> abs(3+4i)
      ans =
          5
      >> abs('a')
      ans =
          97
    3. 取整函数

      • round(x):四舍五入
      • ceil(x):向上取整(向右),取大于等于这个数的第一个整数
      • floor(x):向下取整(向左),取小于等于这个数的第一个整数
      • fix(x):舍去小数(向零),固定取靠近0的那个整数
      >> round(4.7)
      ans =
          5
      >> ceil(-3.8)
      ans =
          -3
      >> floor(3.6)
      ans =
          3
      >> fix(-3.2)
      ans =
          -3
    4. 函数应用举例:

      1. 求一个三为正整数的个位、十位、百位
        rem(a,b)取余函数:取a除以b的余数

        • 个位:三位正整数除以10的余数
        • 十位:三为正整数除以10取整去掉个位,再将所得再除以10取余,得到新个位,也就是原数的十位
        • 百位:三为正整数除以100后取整去掉十位个位,得到百位
        >> m=345
        >> m1=rem(m,10)
        m1 =
            5
        >> m2=rem(fix(m/10),10)
        m2 =
            4
        >> m3=fix(m/100)
        m3 =
            3
      2. 求[1,100]区间的所有素数
        isprime(n):判断n是否为素数,当n是素数时返回1,否则返回0

        >> x=1:100        //生成1-100全部整数的向量x
        >> k=isprime(x)    //调用isprime函数生成k向量,k向量为1/0
        >> k1=find(k)    //k1向量为k向量中非0元素的序号
        >> p=x(k1)        //输出全部素数

1.3 变量及其操作

变量与赋值语句

  • 变量本质上讲是内存单元的一个抽象
  • 在matlab中,变量名是以字母开头,后接字母、数字或下划线的字符序列,最多63个字符。
  • 变量名区分字母大小写
  • 标准函数名以及命令名必须用小写字母
  • 赋值语句两种格式:

    • 变量=表达式
    • 表达式

      • 将表达式的值赋给预定义变量ANS,自动显示结果
      • 后面加;则不显示ANS结果

预定义变量

由系统本身定义的变量

  • ans是<u>默认赋值变量</u>
  • ij代表<u>虚数单位</u>
  • pi代表<u>圆周率</u>
  • NaN代表<u>非数</u>

变量的管理

  1. 内存变量的删除与修改
    在工作区窗口,右键选择功能

    • who命令:只显示驻留变量名称
    • whos命令:显示变量的Name、Size、Bytes、Class、Attributes
  2. 内存变量文件
    用于保存matlab工作区变量的文件叫做内存变量文件,其扩展名为.mat,也叫MAT文件

    • save命令:创建内存变量文件

      >> save mydata a x    //保存a、x变量->mydata文件
    • load命令:装入内存变量文件

      >> load mydata

1.4 MATLAB矩阵的表示

矩阵的建立

  1. 利用直接输入法建立矩阵:
    将矩阵的元素用==中括号==括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用==逗号或空格==分隔,不同行的元素之间用==分号==分隔。

    >> A=[1,2,3;4,5,6;7,8,9]
    A =
    1 2 3
    4 5 6
    7 8 9
  2. 利用已建好矩阵建立更大的矩阵:
    一个大矩阵可以由已经建立好的小矩阵拼接而成。

    >> A=[1,2,3;4,5,6;7,8,9];
    >> B=[-1,-2,-3;-4,-5,-6;-7,-8,-9];
    >> C=[A,B;B,A]
  3. 实部矩阵虚部矩阵构成复数矩阵

    >> B=[1,2,3;4,5,6];
    >> C=[4,5,6;7,8,9];
    >> A=B+i*C
    A =
    

冒号表达式

  1. 表达式格式:e1:e2:e3 【初始值:步长:终止值】
    ​省略步长e2,则步长为1

    • e1:初始值
    • e2:步长
    • e3:终止值
    >> t=0:1:5    //等价于 t=0:5
    t =
        0 1 2 3 4 5
  2. linspace(a,b,n)函数:
    ​生成从a到b的n个数,步长平均

    • a:第一个元素
    • b:最后一个元素
    • n:元素总数,当n省略时,自动产生100个元素
    >> x=linspace(0,pi,6)
    x =
        0    0.628    1.2566    1.8850    2.5133    3.1416

结构矩阵和单元矩阵

  1. 结构矩阵
    格式为:结构矩阵元素.成员名=表达式

    >> a(1).x1=10;a(1).x2='liu';a(1).x3=[11,21;31,41];
    >> a(2).x1=12;a(2).x2='wang';a(2).x3=[12,22;32,42];
    >> a(3).x1=13;a(3).x2='cai';a(3).x3=[13,23;33,43];
  2. 单元矩阵
    建立单元矩阵和一般矩阵相似,直接输入就可以了,知识单元矩阵元素用==大括号==括起来。

    >> b={11,'liu',[11,21;31,41];...
          12,'wang',[12,22;32,42];...
          13,'cai',[13,23;33,43]}
    b =
        [11]    'liu'    [2x2 double]
        [12]    'wang'    [2x2 double]
        [13]    'cai'    [2x2 double]

1.5 矩阵元素的引用

矩阵元素的引用方式

  1. 通过下标来引用矩阵的元素
    A(3,2)表示A矩阵的第三行第二列的元素

    >> A(3,2)=10;        //仅修改某个元素
    
    >> A=[1,2,3;4,5,6];    //生成一个2行3列的矩阵
    >> A(4,5)=10        //为第4行第5个元素赋值,扩增的元素都为0
    A =
        1    2    3    0    0
        4    5    6    0    0
        0    0    0    0    0
        0    0    0    0    10
  2. 通过序号来引用

    • 在matlab中,矩阵元素按列存储,即首先存储矩阵的第一列元素,然后存储第二列元素,…,一直到矩阵的最后一列元素
    • 矩阵元素的序号就是矩阵元素在内存中的排列顺序
    >> A=[1,2,3;4,5,6]
    A =
        1    2    3
        4    5    6
    >> A(3)
    ans =
        2
    • 序号与下标是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i
    • 矩阵元素的下标可以利用sub2ind和ind2sub函数实现相互转换

      • sub2ind(S,i,j)函数:将矩阵中指定元素的行、列下标转换成存储的序号。调用格式为:

        >> D=sub2ind(S,i,j)
        • S:行数和列数组成的向量,[m,n]
        • D:序号
        • i:转换矩阵元素的行下标
        • j:转换矩阵元素的列下标
        >> A=[1:3;4:6]
        A =
            1    2    3
            4    5    6
        >> D=sub2ind(size(A),[1,2;2,2],[1,1;3,2])
        D =
            1    2
            6    4
      • ind2sub(S,D)函数:将矩阵元素的序号转换成对应的下标,其调用格式为:

        >> [i,j]=ind2sub(S,D)
        • [i,j]:元素下标
        • S:行数和列数组成的向量,[m,n]
        • D:序号
        >> [i,j]=ind2sub([3,3],[1,3,5])    //获取3x3矩阵中第1,3,5个元素的下标
        i =
            1    3    2
        j =
            1    1    2

利用冒号表达式获得子矩阵

  • 子矩阵是指由矩阵中的一部分元素构成的矩阵

    >> A(i,:)            //第i行的全部元素
    >> A(:,j)            //第j列的全部元素
    >> A(i:i+m,j:j+m)    //第i~i+m行内且在第j~j+m列中的所有元素,m+1维
    >> A(i:i+m,:)        //第i~i+m行的全部元素
    >> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15]
    A =
        1    2    3    4    5
        6    7    8    9    10
        11    12    13    14    15
    >> A(1:2,:)
    ans =
        1    2    3    4    5
        6    7    8    9    10
    >> A(2:3,1:2:5)
    ans =
        6    8    10
        11    13    15
  • end运算符:表示某一维度的末尾元素下标

    >> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20];
    >> A(end,:)
    ans =
        16    17    18    19    20
    >> A([1,4],3:end)
    ans =
        3    4    5
        18    19    20

利用空矩阵删除矩阵的元素

  • 空矩阵是指没有任何元素的矩阵

    >> x=[]
    x =
        []        //x是一个空矩阵
    >> A=[1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8]
    A =
        1    2    3    0    0
        7    0    9    2    6
        1    4    -1    1    8
    >> A(:.[2,4])=[]
    A =
        1    3    0
        7    9    6
        1    -1    8

改变矩阵的形状

  • reshape(A,m,n):在矩阵总元素保持不变的前提下,将矩阵A重新排成mxn的二维矩阵
    【注意】reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序

    >> x=[23,45,65,34,65,34,98,45,78,65,43,76];
    >> y=reshape(x,3,4)        //将x转换为3行4列的矩阵y
    y =
        23    34    98    65
        45    65    45    43
        65    34    78    76
  • A(:):将矩阵A的每一列元素堆叠起来,成为一个列向量

    >> A=[-45,65,71;27,35,91]
    A =
        -45    65    71
        27    35    91
    >> B=A(:)        // A(:)等价于reshape(A,元素个数,1)
    B =
        -45
        27
        65
        35
        71
        91

1.6 MATLAB基本运算

在算术运算、关系运算和逻辑运算中,算术运算的优先级最高,逻辑运算优先级最低,但逻辑非运算是单目运算,它的优先级比双目运算要高。

算术运算

  1. 基本算术运算符:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)
    matlab的算术运算是在矩阵意义下进行的

单个数据的算术运算只是矩阵运算的一种特例

    • 加减运算

      • 若两矩阵同型,则运算时两矩阵的相应元素相加减
      • 若两矩阵不同型,则matlab将给出错误信息
      • 一个标量也可以和矩阵进行加减运算,这是把标量和矩阵的每一个元素进行加减运算
    • 乘法运算

      • 矩阵A和B进行乘法运算,要求A的列数和B的行数相等,此时则称A、B矩阵是可乘的,或称A和B两矩阵维数和大小相容
      • 如果两者维数或大小不相容,则将给出错误信息,提示用户两个矩阵是不可乘的
    • 除法运算
      在MATLAB中,有两种矩阵除法运算:右除/左除\,如果A矩阵是非奇异方阵,则B/A等效于B*inv(A),AB等效于inv(A)*B

    对于矩阵来说,右除和左除表示两种不同的除数矩阵和被除数矩阵关系

    >> A=[1,2,3;4,2,6;7,4,9];
    >> B=[4,3,2;7,5,1;12,7,92];
    >> C1=B/A            //等效于B右乘以A的逆,即B*inv(A)
    C1 =
        -0.1667    -3.3333    2.5000
        -0.8333    -7.6667    5.5000
        12.8333    63.6667    -36.5000
    >> C2=A\B            //等效于B左乘以A的逆,即inv(A)*B
    C2 =
        0.5000    -0.5000    44.5000
        1.0000    0.0000    46.0000
        0.5000    1.1667    -44.8333
     
    >> 3/4
    ans =
        0.7500
    >> 4\3
    ans =
        0.7500
        
    >> a=[10.5,25]
    a =
        10.5000    25.0000
    >> a/5
    ans =
        2.1000    5.0000
    >> 5\a
    ans =
        2.1000    5.0000
    • 乘方运算
      一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量

      >> A=[1,2,3;4,5,6;7,8,0];
      >> A^2        //等价于A*A
      ans =
          30    36    15
          66    81    42
          39    54    69
    1. 点运算

      • 点运算符:.*./.\.^
      • 两矩阵进行点运算是指它们的<u>对应元素进行相关运算</u>,要求两矩阵同型
      >> A=[1,2,3;4,5,6;7,8,9];
      >> B=[-1,0,1;1,-1,0;0,1,1];
      >> C=A.*B    //点乘运算,矩阵对应元素相乘
      C =
          -1    0    3
          4    -5    0
          0    8    9
      >> D=A*B    //矩阵乘法,按照矩阵规则相乘
      D =
          1    1    4
          1    1    10
          1    1    16
      // 当x=0.1、0.4、0.7、1时,分别求y=sin(x)*cos(x)的值
      >> x=0.1:0.3:1
      x =
          0.1    0.4    0.7    1
      >> y=sin(x).*cos(x);

    关系运算

    • 关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于等于)、==(等于)、~=(不等于)。
    • 当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。

      >> 3>4
      ans =
          0
      >> x=5;
      >> x==5
      ans =
          1
    • 当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,他的元素由0或1组成。
    • 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,最终的关系运算的结果时一个与原矩阵同型的矩阵,他的元素由0或1组成。

      //    建立3阶方阵A,判断A的元素是否为偶数
      >> A=[24,35,13;22,63,23;39,47,80]
      A =
          24    35    13
          22    63    23
          39    47    80
      >> P=rem(A,2)==0
      P =
          1    0    0
          1    0    0
          0    0    1

    逻辑运算

    • 逻辑运算符:&(与)、|(或)、~(非)。
    • 设参与逻辑运算的时两个标量a和b,那么运算规则为:

      • a&b:a、b全为非零时,运算结果为1,否则为0
      • a|b:a、b中只要有一个为非零时,运算结果为1
      • ~a:当a为零时,运算结果为1;当a为非零时,运算结果为0
      >> 3<4 & 6>5
      ans =
          1
      >> ~(9==1)
      ans =
          1
      >> ~9==1
      ans =
          0
    • 若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由0或1组成。
    • 若参与逻辑运算的一个是标量,一个是矩阵,那么将在标量与矩阵中的每个元素之间按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由0或1组成。
    //    水仙花数是指各位数字的立方之和等于该数本身的三为正整数。
    //    求全部水仙花数。
    >> m=100:999;
    >> m1=rem(m,10);
    >> m2=rem(fix(m/10),10);
    >> m3=fix(m/100);
    >> k=find(m==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3)
    k =
        54    271    272    308
    >> s=m(k)
    s =
    

    1.7 字符串处理

    matlab数据类型分为数值型数据和字符型数据(字符串)

    字符串的表示

    • 在matlab中,字符串是用单引号括起来的字符序列

      >> xm='HeBei University';
      >> xm(1:3)
      ans =
          HeB
    • 若字符串中的字符含有单引号,则该单引号字符要用两个单引号表示

      >> 'I''m a teacher.'
      ans =
          I'm a teacher.
    • 建立多行字符串,形成字符串矩阵

      >> ch=['abcdef';'123456'];
      >> ch(2,3)
      ans =
          3
    • 【例】建立一个字符串向量,然后对该向量做如下处理:

      1. 取第1~5个字符组成的子字符串
      2. 将字符串倒过来重新排列
      3. 将字符串中的小写字幕变成相应的大写字幕,其余字符不变
      4. 统计字符串中小写字母的个数
      >> ch='ABc123d4e56Fg9';
      >> subch=ch(1:5)    //1.sub
      subch =
          ABc12
      >> revch=ch(end:-1:1)    //2.reverse
      revch =
          9gF65e4d321cBA
      >> k=find(ch>='a'&ch<='z')
      k =
          3    7    9    13
      >> ch(k)=ch(k)-('a'-'A')    //3.upper
      ch =
          ABC123D4E56FG9
      >> length(k)                //4.length
      ans =
          4

    字符串操作

    1. 字符串的执行
      格式:eval(s):s为含有可执行函数的字符串

      >> t=pi;
      >> m='[t,sin(t),cos(t)]';
      >> y=eval(m)
      y =
          3.1416    0.0000    -1.0000
    2. 字符串与数值之间的转换

      • abs(x)和double(x)函数都可以用来获取字符串矩阵所对应的ASCii码数值矩阵
      • char(x)函数可以把ASCii码矩阵转换为字符串矩阵

        >> s1='MATLAB';
        >> a=abs(s1)
        a =
            77    65    84    76    65    66
        >> char(a+32)
        ans =
            matlab
    3. 字符串的比较
      字符串的比较有两种方法:利用关系运算符或字符串比较函数

      • 关系运算符比较:
        两个字符串里的每个字符依次按ASCii值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0。

        >> 'www0'>='W123'
        ans =
            1    1    1    0
      • 字符串比较函数:
        用于判断字符串是否相等,有4种比较方式,函数如下:

        • strcmp(s1,s2):比较字符串s1和s2是否相等,如果相等返回1,否则返回0。
        • strcmpi(s1,s2):在忽略字母大小写的前提下,比较字符串s1和s2是否相等,如果相等返回1,否则返回0。
        • strncmp(s1,s2,n):比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0。
        • strncmpi(s1,s2,n):在忽略字母大小写的前提下,比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0。
        >> strcmp('www0','w123')
        ans =
            0
            
        >> strncmpi('Www0','w123',1)
        ans =
            1
    4. 字符串的查找与替换

      • findstr(s1,s2):返回短字符串在长字符串种的开始位置。
      • strrep(s1,s2,s3):将字符串s1种的所有子字符串s2替换为s3。
      >> s1='This is a test!';
      >> s2='is';
      >> findstr(s1,s2)
      ans =
          3    6
      
      >> s3='test';
      >> s4='class';
      >> strrep(s1,s2,s3)
      ans =
          This is a class!
    Last modification:July 16th, 2021 at 08:21 pm