矩阵的乘法
矩阵在编程中可以用数组来表示,矩阵里的每个元素都可以产生关系,甚至可以说它们都有方向和距离。
现实运用中,矩阵可以用来解决概率、寻址,逻辑关系等问题,这些问题通常会出现于我们的现实生活当中。
矩阵乘法是线性代数的基础工具,不仅在数学中有大量应用,在应用数学、物理学、工程学等领域也有广泛使用。矩阵乘法是一种根据两个矩阵得到第三个矩阵的二元运算,第三个矩阵即前两者的乘积,称为矩阵积。
📐 数学公式
n 行 m 列矩阵A和 m 行 p 列 矩阵B相乘,结果是 n 行 p 列的矩阵C。 例如A*B*C乘法,乘法满足结合律,所以 ▶ A*(B*C) = (A*B)*C ▶ ((AB)C)D = ((A(BC))D) = (AB)(CD) = A((BC)D) = A(B(CD)) ---------------------------------------- 矩阵的乘法的定义【i和j为下标, 中括号[]内的小写字母和数字也为下标】: - 若A=[a[ij]]是某个 m*p矩阵,B=[b[ij]]树某个 p*n矩阵,那么A和B的积是由所定义的一个 m*n 矩阵 C=[c[ij]], 记作AB。 - AB=(a[i1], a[i2], ..., a[ip]) * (b[1j], b[2j], ..., b[pj]) = a[i1]b[1j] + a[i2]b[2j] + ... + a[ip]b[pj] - 相乘后的结果是 c[ij] - 多个矩阵连续相乘构成"矩阵链"。 例如: 设 A = [ [2 3 -4] [1 2 3] ] B = [ [3 1] [-2 2] [5 -3] ] 那么 AB = [ [(2)(3) + (3)(-2) + (-4)(5) (2)(1) + (3)(2) + (-4)(-3)] [(1)(3) + (2)(-2) + (3)(5) (1)(1) + (2)(2) + (3)(-3)] ] = [ [-20 20] [14 -4] ] 其中: A[11]=2, B[11]=3 => 2*3 A[12]=3, B[21]=-2 => 3*(-2) A[13]=-4, B[31]=5 => (-4)*5 由此看出 A[ab]A[bc]矩阵相乘的最小乘法次数为: a*b*c
📌 JavaScript
参考代码:index.js
/* * 创建一个矩阵 * * @param {Number} rows - 行数 * @param {Number} columns - 列数 * @returns {Array} 返回一个新数组 */ export function createMatrix(rows, columns) { return Array(rows).fill(0).map(x => Array(columns).fill(0)); } /* * * @param {*} m1 - 矩阵1(数组表示) * @param {*} m2 - 矩阵2(数组表示) * @returns {Array} 返回一个新数组 */ export function multiplyMatrices(m1, m2) { const result = []; for (let i = 0; i < m1.length; i++) { result[i] = []; for (let j = 0; j < m2[0].length; j++) { let sum = 0; for (let k = 0; k < m1[0].length; k++) { sum += m1[i][k] * m2[k][j]; } result[i][j] = sum; } } return result; }
测试:test.js
import { createMatrix, multiplyMatrices } from './index'; /* 使用 0 填充一个 3行2列 的辅助矩阵 */ /* ---------------------------- */ console.log( createMatrix(3,2) ); /* 结果为: [ [0, 0] [0, 0] [0, 0] ] */ /* 遍历矩阵 */ /* ---------------------------- */ const matrix = [ [11, 12], [21, 22], [31, 32] ]; for (const [i, row] of matrix.entries()) { for (const [j, element] of row.entries()) { console.log(`matrix[${i}][${j}]`, element); } } /* 传统写法: for (let i = 0; i < 3; i++) { for (let j = 0; j < 2; j++) { console.log(`matrix[${i}][${j}]`, matrix[i][j]); } } */ /* 输出: matrix[0][0] 11 matrix[0][1] 12 matrix[1][0] 21 matrix[1][1] 22 matrix[2][0] 31 matrix[2][1] 32 */ /* 求矩阵的乘积 */ /* ---------------------------- */ const matrix1 = [ [11, 12], [21, 22] ]; const matrix2 = [ [1, 2], [3, 4] ]; console.log(multiplyMatrices(matrix1, matrix2)); /* 输出: [ [47, 70] [87, 130] ] */