首页 > 试题广场 >

矩阵乘法

[编程题]矩阵乘法
  • 热度指数:87041 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的 xy 列的矩阵:
A = \begin{bmatrix} A_{1,1} & A_{1,2} & \cdots & A_{1,y} \\ A_{2,1} & A_{2,2} & \cdots & A_{2,y} \\ \vdots & \vdots & \ddots & \vdots \\ A_{x,1} & A_{x,2} & \cdots & A_{x,y} \end{bmatrix}
\hspace{15pt}yz 列的矩阵:
B = \begin{bmatrix} B_{1,1} & B_{1,2} & \cdots & B_{1,z} \\ B_{2,1} & B_{2,2} & \cdots & B_{2,z} \\ \vdots & \vdots & \ddots & \vdots \\ B_{y,1} & B_{y,2} & \cdots & B_{y,z} \end{bmatrix}
\hspace{15pt}计算矩阵 A 和矩阵 B 的乘积 C

\hspace{15pt}让我们回忆矩阵乘法的计算,对于第 i 行第 j 列的元素 C_{i,j} \left(1 \leqq i \leqq x;\ 1 \leqq j \leqq z\right),有:
C_{i,j} = \sum\limits_{k=1}^{y} \left(A_{i,k} \times B_{k,j}\right)

输入描述:
\hspace{15pt}第一行输入一个整数 x \left(1 \leqq x \leqq 100\right) 代表第一个矩阵的行数。
\hspace{15pt}第二行输入一个整数 y \left(1 \leqq y \leqq 100\right) 代表第一个矩阵的列数和第二个矩阵的行数。
\hspace{15pt}第三行输入一个整数 z \left(1 \leqq z \leqq 100\right) 代表第二个矩阵的列数。
\hspace{15pt}此后 x 行,第 i 行输入 y 个整数 A_{i,1}, A_{i,2}, \dots, A_{i,y} \left(0 \leqq A_{i,j} \leqq 10\right) 代表矩阵 A 的第 i 行元素。
\hspace{15pt}此后 y 行,第 i 行输入 z 个整数 B_{i,1}, B_{i,2}, \dots, B_{i,z} \left(0 \leqq B_{i,j} \leqq 10\right) 代表矩阵 B 的第 i 行元素。


输出描述:
\hspace{15pt}输出 x 行,第 i 行输出 z 个整数,代表矩阵 C 的第 i 行元素。
示例1

输入

2
3
2
1 2 3
3 2 1
1 2
2 1
3 3

输出

14 13
10 11

说明

\hspace{15pt}在这个样例中,\begin{array}{ll}<br />C & = \begin{bmatrix} A_{1,1}B_{1,1} + A_{1,2}B_{2,1} + A_{1,3}B_{3,1} & A_{1,1}B_{1,2} + A_{1,2}B_{2,2} + A_{1,3}B_{3,2} \\ A_{2,1}B_{1,1} + A_{2,2}B_{2,1} + A_{2,3}B_{3,1} & A_{2,1}B_{1,2} + A_{2,2}B_{2,2} + A_{2,3}B_{3,2}\end{bmatrix} \\ <br />& = \begin{bmatrix} 1 \times 1 + 2 \times 2 + 3 \times 3 & 1 \times 2 + 2 \times 1 + 3 \times 3 \\ 3 \times 1 + 2 \times 2 + 1 \times 3 & 3 \times 2 + 2 \times 1 + 1 \times 3\end{bmatrix} \\<br />& = \begin{bmatrix} 1 + 4 + 9 & 2 + 2 + 9 \\ 3 + 4 + 1 & 6 + 2 + 3\end{bmatrix} \\<br />& = \begin{bmatrix} 14 & 13 \\ 10 & 11\end{bmatrix} \end{array}
示例2

输入

16
8
7
17 19 16 19 14 1 14 9 
7 2 7 9 16 14 16 12 
13 3 3 17 5 9 8 16 
1 14 16 10 13 13 14 1 
13 13 15 4 7 2 6 16 
16 15 5 5 15 13 1 11 
11 5 0 16 14 7 7 15 
0 16 4 7 16 6 0 15 
2 14 11 2 17 17 5 12 
8 13 11 10 1 17 10 8 
15 16 17 15 7 8 13 14 
5 19 11 3 11 14 5 4 
9 16 13 11 15 18 0 3 
15 3 19 9 5 14 12 3 
9 8 7 11 18 19 14 18 
12 19 9 1 0 18 17 10 
5 18 16 19 6 12 5 
1 17 1 5 9 16 3 
14 16 4 0 19 3 6 
11 9 15 18 11 17 13 
5 5 19 3 16 1 12 
12 13 19 1 10 5 18 
19 18 6 18 19 12 3 
15 11 6 5 10 17 19 

输出

1020 1490 1063 1100 1376 1219 884
966 1035 1015 715 1112 772 920
822 948 888 816 831 920 863
855 1099 828 578 1160 717 724
745 1076 644 595 930 838 688
635 1051 970 600 880 811 846
748 879 952 772 864 872 878
526 722 645 335 763 688 748
764 996 868 362 1026 681 897
836 1125 785 637 940 849 775
1082 1476 996 968 1301 1183 953
609 987 717 401 894 657 662
700 1083 1022 527 1016 746 875
909 1162 905 722 1055 708 720
1126 1296 1240 824 1304 1031 1196
905 1342 766 715 1028 956 749
方法就是根据矩阵乘法的规则来编写,这里的思路是将新矩阵的列从左到右的求出来,
用的是第一矩阵的行遍历乘第二矩阵的列直至第一矩阵的行全部遍历为止。
这样做的缺点不能直接输出,因为先出来的都是列。
按照格式的要求,需要先存入另一个数组,这会浪费一些时间和空间。
#include <stdio.h>

int main()
{
    int x, y, z;
    int i, j;

    scanf("%d %d %d", &x, &y, &z);
    int m1[x][y], m2[y][z];
    int m[x][z];
    for (i = 0; i < x * y; i++)
    {
        scanf("%d", &m1[i / y][i % y]);
    }
    for (i = 0; i < y * z; i++)
    {
        scanf("%d", &m2[i / z][i % z]);
    }
    for (i = 0; i < z; i++) // 第二个矩阵的列遍历
    {
        for (j = 0; j < x * y; j++) // 第一个矩阵的行遍历
        {
            if (j % y == 0)
            {
                m[j / y][i] = 0; // 编译器总会初始化一个超大的数给我,必须要提前清一下
            }
            m[j / y][i] += m1[j / y][j % y] * m2[j % y][i]; // 矩阵乘法的原理就是行乘列
        }
    }
    for (i = 0; i < x * z; i++)
    {
        if (i % z == z - 1)
        {
            printf("%d\n", m[i / z][i % z]);
        }
        else
        {
            printf("%d ", m[i / z][i % z]);
        }
    }
    return 0;
}


发表于 2025-01-24 13:05:21 回复(0)
// 重要的是在for循环时候要搞清楚是第几行第几列的值乘以第几行第几列的值

#include <stdio.h>

int main() {
    int matrix_1[50][50];
    int matrix_2[50][50];
    int matrix[50][50];
    int x, y, z;
    scanf("%d", &x);
    scanf("%d", &y);
    scanf("%d", &z);
    int num = 0;
    for(int i = 0; i < x; i++)
    {
        for(int j = 0; j < y; j++)
        {
            scanf("%d", &matrix_1[i][j]);
        }
    }
    for(int i = 0; i < y; i++)
    {
        for(int j = 0; j < z; j++)
        {
            scanf("%d", &matrix_2[i][j]);
        }
    }
    for(int i = 0; i < x; i++)
    {
        for(int j = 0; j < z; j++)
        {
            for(int k = 0; k < y; k++)
            {
                num += matrix_1[i][k] * matrix_2[k][j];
            }
            printf("%d ", num);
            num = 0;
        }
        printf("\n");
    }
    return 0;
}
发表于 2024-07-23 17:45:44 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int x, y, z;
    scanf("%d %d %d", &x, &y, &z);
    int A[x][y];
    int B[y][z];
    int sum = 0;
    for(int i = 0; i < x; i++){
        for(int j = 0; j < y; j++){
            scanf("%d", &A[i][j]);
        }
    }
    for(int i = 0; i < y; i++){
        for(int j = 0; j < z; j++){
            scanf("%d", &B[i][j]);
        }
    }
    for(int i = 0; i < x; i++){
        for(int j = 0; j < z; j++){
            sum = 0;
            for(int k = 0; k < y; k++){
                sum += A[i][k] * B[k][j];
            }
            printf("%d ", sum);
        }
        printf("\n");
    }
    return 0;
}

发表于 2023-10-29 13:03:10 回复(0)
#include <stdio.h>

int main() {
    int x = 0, y = 0, z = 0;
    while (scanf("%d %d %d", &x, &y, &z) != EOF) {
        int a[100][100] = { 0 };
        int b[100][100] = { 0 };
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                scanf("%d", &a[i][j]);
            }
        }
        for (int i = 0; i < y; i++)
        {
            for (int j = 0; j < z; j++)
            {
                scanf("%d", &b[i][j]);
            }
        }
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < z; j++)
            {
                int tmp = 0;
                for (int k = 0; k < y; k++)
                {
                    tmp += a[i][k] * b[k][j];
                }
                printf("%d ", tmp);
            }
            printf("\n");
        }
    }
    return 0;
}
发表于 2023-10-18 18:30:18 回复(0)
#include <stdio.h>
#define    N    100
int main()
{
    int a[N][N],b[N][N],res[N][N]={0},x,y,z,i,j,k;
    scanf("%d%d%d",&x,&y,&z);
    for(i=0;i<x;i++)
        for(j=0;j<y;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<y;i++)
        for(j=0;j<z;j++)
            scanf("%d",&b[i][j]);
    for(i=0;i<x;i++)
        for(j=0;j<z;j++)
            for(k=0;k<y;k++)
                res[i][j]+=a[i][k]*b[k][j];
    for(i=0;i<x;i++)
    {
        for(j=0;j<z;j++)
            printf("%d ",res[i][j]);
        printf("\n");
    }
    return 0;
}

发表于 2022-05-03 15:23:47 回复(0)
#include<stdio.h>
int main(){
    int matrix1[100][100]={0},matrix2[100][100]={0},matrix3[100][100]={0};
    int m=0,n=0,p=0;
    while(~scanf("%d\n%d\n%d",&m,&n,&p)){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&matrix1[i][j]);  //读入矩阵1
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<p;j++){
                scanf("%d",&matrix2[i][j]);  //读入矩阵2
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<p;j++){
                for(int k=0;k<n;k++){
                    matrix3[i][j] += matrix1[i][k]*matrix2[k][j]; //计算矩阵3的元素
                }
            }
        }
        for(int s=0;s<m;s++){
            for(int t=0;t<p;t++){
                printf("%d",matrix3[s][t]);
                if(t!=p-1) printf(" ");  //控制空格符数量
            }printf("\n");  //控制换行
        }
    }    
}

发表于 2022-03-31 21:36:09 回复(0)
#include<stdio.h>
int main()
{
    int x, y, z;
    while (~scanf("%d%d%d", &x, &y, &z))
    {
        int i, j, k;
        int sq1[100][100], sq2[100][100], num[100][100]={0};
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < y; j++)
            {
                scanf("%d", &sq1[i][j]);
            }
        }
        for (i = 0; i < y; i++)
        {
            for (j = 0; j < z; j++)
            {
                scanf("%d", &sq2[i][j]);
            }
        }
        int m = 0, n = 0;//m,n为新矩阵的行列
        for (i = 0; i < x; i++)
        {
            n = 0;
            for (k = 0; k < z; k++)
            {
                for (j = 0; j < y; j++)
                {
                    num[m][n] += (int)(sq1[i][j] * sq2[j][k]);
                }
                n++;
            }
            m++;
        }
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < z; j++)
            {
                printf("%d ", num[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
发表于 2022-02-17 00:01:16 回复(0)
大佬们,为什么我加上下面注释里的的free就跑不了了呀,不加就可以。
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x, y, z, **matrix1, **matrix2, **result;
    while(scanf("%d %d %d", &x, &y, &z) != EOF)
    {
        matrix1 = (int **)malloc(sizeof(int *) * x);//分配三个矩阵的空间
        for(int i = 0; i < x; i++)
            matrix1[i] = (int *)malloc(sizeof(int) * y);
        matrix2 = (int **)malloc(sizeof(int *) * y);
        for(int i = 0; i < y; i++)
            matrix2[i] = (int *)malloc(sizeof(int) * z);
        result = (int **)malloc(sizeof(int *) * x);
        for(int i = 0; i < x; i++)
            result[i] = (int *)malloc(sizeof(int) * z);
        for(int i = 0; i < x; i++)//输入matrix1
        {
            for(int j = 0; j < y; j++)
                scanf("%d", &matrix1[i][j]);
        }
        for(int i = 0; i < y; i++)//输入matrix2
        {
            for(int j = 0; j < z; j++)
                scanf("%d", &matrix2[i][j]);
        }
        for(int i = 0; i < x; i++)//获取result
        {
            for(int j = 0; j < z; j++)
            {
                for(int k = 0; k < y; k++)
                {
                    result[i][j] += matrix1[i][k] * matrix2[k][j];
                }
            }
        }
        for(int i = 0; i < x; i++)//打印result
        {
            for(int j = 0; j < z; j++)
            {
                printf("%d ", result[i][j]);
            }
            printf("\n");
        }/*
        for(int i = 0; i < x; i++)
            free(matrix1[i]);
        free(matrix1);
        for(int i = 0; i < y; i++)
            free(matrix2[i]);
        free(matrix2);
        for(int i = 0; i < x; i++)
            free(result[i]);
        free(result);*/
    }
    return 0;
}

发表于 2021-12-20 10:26:23 回复(0)
#include<stdio.h>
int main()
{
    int x,y,z;
    int a[50][50];
    int b[50][50];
    int c[50][50]={0};
    while(scanf("%d %d %d",&x,&y,&z)!=EOF)
    {
        for(int i=0;i<x;i++)
            for(int j=0;j<y;j++)
                scanf("%d",&a[i][j]);
        for(int i=0;i<y;i++)
            for(int j=0;j<z;j++)
                scanf("%d",&b[i][j]);
        for(int i=0;i<x;i++)
            for(int j=0;j<z;j++)
                c[i][j]=0; 
   
        for(int i=0;i<x;i++)
            for(int j=0;j<z;j++)
            {
                //temp=0;
                for(int k=0;k<y;k++)
                    c[i][j]+=a[i][k]*b[k][j];
            }
        for(int i=0;i<x;i++){
            for(int j=0;j<z;j++)
               printf("%d ",c[i][j]);
            printf("\n");
    }
    }
    return 0;
}
发表于 2021-08-25 17:23:20 回复(0)

题目描述有问题,K的取值应该是[0,y-1],剩下的就好办了,答案就在谜面上

#include<stdio.h>
int main() {
    int x,y,z;
    int A[100][100], B[100][100], C[100][100];
    while(scanf("%d\n%d\n%d\n", &x, &y, &z) != EOF) {
        for(int i = 0; i < x; i++) {
            for(int j = 0; j < y; j++) {
                scanf("%d", &A[i][j]);
            }
        }
        for(int i = 0; i < y; i++) {
            for(int j = 0; j < z; j++) {
                scanf("%d", &B[i][j]);
            }
        }

        for(int i = 0; i < x; i++) {
            for(int j = 0; j < z; j++) {
                int count = 0;
                for(int k = 0; k < y; k++) {
                    count += A[i][k]*B[k][j];
                }
                printf("%d ", count);
            }
            printf("\n");
        }
    }
}
发表于 2021-08-21 17:46:10 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main() {
    int x = 0, y = 0, z = 0;
    while (scanf("%d%d%d", &x, &y, &z) != EOF) {
        int arr_a[x][y];
        int arr_b[y][z];
        int res[x][z];
        int res_j = 0;
        for (int i = 0; i < x; ++i) {
            for (int j = 0; j < y; ++j) {
                scanf("%d", &arr_a[i][j]);
            }
        }
        for (int i = 0; i < y; ++i) {
            for (int j = 0; j < z; ++j) {
                scanf("%d", &arr_b[i][j]);
            }
        }
        for (int i = 0; i < x; ++i) {
            for (int j = 0; j < z; ++j) {
                int sum = 0;
                for (int a_j = 0; a_j < y; ++a_j) {
                    sum += arr_a[i][a_j] * arr_b[a_j][j];
                }
                res[i][j] = sum;
            }
        }
        for (int i = 0; i < x; ++i) {
            for (int j = 0; j < z; ++j) {
                printf("%d ", res[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

发表于 2021-07-25 21:52:49 回复(0)