矩阵乘法

GitHub跳转原题关系图返回列表

按矩阵乘法定义累加 A 的行和 B 的列的对应乘积,输出结果矩阵。

OJ: noi_openjudge

题目 ID: ch0108-09

难度:普及-

标签:矩阵模拟python

日期: 2026-07-30 23:01

题意

计算 n×mn\times m 矩阵 AAm×km\times k 矩阵 BB 的乘积。

思路

结果的第 i,ji,j 项是 A[i]BB 的第 jj 列对应元素乘积之和。外层枚举 AA 的行和结果列,内层枚举公共维度。

代码

cpp
#include <cstdio>

int n,m,k;
int a[200][200];
int b[200][200];
int c[200][200];
int main(){
    int i,j;
    scanf("%d%d%d",&n,&m,&k);
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for (i=1;i<=m;i++){
        for (j=1;j<=k;j++){
            scanf("%d",&b[i][j]);
        }
    }
    int x,y;
    for (i=1;i<=n;i++){
        for (j=1;j<=k;j++){
            for(x=1;x<=m;x++){
                c[i][j] += a[i][x]*b[x][j];
            }
            printf("%d ",c[i][j]);
        }
        printf("\n");
    }
    return 0;
}

复杂度

总结

Python代码

python
row_count, shared_count, column_count = map(int, input().split())
first = [list(map(int, input().split())) for _ in range(row_count)]
second = [list(map(int, input().split())) for _ in range(shared_count)]

for row in first:
    print(*(sum(row[index] * second[index][column] for index in range(shared_count)) for column in range(column_count)))

C++代码

cpp
#include <cstdio>

int n,m,k;
int a[200][200];
int b[200][200];
int c[200][200];
int main(){
    int i,j;
    scanf("%d%d%d",&n,&m,&k);
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for (i=1;i<=m;i++){
        for (j=1;j<=k;j++){
            scanf("%d",&b[i][j]);
        }
    }
    int x,y;
    for (i=1;i<=n;i++){
        for (j=1;j<=k;j++){
            for(x=1;x<=m;x++){
                c[i][j] += a[i][x]*b[x][j];
            }
            printf("%d ",c[i][j]);
        }
        printf("\n");
    }
    return 0;
}

复杂度

时间复杂度为 O(nmk)O(nmk),输入矩阵空间为 O(nm+mk)O(nm+mk)

总结

矩阵乘法不是对应相乘,而是“一行乘一列”的内积。