添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在MATLAB中,不显式指定数据类型的情况下,默认所有的数据类型均为double类型。如果需要创建一个其他类型的变量,只需要加上其符号名即可,例如

a = int8(13);		% 创建一个字节型整数13
b = single(25.56);	% 创建一个单精度浮点数25.56
c = -32;		% 未显式指明数据类型,创建一个双精度浮点数32

MATLAB中,有几个特殊的常量,它们分别是:

  • pi:圆周率π
  • eps:最小浮点数
  • Inf:正无穷大,即1/0
  • NaN:非数,即0/0
  • i,j:虚数单位
  • 复合数据类型——矩阵

    类似一般编程语言中的数组,MATLAB中也有很多复合数据类型,可以将众多基本数据类型合并到一起。最为常见的符合数据类型包括矩阵结构体元胞矩阵

    矩阵是MATLAB中的基本运算单元,即使是一个数在MATLAB中也是被当做1*1的矩阵看待的。矩阵由若干维度组成,例如0维矩阵表示一个元素,1维矩阵表示一个向量,还有2维、3维甚至更高维的矩阵。在MATLAB中,常规矩阵的最小维度为2维,即一般数学意义上的矩阵,而标量、向量都是矩阵的特例。下面我们将以2维矩阵为例,介绍其生成与运算。

    矩阵的生成方式主要包括以下几种方式:

    1. 直接输入

    利用直接输入的方法,我们可以生成一个矩阵。输入的矩阵用中括号表示,同一行元素之间使用逗号或空格分开,用分号或回车结束一行的输入。例如

    >> a = [1,2,3; 4,5,6]
         1     2     3
         4     5     6
    >> b = [2 3 4
    5 6 7]
         2     3     4
         5     6     7
    

    当输入的矩阵不指定变量名称时,结果将暂时保存到ans变量中,即

    >> [2,3; 3,4]
    ans =
    

    如果没有及时保存结果,ans变量中的内容将会被下一次不指定变量名称的输出结果覆盖。

    2. 函数生成

    MATLAB中有一些好用的函数,用于构造一些具有特殊性质的矩阵。例如常用的构造函数:

    >> zeros23 = zeros(2,3) % 生成2*3的零矩阵
    zeros23 =
         0     0     0
         0     0     0
    >> ones3 = ones(3) % 生成3*3的全1矩阵,方阵只需要输入行数
    ones3 =
         1     1     1
         1     1     1
         1     1     1
    >> eye32 = eye(3,2) % 生成3*2的单位对角阵
    eye32 =
    

    类似的函数还有rand()(生成随机矩阵), magic()(生成幻方矩阵)等,大家可以自行尝试。

    3. 矩阵计算

    MATLAB中提供了以下的矩阵运算符

  • +(加法),-(减法),*(乘法),’(转置),\(左除),/(右除),^(乘幂)
  • 在使用矩阵运算符的过程中,应使得操作矩阵符合矩阵运算性质。例如

    >> ones(2)^3
    ans =
    >> eye(3,2) * eye(2,4)
    ans =
         1     0     0     0
         0     1     0     0
         0     0     0     0
    >> ans'
    ans =
         1     0     0
         0     1     0
         0     0     0
         0     0     0
    

    特别的,当加法、减法和乘法作用于矩阵和标量时,代表对矩阵中每个元素进行对应的处理,例如

    >> eye(2,3) + 1
    ans =
         2     1     1
         1     2     1
    >> 4.5*ones(2)
    ans =
        4.5000    4.5000
        4.5000    4.5000
    

    另外,对于左除和右除,其用法如下:

  • 设\(A\)为可逆矩阵,\(AX=B\)的解是\(X=A\setminus B\),\(XA=B\)的解是\(X=B/A\)。
  • 除此之外,矩阵还有一些特殊的运算,称之为“点”运算,使用较多的包括.*(点乘)和.^(点乘幂)。点运算的特殊之处在于,它不是按照矩阵的运算规律进行计算的,而是对具有相同大小的两矩阵,将对应元素进行乘或乘幂的操作。例如

    >> [1,2,3] .* [4,5,6]
    ans =
         4    10    18
    >> [1,2,3] .^ [4,5,6]
    ans =
         1    32   729
    

    4. 冒号运算符与矩阵拼接

    在MATLAB中,:(冒号运算符)是非常重要的一个符号,利用冒号可以轻松表示等差数列。例如

    >> a = 1:5 % 创建从1到5,公差为1(可省略)的等差数组
         1     2     3     4     5
    >> b = 1:3:10 % 创建从1到10,公差为3的等差数组
         1     4     7    10
    

    取出矩阵元素时,我们只需要指定选取的行号与列号即可。请注意,MATLAB中所有下标均从1开始而非从0开始,请一定牢记!!!

    >> a = magic(5)
        17    24     1     8    15
        23     5     7    14    16
         4     6    13    20    22
        10    12    19    21     3
        11    18    25     2     9
    >> a(3,2) % 选取a的第3行,第2列元素
    ans =
    >> a(1:2,2:4) % 选取a的1~2行,2~4列元素
    ans =
        24     1     8
         5     7    14
    >> a(2,:) % 选取a的第2行,所有列元素
    ans =
        23     5     7    14    16
    >> a(1:2:5,[2,5]) % 选取a的第[1,3,5]行,第[2,5]列元素
    ans =
        24    15
         6    22
        18     9
    >> a(3:end,4) % 选取a的第三行到最后一行,第4列元素
    ans =
    

    基于此,我们可以对长度吻合的矩阵进行拼接,例如

    >> a = [1:5, ones(1,3); zeros(2,8)]
         1     2     3     4     5     1     1     1
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
    >> b = [a(1,1:2:7); 4:-0.5:2.5]
        1.0000    3.0000    5.0000    1.0000
        4.0000    3.5000    3.0000    2.5000
    

    除了冒号运算符,还有一种生成等差数列的方式,即使用linspace(a,b,n)函数生成从a到b共n个数值的等差数列。同样的,利用logspace(a,b,n)可以生成从\(10^a\)到\(10^b\)共n个数值的等比数列。例如

    >> a = linspace(0,pi,5)
             0    0.7854    1.5708    2.3562    3.1416
    >> b = logspace(0,1,4)
        1.0000    2.1544    4.6416   10.0000
    

    注意,无论使用冒号运算符,或是linspace函数,生成的矩阵均为1*n的矩阵,即为行向量。使用转置符号可以将其转置为列向量。

    复合数据类型——字符串

    上面介绍的所有类型均为数字类型的变量。而最常见的非数类型的变量就是字符串了。MATLAB中,使用单引号表示字符串:

    >> a = 'hello'
    hello
    

    字符串是一个特殊的行向量,其每个元素是一个字符。

    >> b = a(2:4)
    

    字符串的拼接类似数组的拼接,但是需要注意由于字符串是行向量,只能进行横向拼接,否则将会报错。

    >> [a,b]
    ans =
    helloell
    

    字符串和数字之间的转换也十分容易,可以利用num2str()str2num()函数进行:

    >> ['1+1=', num2str(1+1)]
    ans =
    1+1=2
    >> 2 + str2num('3.2')
    ans =
        5.2000
    

    复合数据类型——结构体(了解)

    结构体是一种特殊的数据类型,是由“变量”和其拥有的“字段”共同组成的,在初学阶段可能见到的比较少,更多的是调用MATLAB内置函数后生成的结构体变量。例如一个学生,他拥有姓名、年龄、期末成绩三个“字段”。利用“.”点运算,我们可以这样定义一个学生:

    >> student.name = 'Mike'
    student = 
        name: 'Mike'
    >> student.age = 22
    student = 
        name: 'Mike'
         age: 22
    >> student.grade = [83,80,85,90]
    student = 
         name: 'Mike'
          age: 22
        grade: [83 80 85 90]
    

    可以看到,随着我们不断向student变量中增加字段,其包含的信息也越来越多。同样的,我们也可以使用struct(filed,value,...)的方式直接生成结构体:

    >> student = struct('name','Mike','age',22,'grade',[83,80,85,90])
    student = 
         name: 'Mike'
          age: 22
        grade: [83 80 85 90]
    >> student.grade
    ans =
        83    80    85    90
    

    如果想要了解更多关于结构体的用法,可以查阅MATLAB的帮助文档。

    复合结构类型——元胞矩阵(了解)

    元胞矩阵是矩阵的一种扩展,虽然直到现在我也不知道这个名字是怎么取出来的。在矩阵中,一个元素代表的都是一个数,或者都是一个字符。但是在元胞矩阵中,这种限制被打破,不同位置可以拥有任何类型的元素,包括字符串,数值或矩阵。为了区分元胞矩阵和普通矩阵,我们使用大括号进行定义,在使用元素时,也是用大括号对其进行取出。

    >> a = {'hello',500; [30,20,40],[]}
        'hello'         [500]
        [1x3 double]       []
    >> a{1,1}
    ans =
    hello
    >> a{2,1}(3)
    ans =
    

    可能你在尝试的过程中也发现了,利用小括号也能对其元素进行取出。关于这两种方式有何不同,我们将在之后的一篇关于元胞矩阵的讨论中再次提到。同样的,MATLAB的帮助文档永远是你的好帮手。