C语言实现矩阵相乘:动态数组应用

题目描述

使用C语言编写程序,实现矩阵相乘运算。输入矩阵、输出矩阵、矩阵相乘的功能均需各写成一个函数!!!设第1个矩阵为a,行数和列数分别为n、p;第2个矩阵为b行数和列数分别为p,m,它们的乘积矩阵为c,行数和列数分别为n、m。c的i行j列的元素c(i,j)的计算规则为: c(i,j)=a(i,1)*b(1,j)+a(i,2)*b(2,j)+...+a(i,p)*b(p,j), i=1,...,n;j=1,...,m

输入格式

第1行输入三个整数分别表示n、p、m 后面按行输入第1个矩阵和第2个矩阵。

输出格式

乘积矩阵,按行输出,行中数据用一个空格隔开,末尾无空格。

注意

数组的大小,根据输入的n、p、m动态申请!!! 注意适时释放。

输入输出样例

输入

4 3 2
5 2 4
3 8 2
6 0 4
0 1 6
2 4
1 3
3 2

输出

24 34
20 40
24 32
19 15

解题思路

这道题目需要我们实现矩阵的输入、输出、矩阵的乘法。 矩阵的乘法很容易实现,但是我们需要动态申请数组空间。

解题步骤

  1. 读入n、p、m
  2. 申请a,b,c矩阵空间,注意这里使用动态数组
  3. 读入矩阵a,b
  4. 矩阵c的计算
  5. 输出矩阵c
  6. 释放动态数组空间

代码如下

#include <stdio.h>
#include <stdlib.h>

void input_matrix(int **matrix, int row, int col) {
    *matrix = (int *)malloc(row * col * sizeof(int));
    if (*matrix == NULL) {
        printf("内存分配失败!");
        exit(1);
    }
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            scanf("%d", (*matrix + i * col + j));
        }
    }
}

void output_matrix(int *matrix, int row, int col) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf("%d ", *(matrix + i * col + j));
        }
        printf("\n");
    }
}

void matrix_multiply(int *a, int *b, int **c, int n, int p, int m) {
    *c = (int *)malloc(n * m * sizeof(int));
    if (*c == NULL) {
        printf("内存分配失败!");
        exit(1);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            (*c + i * m + j) = 0;
            for (int k = 0; k < p; k++) {
                (*c + i * m + j) += *(a + i * p + k) * *(b + k * m + j);
            }
        }
    }
}

int main() {
    int n, p, m;
    int *a, *b, *c;
    scanf("%d %d %d", &n, &p, &m);
    input_matrix(&a, n, p);
    input_matrix(&b, p, m);
    matrix_multiply(a, b, &c, n, p, m);
    output_matrix(c, n, m);
    free(a);
    free(b);
    free(c);
    return 0;
}

原文地址: https://www.cveoy.top/t/topic/nwHh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录