• 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:
    ");           
     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("矩阵相乘的结果为:
    ");
     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("
    ");
     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个整数:
    ", 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("输出数组:
    ");
     79     for(i = 0; i < m; i++)
     80     {
     81         for(j = 0; j < n; j++)
     82             printf("%5d", (*arr)[i][j]);
     83         printf("
    ");
     84     }
     85     printf("
    ");
     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 }

    欢迎转载,请备注原始连接http://www.cnblogs.com/liuliuliu/p/3757714.html,并注明转载。

    作者bibibi_liuliu,联系方式395985239@qq.com

  • 相关阅读:
    事理学神器PDCA
    单元测试
    web框架学习路线
    编译器实现(三)
    markdown test
    设计模式
    编译器实现(二)
    编译器实现(一)
    操作系统结构
    emacs配置笔记(windows10)
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3757714.html
Copyright © 2020-2023  润新知