6.2 矩阵操作

6.2.1 创建矩阵

在前面章节中已经介绍了零矩阵、单位矩阵和全1矩阵等特殊矩阵。除此之外,MATLAB中还有一些命令用于生成特殊矩阵。

表6.1给出了MATLAB用于创建其他特殊矩阵的函数。

表6.1 特殊矩阵创建函数

下面介绍上述特殊矩阵函数中的部分函数。

1.希尔伯特(Hilbert)矩阵函数

希尔伯特(Hilbert)矩阵,也称H阵,其元素为hij=1/(i+j-1)。由于该矩阵是一个条件数差的矩阵,所以常被用作试验矩阵。

关于希尔伯特矩阵的命令函数有:

    H = hilb(n):作用为生成一个n×n的希尔伯特矩阵。
    H = invhilb(n):作用为生成一个n×n的希尔伯特矩阵的逆矩阵整数矩阵。

例6-13,希尔伯特矩阵创建示例。

在命令行窗口输入:

    A=hilb(3)
    B=invhilb(3)

输出结果如下:

    A =  1.0000     0.5000     0.3333
        0.5000     0.3333     0.2500
        0.3333     0.2500     0.2000
    B =   9    -36     30
        -36    192  -180
          30  -180    180

2.托普利兹(Toeplitz)矩阵函数

创建托普利兹矩阵的函数调用格式如下:

    T = toeplitz(c, r)
    T= toeplitz(r)

该函数产生的托普利兹矩阵,第1列为c向量,第1行为r向量,其余元素等于其左上角元素,如自定义了r则产生对称托普利兹矩阵。

toeplitz(c):作用为用向量c生成一个对称的托普利兹矩阵。

例6-14,托普利兹矩阵创建示例。

在命令行窗口输入:

    c = [1  2  3  4  5];
    r = [6  7  8  9  0];
    symT=toeplitz(c, r)        %非对称的托普利兹矩阵
    asymT=toeplitz(r)          %对称的托普利兹矩阵

输出结果如下:

    symT =  1      7      8      9      0
            2      1      7      8      9
            3      2      1      7      8
            4      3      2      1      7
            5      4      3      2      1
    asymT = 6      7      8      9      0
            7      6      7      8      9
            8      7      6      7      8
            9      8      7      6      7
            0      9      8      7      6

3.魔方矩阵函数

魔方矩阵中每行、列和两条对角线上的元素和相等。使用magic函数产生魔方矩阵的调用形式如下:

    M= magic(n)

例6-15,创建魔方矩阵示例。

在命令行窗口输入:

    A=magic(3)
    B=magic(4)
    C=sum(B)           %计算每行的和
    D=sum(B')          %计算每列的和

输出结果如下:

    A =  8      1      6
        3      5      7
        4      9      2
    B =  16     2      3     13
        5     11     10      8
        9      7      6     12
        4     14     15      1
    C =  34    34     34     34
    D =  34    34     34     34

提示

魔方矩阵中每行、列和两条对角线上的元素和相等。

4.帕斯卡矩阵函数

通过pascal函数产生帕斯卡矩阵,调用形式如下:

    A = pascal(n)
    A = pascal(n,1)
    A = pascal(n,2)

该函数第一种形式返回n阶的对称正定pascal矩阵,其中的元素取自pascal三角矩阵,其逆矩阵的元素都是整数。第二种形式返回由下三角的Cholesky因子组成的Pascal矩阵,它是对和的,所以它是它自己的逆。第三种形式返回pascal(n,1)的转置和交换的形式。A是单位矩阵的立方根。

例6-16,创建帕斯卡矩阵示例。

在命令行窗口输入:

    A=pascal(4)       %创建4阶帕斯卡矩阵
    B= pascal(3,2)

输出结果如下:

    A = 1      1      1      1
        1      2      3      4
        1      3      6     10
        1      4     10     20
    B = 1      1      1
        -2     -1      0
        1      0      0

5.范德蒙矩阵函数

通过vander函数产生范德蒙矩阵的调用形式如下:

    A = vander(v)

其中,v为输入向量。

例6-17,生成范德蒙矩阵示例。

在命令行窗口输入:

    A=vander([1 2 3 4])
    B=vander([1;2;3;4])

输出结果如下:

    A =  1      1      1      1
         8      4      2      1
         27      9      3      1
         64     16      4      1
    B =  1      1      1      1
         8      4      2      1
         27      9      3      1
         64     16      4      1

除前面介绍的这几种特殊矩阵的产生方式以外,还有必要介绍随机矩阵的产生函数。

6.0~1间均匀分布的随机矩阵函数

通过rand函数可以产生0~1间均匀分布的随机矩阵,其调用形式如下:

    r = rand(n)
    r=rand(m, n)或r=rand([m, n])
    r = rand(m, n, p, ...) 或r = rand([m, n, p, ...])
    r = rand(size(A))

其中,m、n、p均为产生矩阵的维度信息;如果仅设置n,则产生方阵。

例6-18,创建0~1间均匀分布的随机矩阵示例。

在命令行窗口输入:

    A=rand(3)
    B=rand([3,4])
    C=rand(size(B))
    E=rand(1,10000); hist(E) %绘制统计直方图

输出结果如下:

    A = 0.2638     0.8693     0.1450
        0.1455     0.5797     0.8530
        0.1361     0.5499     0.6221
    B = 0.3510     0.0760     0.1839     0.0497
        0.5132     0.2399     0.2400     0.9027
        0.4018     0.1233     0.4173     0.9448
    C = 0.4909     0.9001     0.7803     0.4039
        0.4893     0.3692     0.3897     0.0965
        0.3377     0.1112     0.2417     0.1320

输出图形如图6.1所示。图中的分布表明rand函数较好地实现了0~1间均匀分布。

图6.1 0~1间均匀分布随机矩阵的元素区间分布

7.标准正态分布随机矩阵函数

通过randn函数可以产生均值为0方差为1的随机矩阵,该函数的调用形式如下:

    r = randn(n)
    r = randn(m, n) 或r = randn([m, n])
    r = randn(m, n, p, ...) 或r = randn([m, n, p, ...])
    r = randn(size(A))

其中,m, n, p均为产生矩阵的维度信息;如果仅设置n,则产生方阵。

例6-19,创建标准正态分布随机矩阵示例。

在命令行窗口输入:

    A=randn(3)
    B=randn([3,4])
    C=randn(size(B))
    E=randn(1,100000); hist(E,100)         %绘制统计直方图

输出结果如下:

    A =   0.7108    -2.0261     1.0355
          0.6273    -0.0866    -1.4918
        -0.2707    -1.3402     1.6111
    B =       0.3747     0.1935    -1.0232     0.0654
          1.9785     1.2214    -0.5710     2.2070
          0.4781    -1.6699    -1.2905     0.1534
    C =       0.4490    -0.7843     0.6211    -1.3606
          0.2937     0.8000     1.0072     0.7293
          2.2606    -1.5962    -0.5162     0.2751

输出图形如图6.2所示。图中的分布表明randn函数较好地实现了标准正态分布。

图6.2 标准正态分布随机矩阵的元素区间分布

6.2.2 改变矩阵结构

在实际应用中,很多场合需要改变矩阵结构,包括合并矩阵、删除行列以及矩阵转置等。

1.合并矩阵

合并矩阵就是把两个或者两个以上的矩阵数据连接起来得到一个新的矩阵。在MATLAB中合并矩阵的方法很简单,可采用:

● 表达式C=[A B]:在水平方向合并矩阵A和B;

● 表达式C=[A; B]:在竖直方向合并矩阵A和B。

提示

矩阵构造符[]不仅可用于构造矩阵,还可以合并矩阵。

例6-20,合并矩阵示例。

在命令行窗口输入:

    A=magic(3)
    B=[A A A]               %横向合并
    C=[A; A]            %竖向合并
    whos

输出结果如下:

    A =  8      1      6
        3      5      7
        4      9      2
    B =  8      1      6      8      1      6      8      1      6
        3      5      7      3      5      7      3      5      7
        4      9      2      4      9      2      4      9      2
    C =  8      1      6
        3      5      7
        4      9      2
        8      1      6
        3      5      7
        4      9      2
      Name       Size               Bytes  Class      Attributes
      A           3x3                   72  double
      B           3x9                  216  double
      C           6x3                  144  double

可以用矩阵合并操作来构造任意大小的矩阵。但是,需要注意的是在矩阵合并的过程中一定要保持矩阵的形状是矩形,否则矩阵合并将无法进行。例如:

    A=magic(3)
    B= magic(4)
    C=[A; B]  %竖向合并

这段程序将导致运行时出现如下错误提示信息:

    Error using vertcat
    Dimensions of matrices being concatenated are not consistent.

2.删除矩阵行列

如果需要删除矩阵的某一行或者是某一列,只要把该行或者该列赋予一个空矩阵[]即可。

例6-21,删除矩阵行列示例。

在命令行窗口输入:

    A=magic(3)
    B=A ; B(1, :)=[]           %删除第一行
    C=A ; C(:,1)=[]            %删除第一列
    whos

输出结果如下:

    A =  8      1      6
        3      5      7
        4      9      2
    B =  3      5      7
        4      9      2
    C =  1      6
        5      7
        9      2
    Name       Size               Bytes  Class      Attributes
    A           3x3                   72  double
    B           2x3                   48  double
    C           3x2                   48  double

3.矩阵转置

矩阵转置操作包括转置和共轭转置两类。转置可通过“.'”符号或transpose函数实现;共轭转置可通过“'”符号或ctranspose函数实现。

例6-22,矩阵转置示例。

在命令行窗口输入:

    A=magic(3)
    B=A+A*i
    C1= A.'
    C2= A'
    D1= B.'
    D2= B'

输出结果如下:

    A =  8      1      6
        3      5      7
        4      9      2
    B =8.0000 + 8.0000i    1.0000 + 1.0000i    6.0000 + 6.0000i
      3.0000 + 3.0000i    5.0000 + 5.0000i    7.0000 + 7.0000i
      4.0000 + 4.0000i    9.0000 + 9.0000i    2.0000 + 2.0000i
    C1 = 8      3      4
        1      5      9
        6      7      2
    C2 =8      3      4
        1      5      9
        6      7      2
    D1 =8.0000 + 8.0000i    3.0000 + 3.0000i    4.0000 + 4.0000i
        1.0000 + 1.0000i    5.0000 + 5.0000i    9.0000 + 9.0000i
        6.0000 + 6.0000i    7.0000 + 7.0000i    2.0000 + 2.0000i
    D2 =8.0000-8.0000i    3.0000-3.0000i    4.0000-4.0000i
        1.0000-1.0000i    5.0000-5.0000i    9.0000-9.0000i
        6.0000-6.0000i    7.0000-7.0000i    2.0000-2.0000i