首页 > 代码库 > C语言实现的矩阵乘法运算器

C语言实现的矩阵乘法运算器

需求  

  编写程序模拟矩阵乘法,一个m*n的矩阵,乘以一个 n*m 的矩阵, 并且输出结果。

STEP 1  矩阵乘法的计算

  一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵。

  其中乘积矩阵的第i行第j列位置上的数,为第一个矩阵第i行上的n个数与第二个矩阵第j列上的n个数对应相乘后所得的n个乘积之和。

STEP 2  编程思路

  (1)需申请动态二维数组存储两个参与运算的矩阵以及一个结果矩阵;

  (2)手动输入两个参与运算的矩阵;

  (3)调用函数实习矩阵乘法的计算 并输出结果;

  (4)释放动态数组占用的内存。 

STEP 3  要点整理

  (1)参与运算的矩阵为手动输入数据,无法预先知道二维数组的大小,所以需申请动态数组;

  (2)因为m*n矩阵和n*m矩阵不一定是方阵(即行数和列数相等),因此在申请动态数组时需要定义两个参数,分别控制行、列的长度,否则运行时会出现数组越界的报错。

 

-----------------------------------------华丽丽的分割线---------------------------------代码君要出场了-----------------------------------

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 void product_matrix(int m, int n);
  6 void dynamic_arr(int*** arr, int m, int n); 
  7 void input_arr(int*** arr, int m, int n); 
  8 void free_arr(int*** arr, int x);
  9 
 10 int main()
 11 {            
 12     int m, n;
 13 
 14     printf("请输入m,n:\n");           
 15     scanf("%d,%d", &m, &n);  
 16     product_matrix(m, n);                      
 17 
 18     return 0;
 19 }
 20 
 21 void product_matrix(int m, int n)
 22 {
 23     int i, x, y, sum;
 24     int** arr_a;
 25     int** arr_b;
 26     int** arr_res;
 27 
 28     input_arr(&arr_a, m, n);
 29     input_arr(&arr_b, n, m);
 30     dynamic_arr(&arr_res, m, m);
 31 
 32     printf("矩阵相乘的结果为:\n");
 33     for(x = 0; x < m; x++)
 34     {
 35         for(y = 0; y < m; y++)
 36         {
 37             sum = 0;
 38             for(i = 0; i < n; i++)
 39             {
 40                 sum = sum + arr_a[x][i] * arr_b[i][y];
 41             }
 42             arr_res[x][y] = sum;
 43             printf("%5d", arr_res[x][y]);
 44         }
 45         printf("\n");
 46     }
 47 
 48     free_arr(&arr_a, m);
 49     free_arr(&arr_b, n);
 50     free_arr(&arr_res, m);
 51 }
 52 
 53 void dynamic_arr(int*** arr, int m, int n)                          //申请动态数组
 54 {     
 55     int i;
 56     *arr = (int **)malloc(sizeof(int *) * m); 
 57     
 58     for(i = 0; i < m; i++)                                  
 59     {
 60         (*arr)[i] = (int *)malloc(sizeof(int) * n);
 61         memset((*arr)[i], 0, sizeof(int) * n);
 62     }     
 63 }
 64 
 65 void input_arr(int*** arr, int m, int n)                            //输入数组
 66 {
 67     int i, j;
 68 
 69     dynamic_arr(arr, m, n); 
 70 
 71     printf("请输入%d个整数:\n", m * n);
 72     for(i = 0; i < m; i++)
 73     {
 74         for(j = 0; j < n; j++)
 75             scanf("%d", &(*arr)[i][j]);
 76     }
 77 
 78     printf("输出数组:\n");
 79     for(i = 0; i < m; i++)
 80     {
 81         for(j = 0; j < n; j++)
 82             printf("%5d", (*arr)[i][j]);
 83         printf("\n");
 84     }
 85     printf("\n");
 86 }
 87 
 88 void free_arr(int*** arr, int x)                                      //释放占用的内存
 89 {
 90     int i;
 91 
 92     for(i = 0; i < x; i++) 
 93     {
 94         free((*arr)[i]);
 95         (*arr)[i] = 0;
 96     }
 97 
 98     free(*arr);      
 99     *arr = 0;
100 }