Skip to content

一个 n×m 的矩阵对应到 C++ 中可以看作一个 nm 列的二维数组。

矩阵运算

矩阵加法和减法

矩阵的加法和减法就是把两个矩阵对应位置的元素相加或相减。举例来说:

A=[1234]B=[5678]

则有:

A+B=[681012]AB=[4444]

矩阵乘法

矩阵乘法稍微复杂一些。设 Anp 列的矩阵,Bpm 列的矩阵,则 AB 是一个 nm 列的矩阵,且满足:

(AB)i,j=k=1pAi,kBk,j

也就是说,参与矩阵乘法运算的第一个矩阵的列数必须等于第二个矩阵的行数,而结果矩阵的行数和列数分别等于第一个矩阵的行数和第二个矩阵的列数,结果矩阵的第 (i,j) 个元素等于第一个矩阵的第 i 行与第二个矩阵的第 j 列的元素的乘积之和。举例来说:

A=[123456]B=[78910]

则有:

AB=[2528576489100]

矩阵乘法的过程可以用 C++ 代码表示:

c
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        C[i][j] = 0;
        for (int k = 0; k < p; k++) {
            C[i][j] += A[i][k] * B[k][j];
        }
    }
}

矩阵乘法的性质:

  1. 结合律:(AB)C=A(BC)
  2. 分配律:A(B+C)=AB+AC

注意:矩阵乘法不满足交换律,即 AB 不一定等于 BA

矩阵乘法与递推

考虑特殊的矩阵乘法形式:

A1×n 矩阵,Bn×n 矩阵,则 C=AB 也是一个 1×n 矩阵,而 AC 都可以看作一个一位数组,按照矩阵乘法的定义可知,经过一次与 B 的矩阵乘法,A 数组中的第 k 个元素会以 Bk,j 为系数累加到 C 数组的第 j 个元素上。等价于在一个向量的 k,j 两个状态之间发生了递推。

举例来说,我们都知道斐波那契数列中 Fn=Fn1+Fn2(n2),且 F0=0,F1=1。那么,我们可以用矩阵乘法来表示斐波那契数列:

[FnFn1]=[1110][Fn1Fn2]

一般来说,如果一类问题可以使用矩阵乘法进行优化,那么它应该具有以下特点:

  1. 可以抽象出一个长度为 n 的一维向量,该向量在每个时间单位发生一次变化。
  2. 变化的形式是一个线性递推。
  3. 递推式在每个时间可能作用于不同的数据上,但本身保持不变。
  4. 向量变化时间很长,但向量长度不大。