程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言實現的矩陣乘法運算器

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 }

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved