文章目录[隐藏]

  • 矩阵的加减法
  • 矩阵的标量乘法
  • 矩阵乘法
  • 转置

在本文中,我们将介绍矩阵的大部分基本运算,依次是矩阵的加减法、矩阵的标量乘法、矩阵与矩阵的乘法、求转置矩阵,以及深入了解矩阵的行列式运算。本文将不会涉及逆矩阵、矩阵的秩等概念,将来再探讨它们。

矩阵的加减法

矩阵的 加法 与 减法 运算将接收两个矩阵作为输入,并输出一个新的矩阵。矩阵的加法和减法都是在分量级别上进行的,因此要进行加减的矩阵必须有着相同的维数。

为了避免重复编写加减法的代码,我们先创建一个可以接收运算函数的方法,这个方法将对两个矩阵的分量分别执行传入的某种运算。然后在加法、减法或者其它运算中直接调用它就行了:

class Matrix {  // ...
  componentWiseOperation(func, { rows }) {    const newRows = rows.map((row, i) =>
      row.map((element, j) => func(this.rows[i][j], element))
    )    return new Matrix(...newRows)
  }
  add(other) {    return this.componentWiseOperation((a, b) => a + b, other)
  }
  subtract(other) {    return this.componentWiseOperation((a, b) => a - b, other)
  }
}const one = new Matrix(
  [1, 2],
  [3, 4]
)const other = new Matrix(
  [5, 6],
  [7, 8]
)console.log(one.add(other))// Matrix { rows: [ [ 6, 8 ], [ 10, 12 ] ] }console.log(other.subtract(one))// Matrix { rows: [ [ 4, 4 ], [ 4, 4 ] ] }复制代码

矩阵的标量乘法

矩阵的标量乘法与向量的缩放类似,就是将矩阵中的每个元素都乘上标量:

class Matrix {  // ...
  scaleBy(number) {    const newRows = this.rows.map(row =>
      row.map(element => element * number)
    )    return new Matrix(...newRows)
  }
}const matrix = new Matrix(
  [2, 3],
  [4, 5]
)console.log(matrix.scaleBy(2))// Matrix { rows: [ [ 4, 6 ], [ 8, 10 ] ] }复制代码

矩阵乘法

当 A 、 B 两个矩阵的维数是 兼容 的时候,就能对这两个矩阵进行矩阵乘法。所谓维数兼容,指的是 A 的列数与 B 的行数相同。矩阵的乘积 AB 是通过对 A 的每一行与矩阵 B 的每一列计算点积得到:

class Matrix {  // ...
  multiply(other) {    if (this.rows[0].length !== other.rows.length) {      throw new Error('The number of columns of this matrix is not equal to the number of rows of the given matrix.')
    }    const columns = other.columns()    const newRows = this.rows.map(row => 
      columns.map(column => sum(row.map((element, i) => element * column[i])))
    )    return new Matrix(...newRows)
  }
}const one = new Matrix(
  [3, -4],
  [0, -3],
  [6, -2],
  [-1, 1]
)const other = new Matrix(
  [3,  2, -4],
  [4, -3,  5]
)console.log(one.multiply(other))// Matrix {//   rows://    [ [ -7, 18, -32 ],//      [ -12, 9, -15 ],//      [ 10, 18, -34 ],//      [ 1, -5, 9 ] ]}复制代码

我们可以把矩阵乘法 AB 视为先后应用 A 和 B 两个线性变换矩阵。为了更好地理解这种概念,可以看一看我们的linear-algebra-demo。

下图中黄色的部分就是对红色方块应用线性变换 C 的结果。而线性变换 C 就是矩阵乘法 AB 的结果,其中 A 是做相对于 y 轴进行反射的变换矩阵, B 是做剪切变换的矩阵。

如果在矩阵乘法中调换 A 和 B 的顺序,我们会得到一个不同的结果,因为相当于先应用了 B 的剪切变换,再应用 A 的反射变换:

转置

转置矩阵 由公式 定义。换句话说,我们通过关于矩阵的对角线对其进行翻转来得到转置矩阵。需要注意的是,矩阵对角线上的元素不受转置运算影响。