购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 矩阵及其函数

矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。矩阵的研究历史悠久,拉丁方阵和幻方在史前年代已有人研究。在数学名词中,矩阵用来表示统计数据等方面的各种有关联的数据,这个定义很好地解释了Matrix代码制造世界的数学逻辑基础。

阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。对一些应用广泛而形式特殊的矩阵,例如,稀疏矩阵和准对角矩阵,有特定的快速运算算法。在天体物理、量子力学等领域,也会出现无穷维的矩阵,是矩阵的一种推广。

MATLAB意为矩阵工厂(矩阵实验室),MATLAB的基本数据单位就是矩阵,它的指令表达式与数学、工程中常用的形式相似,可见学好MATLAB的矩阵运算是及其重要且非常具有实用价值的。

有些读者常常将二维数组和矩阵相互混淆,其他书中对于此说明也有所疏忽,故笔者在这里谈下二维数组和矩阵的关系:二维数组具有线性变换含义时,称为矩阵,否则,称为数组。从数据结构的形式上,两者没有区别。

2.3.1 矩阵的建立

在MATLAB中,有多种矩阵的创建方法,用户在使用时应根据实际情况,选择最优方法。

(1)直接输入法。

将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。

【例2-71】 直接输入法建立矩阵A。

    >>A = [16  3  2  13;5  10  11  8;9  6  7  12;4  15  14  1]
    A =
        16     3     2    13
         5    10    11     8
         9     6     7    12
         4    15    14     1

(2)M文件建立矩阵。

对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。

具体方法是启动有关编辑程序或MATLAB文本编辑器,并输入待建矩阵。把输入的内容存盘(设文件名为mymatrix.m)。运行该M文件,就会自动建立一个名为A的矩阵,可供以后使用。

(3)利用矩阵编辑器Array Editor创建矩阵。

先在命令窗口输入

    >>A=1

再在Workspace窗口中双击该变量,打开矩阵编辑器,进行输入和修改。

(4)特殊矩阵的建立,如表2-19所示。

表2-19 特殊矩阵的建立函数

  • Zeros 产生全0矩阵(零矩阵)。

【例2-72】 建立一个3×3零矩阵。

    >> zeros(3)
    ans =
         0     0     0
         0     0     0
         0     0     0

【例2-73】 建立一个3×2零矩阵。

    >> zeros(3,2)
    ans =
         0     0
         0     0
         0     0

【例2-74】 设A为2×3矩阵,则可以用zeros(size(A))建立一个与矩阵A同样大小的零矩阵。

    >> A=[1 2 3;4 5 6];    %产生一个2×3阶矩阵A
    >> zeros(size(A))      %产生一个与矩阵A同样大小的零矩阵
    ans =
         0     0     0
         0     0     0
  • ones 产生全1矩阵(幺矩阵)。
  • eye 产生单位矩阵。
  • rand 产生0~1间均匀分布的随机矩阵。

【例2-75】 创建在区间[20,50]内均匀分布的5阶随机矩阵。

    >> x=20+(50-20) *rand(5)
    x =
       44.4417   22.9262   24.7284   24.2566   39.6722
       47.1738   28.3549   49.1178   32.6528   21.0714
       23.8096   36.4064   48.7150   47.4721   45.4739
       47.4013   48.7252   34.5613   43.7662   48.0198
       38.9708   48.9467   44.0084   48.7848   40.3621

【例2-76】 创建均值为0.6,方差为0.1的5阶正态分布随机矩阵。

    >> y=0.6+sqrt(0.1) *randn(5)
    y =
        0.9272    0.8809    1.0549    0.5677    0.5905
        0.8299    0.2373    0.7028    0.5236    0.5479
        0.5040    0.2620    0.3613    0.7009    0.7985
        0.6929    0.3440    1.0333    0.6989    0.9457
        0.3510   -0.3311    0.0588    0.3265    0.9508

此外,常用的函数还有reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m×n的二维矩阵。

  • diag 获取矩阵的对角线元素,也可生成对角矩阵。

【例2-77】 使用diag函数获取矩阵A的对角线元素。

    >> A = [16  3  2  13;5  10  11  8;9  6  7  12;4  15  14  1]
    A =
        16     3     2    13
         5    10    11     8
         9     6     7    12
         4    15    14     1
    >> diag(A)
    ans =
        16
        10
         7
         1
  • tril 产生下三角矩阵。

【例2-78】 使用tril函数将矩阵A生成下三角矩阵。

    >> A = [16  3  2  13;5  10  11  8;9  6  7  12;4  15  14  1]
    A =
        16     3     2    13
         5    10    11     8
         9     6     7    12
         4    15    14     1
    >> tril(A)
    ans =
        16     0     0     0
         5    10     0     0
         9     6     7     0
         4    15    14     1
  • triu 产生上三角矩阵。

【例2-79】 使用triu函数将矩阵A生成上三角矩阵。

    >> A = [16  3  2  13;5  10  11  8;9  6  7  12;4  15  14  1]
    A =
        16     3     2    13
         5    10    11     8
         9     6     7    12
         4    15    14     1
    >> triu(A)
    ans =
        16     3     2    13
         0    10    11     8
         0     0     7    12
         0     0     0     1
  • pascal 产生帕斯卡矩阵。

帕斯卡矩阵是由杨辉三角形表组成的矩阵,杨辉三角形表是二次项(x+y)^n展开后的系数随自然数n的增大组成的一个三角形表。

【例2-80】 生成一个5阶帕斯卡阵。

    >> P=pascal(5)
    P =
           1              1              1              1              1
           1              2              3              4              5
           1              3              6             10             15
           1              4             10             20             35
           1              5             15             35             70

【例2-81】 求(x+y)5的展开式。

    >> pascal(6)
    ans =
      Columns 1 through 5
           1              1              1              1              1
           1              2              3              4              5
           1              3              6             10             15
           1              4             10             20             35
           1              5             15             35             70
           1              6             21             56            126
      Column 6  %矩阵次对角线上的元素1,5,10,10,5,1即为展开式的系数。
           1
           6
          21
          56
         126
         252
  • magic 产生魔方矩阵。

魔方矩阵有一个有趣的性质,其每行、每列及两条对角线上的元素和都相等。对于n阶魔方矩阵,其元素由1,2,3,…,n 2 共n 2 个整数组成。MATLAB提供了求魔方矩阵的函数magic(n),其功能是生成一个n阶魔方矩阵。

【例2-82】 使用magic函数产生魔方矩阵。

    >> A=magic(6)
    A =
        35     1     6    26    19    24
         3    32     7    21    23    25
        31     9     2    22    27    20
         8    28    33    17    10    15
        30     5    34    12    14    16
         4    36    29    13    18    11

【例2-83】 将101~125等25个数填入一个5行5列的表格中,使其每行每列及对角线的和均为565。

    >> M=100+magic(5)
    M =
       117   124   101   108   115
       123   105   107   114   116
       104   106   113   120   122
       110   112   119   121   103
       111   118   125   102   109
  • vander(V) 生成以向量V为基础向量的范得蒙矩阵。

范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积,可以用一个指定向量生成一个范得蒙矩阵。

【例2-84】 生成范得蒙矩阵。

    >> A=vander([3;4;3;5])
    A =
        27     9     3     1
        64    16     4     1
        27     9     3     1
       125    25     5     1
  • hilb(n) 生成希尔伯特矩阵。

希尔伯特矩阵(Hilbert matrix)是一种数学变换矩阵,正定且高度病态(即任何一个元素发生一点变动,整个矩阵的值和逆矩阵都会发生巨大变化),病态程度和阶数相关。故使用一般方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。MATLAB中,有一个专门求希尔伯特矩阵的逆的函数invhilb(n),其功能是求n阶的希尔伯特矩阵的逆矩阵。

【例2-85】 求5阶希尔伯特矩阵及其逆矩阵。

    >> format rat     %以有理形式输出
    >> H=hilb(5)
    H =
         1                1/2            1/3             1/4            1/5
         1/2             1/3            1/4             1/5            1/6
         1/3             1/4            1/5             1/6            1/7
         1/4             1/5            1/6             1/7            1/8
         1/5             1/6            1/7             1/8            1/9
    >> H=invhilb(5)
    H =
           25           -300           1050          -1400            630
        -300           4800         -18900          26880         -12600
        1050         -18900          79380        -117600          56700
       -1400          26880        -117600         179200         -88200
         630         -12600          56700         -88200          44100
  • toeplitz 生成托普利兹矩阵。

托普利兹(Toeplitz)矩阵除第一行第一列外,其他每个元素都与左上角的元素相同,即主对角线上的元素相等,平行于主对角线的线上的元素也相等。生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以x为第一列,y为第一行的托普利兹矩阵。这里x, y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的托普利兹矩阵。

【例2-86】 生成一个托普利兹矩阵。

    >> T=toeplitz(1:6)
    T =
      Columns 1    through 5
           1              2              3              4              5
           2              1              2              3              4
           3              2              1              2              3
           4              3              2              1              2
           5              4              3              2              1
           6              5              4              3              2
      Column 6
           6
           5
           4
           3
           2
           1
  • compan 生成伴随矩阵。

MATLAB生成伴随矩阵的函数是compan(p),其中,p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后。

【例2-87】 求多项式的x 3 -7x+6的伴随矩阵。

    >> p=[1,0,-7,6];
    >> compan(p)
    ans =
           0              7             -6
           1              0              0
           0              1              0

(5)行向量的建立

  • 冒号表达式建立向量 冒号是一个重要的运算符。形式为e1:e2:e3,其中,e1为初始值,e2为步长,e3为终止值。以e1为开始,e3为结束,步长为e2。
  • Linspace建立行向量 形式linspace(a,b,n),a和b分别为行向量的第一个和最后一个元素,n为总元素,省略n自动产生100个元素的行向量。

2.3.2 矩阵运算

1.算术运算

MATLAB的基本算术运算有+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)、’(转置)。运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。

1)矩阵加减运算

假定有两个矩阵A和B,则可以由A+B和A-B实现矩阵的加减运算。运算规则是若A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B矩阵的相应元素相加减。如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。

2)矩阵乘法运算

假定有两个矩阵A和B,若A为m*n矩阵,B为n*p矩阵,则C=A*B为m*p矩阵。

3)矩阵除法运算

在MATLAB中,有两种矩阵除法运算:\和/,分别表示左除和右除。如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。对于含有标量的运算,两种除法运算的结果相同。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系,一般A\B≠B/A。

4)矩阵的乘方运算

一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。

5)矩阵的转置运算

对实数矩阵进行行列互换,对复数矩阵,共轭转置,特殊的操作符.’共轭不转置(见点运算)。

6)点运算

在MATLAB中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算符有.*、./、.\和.^。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。

2.关系运算

MATLAB提供了6种关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。关系运算符的运算法则如下。

(1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。

(2)当参与比较的量是两个维数相同的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,其元素由0或1组成。

(3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,其元素由0或1组成。

3.逻辑运算

MATLAB提供了3种逻辑运算符:&(与)、|(或)和~(非)。逻辑运算的运算法则如下。

(1)在逻辑运算中,确认非零元素为真,用1表示,零元素为假,用0表示。

(2)设参与逻辑运算的是两个标量a和b,那么,a&b a,b全为非零时,运算结果为1,否则为0。a|b a,b中只要有一个非零,运算结果为1。~a 当a是零时,运算结果为1;当a非零时,运算结果为0。

(3)若参与逻辑运算的是两个同维矩阵,那么,运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成。

(4)若参与逻辑运算的一个是标量,另一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成。

(5)逻辑非是单目运算符,也服从矩阵运算规则。

(6)在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。

2.3.3 矩阵分析

1.对角阵与三角阵

1)对角阵

只有对角线上有非0元素的矩阵称为对角矩阵,对角线上的元素相等的对角矩阵称为数量矩阵,对角线上的元素都为1的对角矩阵称为单位矩阵。

  • 提取矩阵的对角线元素

设A为m×n矩阵,diag(A)函数用于提取矩阵A主对角线元素,产生一个具有min(m,n)个元素的列向量。diag(A)函数还有一种形式diag(A,k),其功能是提取第k条对角线的元素。

  • 构造对角矩阵

设V为具有m个元素的向量,diag(V)将产生一个m×m对角矩阵,其主对角线元素即为向量V的元素。diag(V)函数也有另一种形式diag(V,k),其功能是产生一个n×n(n=m+k)对角阵,其第m条对角线的元素即为向量V的元素。

【例2-88】 先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,…,第五行乘以5。

    >> A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;11,18,25,2,19];
    >> D=diag(1:5);
    >> D*A                %用D左乘A,对A的每行乘以一个指定常数
    ans =
          17              0              1               0             15
          46             10             14             28             32
          12              0             39               0             66
          40             48             76             84             12
          55             90            125             10             95

2)三角阵

三角阵又进一步分为上三角阵和下三角阵,所谓上三角阵,即矩阵的对角线以下的元素全为0的一种矩阵,而下三角阵则是对角线以上的元素全为0的一种矩阵。

  • 上三角矩阵

求矩阵A的上三角阵的MATLAB函数是triu(A)。triu(A)函数也有另一种形式triu(A,k),其功能是求矩阵A的第k条对角线以上的元素。例如,提取矩阵A的第2条对角线以上的元素,形成新的矩阵B。

  • 下三角矩阵

在MATLAB中,提取矩阵A的下三角矩阵的函数是tril(A)和tril(A,k),其用法与提取上三角矩阵的函数triu(A)和triu(A,k)完全相同。

2.矩阵的转置与旋转

(1)矩阵的转置操作使用转置运算符单撇号(’)。

(2)矩阵的旋转操作使用函数rot90(A,k),其中,k表示将矩阵A旋转90º的k倍,当k为1时可省略。

(3)矩阵实施左右翻转是将原矩阵的第一列和最后一列调换,第二列和倒数第二列调换,…,依次类推。MATLAB对矩阵A实施左右翻转的函数是fliplr(A),而对矩阵的上下翻转操作使用函数flipud(A)。

【例2-89】 A'是矩阵A的转置,B是将矩阵A旋转180°,C是A左右翻转得到的,D是A上下翻转得到的,求A'、B、C、D。

    >> A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;11,18,25,2,19];
    >> A
    A =
                    17              0              1              0             15
                    23              5              7             14             16
                     4              0             13              0             22
                    10             12             19             21              3
                    11             18             25              2             19
    >> A'
    ans =
                    17             23              4             10             11
                     0              5              0             12             18
                     1              7             13             19             25
                     0             14              0             21              2
                    15             16             22              3             19
    >> B=rot90(A,2)
    B =
                    19              2             25             18             11
                     3             21             19             12             10
                    22              0             13              0              4
                    16             14              7              5             23
                    15              0              1              0             17
    >> C=fliplr(A)
    C =
                    15              0              1              0             17        
                    16             14              7              5             23
                    22              0             13              0              4
                     3             21             19             12             10
                    19              2             25             18             11
    >> D=flipud(A)
    D =
                    11             18             25              2             19
                    10             12             19             21              3
                     4              0             13              0             22
                    23              5              7             14             16
                    17              0              1              0             15

3.矩阵的逆与伪逆

1)矩阵的逆

对于一个方阵A,如果存在一个与其同阶的方阵B,使得AB=BA=I(I为单位矩阵),则称B为A的逆矩阵,当然,A也是B的逆矩阵。求方阵A的逆矩阵可调用函数inv(A)。

2)矩阵的伪逆

如果矩阵A不是一个方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A’同型的矩阵B,使得ABA=A,BAB=B,此时称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。在MATLAB中,求一个矩阵伪逆的函数是pinv(A)。

3)用矩阵求逆方法求解线性方程组

在线性方程组Ax=b两边各左乘A-1,有

A-1Ax=A-1b

由于A-1A=I,故得

x=A-1b

【例2-90】 用求逆矩阵的方法解线性方程组。

    >> A=[1,2,3;1,4,9;1,8,27]
    A =
           1              2              3
           1              4              9
           1              8             27
    >> b=[5,-2,6]'
    b =
           5
          -2
           6
    >> x=inv(A) *b
    x =
          23
         -29/2
          11/3

也可以运用左除运算符“\”求解线性代数方程组。


4.方阵的行列式

行列式在数学中,是由解线性方程组产生的一种算式。行列式的特性可以被概括为一个多次交替线性形式,这个本质使得行列式在欧几里德空间中可以成为描述“体积”的函数。

把一个方阵看作一个行列式,并对其按行列式的规则求值,这个值就称为矩阵所对应的行列式的值。在MATLAB中,求方阵A所对应的行列式的值的函数是det(A)。

5.矩阵的秩与迹

(1)矩阵线性无关的行数与列数称为矩阵的秩。在MATLAB中,求矩阵秩的函数是rank(A)。

(2)矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。在MATLAB中,求矩阵的迹的函数是trace(A)。

6.向量和矩阵的范数

范数是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域,泛函是一个函数,其为矢量空间内的所有矢量赋予非零的正长度或大小。半范数反而可以为非零的矢量赋予零长度。

举一个简单的例子,在二维的欧氏几何空间R就可定义欧氏范数。在这个矢量空间中的元素常常在笛卡儿坐标系统中被画成一个从原点出发的带有箭头的有向线段。每一个矢量的欧氏范数就是有向线段的长度。

其中,定义范数的矢量空间就是赋范矢量空间。同样,其中定义半范数的矢量空间就是赋半范矢量空间。

矩阵或向量的范数用来度量矩阵或向量在某种意义下的长度。范数有多种方法定义,其定义不同,范数值也就不同。

(1)向量的3种常用范数及其计算函数。在MATLAB中,求向量范数的函数如下。

  • cond(A,1) 计算A的1阶范数下的条件数;
  • cond(A)或cond(A,2) 计算A的2阶范数数下的条件数;
  • cond(A,inf) 计算A的无穷阶范数下的条件数。

(2)矩阵的范数及其计算函数。MATLAB提供了求3种矩阵范数的函数,其函数调用格式与求向量的范数的函数完全相同。

(3)矩阵的条件数。在MATLAB中,计算矩阵A的3种条件数的函数如下。

  • cond(A,1) 计算A的1阶范数下的条件数;
  • cond(A)或cond(A,2) 计算A的2阶范数数下的条件数;
  • cond(A,inf) 计算A的无穷阶范数下的条件数。

7.矩阵的特征值与特征向量

数学上,线性变换的特征向量(本征向量)是一个非退化的向量,其方向在该变换下不变。该向量在此变换下缩放的比例称为其特征值(本征值)。一个变换通常可以由其特征值和特征向量完全描述。特征空间是相同特征值的特征向量的集合。

在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有以下3种。

  • E=eig(A) 求矩阵A的全部特征值,构成向量E。
  • [V,D]=eig(A) 求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。
  • [V,D]=eig(A,'nobalance') 与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特征值和特征向量。

【例2-91】 用求特征值的方法解方程:3x 5 -7x 4 +5x 2 +2x-18=0。

    >> p=[3,-7,0,5,2,-18]
    p =
      Columns 1 through 5
           3             -7              0              5              2
      Column 6
         -18
    >> A=compan(p)     %A的伴随矩阵
    A =
         7/3              0           -5/3           -2/3              6
           1              0              0              0              0
           0              1              0              0              0
           0              0              1              0              0
           0              0              0              1              0
    >> x1=eig(A)              %求A的特征值
    x1 =
        5160/2363
           1        +    1i
           1        -    1i
       -1397/1510   +  670/931i
       -1397/1510   -  670/931i
    >> x2=roots(p)           %直接求多项式p的零点
    x2 =
        5160/2363
           1        +    1i
           1        -    1i
       -1397/1510   +  670/931i
       -1397/1510   -  670/931i

8.矩阵的超越函数

在数学领域中,超越函数与代数函数相反,是指那些不满足任何以多项式方程的函数,即函数不满足以变量自身的多项式为系数的多项式方程。换句话说,超越函数就是“超出”代数函数范围的函数,也就是说,函数不能表示为有限次的加、减、乘、除和开方的运算。

1)矩阵平方根

sqrtm(A)用来计算矩阵A的平方根。

2)矩阵对数

logm(A)计算矩阵A的自然对数,此函数输入参数的条件与输出结果间的关系和函数sqrtm(A)完全相同。

3)矩阵指数

expm(A)、expm1(A)、expm2(A)、expm3(A)的功能都求矩阵指数e^A。


原理介绍:

expm()是按照下面的方式来计算的。

[V,D] = EIG(X)

EXPM(X) = V*diag(exp(diag(D)))/V

V:X的特征向量

D:对应的特征徝


4)普通矩阵函数

funm(A,'fun')用来计算直接作用于矩阵A的由'fun'指定的超越函数值。当fun取sqrt时,funm(A,'sqrt')可以计算矩阵A的平方根,与sqrtm(A)的计算结果相同。

2.3.4 稀疏矩阵及其运算

对于一个n阶矩阵,通常需要n2的存储空间,当n很大时,进行矩阵运算时会占用大量的内存空间和运算时间。在许多实际问题中遇到的大规模矩阵中,通常含有大量0元素,这样的矩阵称为稀疏矩阵。MATLAB支持稀疏矩阵,只存储矩阵的非零元素。由于不存储那些“0”元素,也不对它们进行操作,从而节省内存空间和计算时间,其计算的复杂性和代价仅仅取决于稀疏矩阵的非零元素的个数,这在矩阵的存储空间和计算时间上都有很大的优点。

矩阵的密度定义为矩阵中非零元素的个数除以矩阵中总的元素个数。对于低密度的矩阵,采用稀疏方式存储是一种很好的选择。

1.稀疏矩阵的创建

稀疏矩阵的创建方法如下。

1)将完全存储方式转化为稀疏存储方式

函数A=sparse(S)能将矩阵S转化为稀疏存储方式的矩阵A。当矩阵S是稀疏存储方式时,则函数调用相当于A=S。sparse函数还有其他一些调用格式,如sparse(m,n),生成一个m*n的所有元素都是0的稀疏矩阵。sparse(u,v,S):u,v,S是3个等长的向量。S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标,该函数建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵。此外,还有一些和稀疏矩阵操作有关的函数。full(A):返回和稀疏存储矩阵A对应的完全存储方式矩阵。

2)直接创建稀疏矩阵

    S=sparse(i,j,s,m,n)

其中,i和j分别是矩阵非零元素的行和列指标向量,s是非零元素值向量,m,n分别是矩阵的行数和列数。

3)从文件中创建稀疏矩阵

利用load和spconvert函数可以从包含一系列下标和非零元素的文本文件中输入稀疏矩阵。例如,设文本文件T.txt中有三列内容 ,第一列是一些行下标,第二列是列下标,第三列是非零元素值,则利用T.txt创建稀疏矩阵:

    load T.txt S=spconvert(T)

4)稀疏带状矩阵的创建

    S=spdiags(B,d,m,n)

其中,m和n分别是矩阵的行数和列数;d是长度为p的整数向量,它指定矩阵S的对角线位置;B是全元素矩阵,用来给定S对角线位置上的元素,行数为min(m,n),列数为p。

5)其他稀疏矩阵创建函数

    S=speye(m,n)
    S=speye(size(A))    % 和A拥有同样尺寸的稀疏矩阵
    S=buchy             % 一个内置的稀疏矩阵(邻接矩阵)

2.稀疏矩阵的运算

稀疏存储矩阵只是矩阵的存储方式不同,其运算规则与普通矩阵相同,可以直接参与运算。所以,MATLAB中对满矩阵的运算和函数同样可用在稀疏矩阵中。结果是稀疏矩阵还是满矩阵,取决于运算符或函数。当参与运算的对象不全是稀疏存储矩阵时,所得结果一般是完全存储形式。

3.其他

1)非零元素信息

    nnz(S)      % 返回非零元素的个数
    nonzeros(S) % 返回列向量,包含所有的非零元素
      nzmax(S)  % 返回分配给稀疏矩阵中非零项的总的存储空间

2)查看稀疏矩阵的形状

    spy(S)

3)find函数与稀疏矩阵

    [i,j,s]=find(S)
    [i,j]=find(S)

返回S中所有非零元素的下标和数值,S可以是稀疏矩阵或满矩阵。 p47lThb6KHoBqd6Pf5gRUI8heUNlUp7kX5i80WzDI0dciRsr0FFVuki+cQIMzKcN

点击中间区域
呼出菜单
上一章
目录
下一章
×