【中等】算法nodeJs:矩阵乘法

126 阅读2分钟

描述

对于给定的 x 行 y 列的矩阵:

A=⎣⎢⎢⎢⎡​A1,1​A2,1​⋮Ax,1​​A1,2​A2,2​⋮Ax,2​​⋯⋯⋱⋯​A1,y​A2,y​⋮Ax,y​​⎦⎥⎥⎥⎤​

和 y 行 z 列的矩阵:

B=⎣⎢⎢⎢⎡​B1,1​B2,1​⋮By,1​​B1,2​B2,2​⋮By,2​​⋯⋯⋱⋯​B1,z​B2,z​⋮By,z​​⎦⎥⎥⎥⎤​

计算矩阵 A 和矩阵 B 的乘积 C。

让我们回忆矩阵乘法的计算,对于第 i 行第 j 列的元素 Ci,j​(1≦i≦x; 1≦j≦z),有:

Ci,j​=k=1∑y​(Ai,k​×Bk,j​)

image.png

输入描述:

第一行输入一个整数 x(1≦x≦100) 代表第一个矩阵的行数。
第二行输入一个整数 y(1≦y≦100) 代表第一个矩阵的列数和第二个矩阵的行数。
第三行输入一个整数 z(1≦z≦100) 代表第二个矩阵的列数。
此后 x 行,第 i 行输入 y 个整数 Ai,1​,Ai,2​,…,Ai,y​(0≦Ai,j​≦10) 代表矩阵 A 的第 i 行元素。
此后 y 行,第 i 行输入 z 个整数 Bi,1​,Bi,2​,…,Bi,z​(0≦Bi,j​≦10) 代表矩阵 B 的第 i 行元素。

输出描述:

输出 x 行,第 i 行输出 z 个整数,代表矩阵 C 的第 i 行元素。

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    const input = [];
    while ((line = await readline())) {
        input.push(line);
    }
    let x = parseInt(input[0]); // 矩阵 A 的行数
    let y = parseInt(input[1]); // 矩阵 A 的列数和矩阵 B 的行数
    let z = parseInt(input[2]); // 矩阵 B 的列数

    // 初始化矩阵 A 和 B
    let matrixA = [];
    let matrixB = [];

    // 读取矩阵 A 的数据
    for (let i = 0; i < x; i++) {
        matrixA.push(input[i + 3].split(" ").map(Number));
    }

    // 读取矩阵 B 的数据
    for (let i = 0; i < y; i++) {
        matrixB.push(input[i + 3 + x].split(" ").map(Number));
    }

    // 初始化结果矩阵 C
    let matrixC = Array.from({ length: x }, () => Array(z).fill(0));

    // 矩阵相乘
    for (let i = 0; i < x; i++) {
        for (let j = 0; j < z; j++) {
            for (let k = 0; k < y; k++) {
                matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
            }
        }
    }

    // 输出结果矩阵 C
    for (let i = 0; i < x; i++) {
        console.log(matrixC[i].join(" "));
    }
})();