矩阵的乘法

矩阵在编程中可以用数组来表示,矩阵里的每个元素都可以产生关系,甚至可以说它们都有方向和距离。

现实运用中,矩阵可以用来解决概率、寻址,逻辑关系等问题,这些问题通常会出现于我们的现实生活当中。

矩阵乘法是线性代数的基础工具,不仅在数学中有大量应用,在应用数学、物理学、工程学等领域也有广泛使用。矩阵乘法是一种根据两个矩阵得到第三个矩阵的二元运算,第三个矩阵即前两者的乘积,称为矩阵积。


📐 数学公式

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矩阵,那么AB的积是由所定义的一个 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]
]
*/