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 }

 

歡迎轉載,請備注原始連接http://www.cnblogs.com/liuliuliu/p/3757714.html,並注明轉載。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM