JS实现矩阵相乘、行列式、逆矩阵

编程入门 行业动态 更新时间:2024-10-26 13:25:32

JS实现<a href=https://www.elefans.com/category/jswz/34/1769510.html style=矩阵相乘、行列式、逆矩阵"/>

JS实现矩阵相乘、行列式、逆矩阵

一、矩阵运算

1.1 矩阵相乘

  • A m × p {\rm A_{m \times p}} Am×p​、 B p × n {\rm B_{p \times n}} Bp×n​
  • C m × n = A m × p × B p × n {\rm C_{m \times n}} = {\rm A_{m \times p}} \times {\rm B_{p \times n}} Cm×n​=Am×p​×Bp×n​
  • C i j = ∑ k = 1 p a i k ⋅ b k j {\rm C_{ij}} = \sum_{ \rm k=1}^{\rm p} a_{\rm ik} \cdot b_{\rm kj} Cij​=∑k=1p​aik​⋅bkj​
function multiply(a, b) {// 相乘约束if (a[0].length !== b.length) {throw new Error();}let m = a.length;let p = a[0].length;let n = b[0].length;// 初始化 m*n 全 0 二维数组let c = new Array(m).fill(0).map(arr => new Array(n).fill(0));for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {for (let k = 0; k < p; k++) {c[i][j] += a[i][k] * b[k][j];}}}return c;
}

1.2 行列式

  • 1 阶: ∣ a 11 ∣ = a 11 \begin{vmatrix} a_{11} \end{vmatrix} = a_{11} ∣∣​a11​​∣∣​=a11​

  • 2 阶: ∣ a 11 a 12 a 21 a 22 ∣ = a 11 ⋅ a 22 − a 12 ⋅ a 21 \begin{vmatrix}a_{11} & a_{12} \\a_{21} & a_{22}\end{vmatrix} = a_{11} \cdot a_{22} - a_{12} \cdot a_{21} ∣∣∣∣​a11​a21​​a12​a22​​∣∣∣∣​=a11​⋅a22​−a12​⋅a21​

  • 3 阶: ∣ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ∣ = a 11 a 22 a 33 + a 12 a 23 a 31 + a 13 a 21 a 32 − a 13 a 22 a 31 − a 12 a 21 a 33 − a 11 a 23 a 32 \begin{vmatrix}a_{11} & a_{12} & a_{13} \\a_{21} & a_{22} & a_{23} \\a_{31} & a_{32} & a_{33}\end{vmatrix} = a_{11} a_{22} a_{33} +a_{12} a_{23} a_{31} +a_{13} a_{21} a_{32} -a_{13} a_{22} a_{31} -a_{12} a_{21} a_{33} - a_{11} a_{23} a_{32} ∣∣∣∣∣∣​a11​a21​a31​​a12​a22​a32​​a13​a23​a33​​∣∣∣∣∣∣​=a11​a22​a33​+a12​a23​a31​+a13​a21​a32​−a13​a22​a31​−a12​a21​a33​−a11​a23​a32​

  • n 阶:任意某行(或某列)的各元素与其对应的代数余子式乘积之和

  • 3 阶行列式:对应行平移后公式也可认为『主对角线元素积与副对角线元素积之差

  • 代数余子式:『 ( − 1 ) i + j (-1)^{\rm i+j} (−1)i+j 』乘以『去掉方阵第 i 行第 j 列的元素后构成的方阵的行列式』的值

n 阶行列式可取第 1 行的各元素与其对应的代数余子式乘积之和,如:
∣ a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ∣ = a 11 ⋅ ( − 1 ) 1 + 1 ⋅ ∣ a 22 a 23 a 24 a 32 a 33 a 34 a 42 a 43 a 44 ∣ + a 12 ⋅ ( − 1 ) 1 + 2 ⋅ ∣ a 21 a 23 a 24 a 31 a 33 a 34 a 41 a 43 a 44 ∣ + a 13 ⋅ ( − 1 ) 1 + 3 ⋅ ∣ a 21 a 22 a 24 a 31 a 32 a 34 a 41 a 42 a 44 ∣ + a 14 ⋅ ( − 1 ) 1 + 4 ⋅ ∣ a 21 a 22 a 23 a 31 a 32 a 33 a 41 a 42 a 43 ∣ \begin{vmatrix}a_{11} & a_{12} & a_{13} & a_{14} \\a_{21} & a_{22} & a_{23} & a_{24} \\a_{31} & a_{32} & a_{33} & a_{34} \\a_{41} & a_{42} & a_{43} & a_{44}\end{vmatrix}= a_{11} \cdot (-1)^{1+1} \cdot \begin{vmatrix}a_{22} & a_{23} & a_{24}\\ a_{32} &a_{33}& a_{34} \\a_{42} & a_{43} & a_{44} \end{vmatrix} + a_{12} \cdot (-1)^{1+2} \cdot \begin{vmatrix}a_{21} & a_{23} & a_{24}\\ a_{31} & a_{33}& a_{34} \\a_{41} & a_{43} & a_{44} \end{vmatrix} +a_{13} \cdot (-1)^{1+3} \cdot \begin{vmatrix}a_{21} & a_{22} & a_{24}\\ a_{31} & a_{32}& a_{34} \\a_{41} & a_{42} & a_{44}\end{vmatrix} +a_{14} \cdot (-1)^{1+4} \cdot \begin{vmatrix}a_{21} & a_{22} & a_{23}\\ a_{31} & a_{32}& a_{33} \\a_{41} & a_{42} & a_{43} \end{vmatrix} \\ ∣∣∣∣∣∣∣∣​a11​a21​a31​a41​​a12​a22​a32​a42​​a13​a23​a33​a43​​a14​a24​a34​a44​​∣∣∣∣∣∣∣∣​=a11​⋅(−1)1+1⋅∣∣∣∣∣∣​a22​a32​a42​​a23​a33​a43​​a24​a34​a44​​∣∣∣∣∣∣​+a12​⋅(−1)1+2⋅∣∣∣∣∣∣​a21​a31​a41​​a23​a33​a43​​a24​a34​a44​​∣∣∣∣∣∣​+a13​⋅(−1)1+3⋅∣∣∣∣∣∣​a21​a31​a41​​a22​a32​a42​​a24​a34​a44​​∣∣∣∣∣∣​+a14​⋅(−1)1+4⋅∣∣∣∣∣∣​a21​a31​a41​​a22​a32​a42​​a23​a33​a43​​∣∣∣∣∣∣​

function det(square) {// 方阵约束if (square.length !== square[0].length) {throw new Error();}// 方阵阶数let n = square.length;let result = 0;if (n > 3) {// n 阶for (let column = 0; column < n; column++) {// 去掉第 0 行第 column 列的矩阵let matrix = new Array(n - 1).fill(0).map(arr => new Array(n - 1).fill(0));for (let i = 0; i < n - 1; i++) {for (let j = 0; j < n - 1; j++) {if (j < column) {matrix[i][j] = square[i + 1][j];} else {matrix[i][j] = square[i + 1][j + 1];}}}result += square[0][column] * Math.pow(-1, 0 + column) * det(matrix);}} else if (n === 3) {// 3 阶result = square[0][0] * square[1][1] * square[2][2] +square[0][1] * square[1][2] * square[2][0] +square[0][2] * square[1][0] * square[2][1] -square[0][2] * square[1][1] * square[2][0] -square[0][1] * square[1][0] * square[2][2] -square[0][0] * square[1][2] * square[2][1];} else if (n === 2) {// 2 阶result = square[0][0] * square[1][1] - square[0][1] * square[1][0];} else if (n === 1) {// 1 阶result = square[0][0];}return result;
}

1.2 转置矩阵

function transpose(matrix) {let result = new Array(matrix.length).fill(0).map(arr => new Array(matrix[0].length).fill(0));for (let i = 0; i < result.length; i++) {for (let j = 0; j < result[0].length; j++) {result[i][j] = matrix[j][i];}}return result;
}

1.3 伴随矩阵

  • 伴随矩阵:矩阵中每个元素对应的代数余子式所构成矩阵的转置矩阵
function adjoint(square) {// 方阵约束if (square[0].length !== square.length) {throw new Error();}let n = square.length;let result = new Array(n).fill(0).map(arr => new Array(n).fill(0));for (let row = 0; row < n; row++) {for (let column = 0; column < n; column++) {// 去掉第 row 行第 column 列的矩阵let matrix = [];for (let i = 0; i < square.length; i++) {if (i !== row) {let arr = [];for (let j = 0; j < square.length; j++) {if (j !== column) {arr.push(square[i][j]);}}matrix.push(arr);}}result[row][column] = Math.pow(-1, row + column) * det(matrix);}}return transpose(result);
}

PS

det()函数里求『去掉第 0 行第 column 列矩阵』的复制方法相比较,求『去掉第 row 行第 column 列矩阵』里采用尾插法相对更加简洁可读一些。不过还是太 low …


1.4 逆矩阵

  • [ A E ] ⟶ 初 等 变 换 [ E A − 1 ] \rm [A \quad E] \stackrel{初等变换}{\longrightarrow} [E \quad A^{-1}] [AE]⟶初等变换​[EA−1]

  • A − 1 = 1 ∣ A ∣ ⋅ A ∗ A^{-1} = \frac{1}{|\rm A|} \cdot \rm A^{*} A−1=∣A∣1​⋅A∗

function inv(square) {if (square[0].length !== square.length) {throw new Error();}let detValue = det(square);let result = adjoint(square);for (let i = 0; i < result.length; i++) {for (let j = 0; j < result.length; j++) {result[i][j] /= detValue;}}return result;
}

1.5 秩

// TODO

更多推荐

JS实现矩阵相乘、行列式、逆矩阵

本文发布于:2024-03-04 20:58:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1710399.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:矩阵   行列式   JS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!