編寫函式:矩陣乘法 (Append Code)
Problem H: 編寫函式:矩陣乘法 (Append Code)
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 6227 Solved: 3313
[Submit][Status][Web Board]
Description
給出一個m行n列的矩陣A和一個n行q列的矩陣B,求它們的乘積。
結合“Append Code”中的程式碼,編寫以下函式(形參中ma[][]的陣列大小需自己補全):
原型:int get_matrix(int ma[][], int m, int n);
功能:遵循樣例輸入的格式讀取一個m行n列的矩陣儲存在ma[][]裡。
原型:int put_matrix(int ma[][], int m, int n);
功能:按格式輸出一個m行n列矩陣ma[][]的所有元素。
原型:int mul_matrix(int pr[][], int m1[][], int m2[][], int m, int n, int q);
功能:計算m行n列的矩陣m1[][]和n行q列的矩陣m2[][]的乘積pr[][]。
函式的呼叫格式見“Append Code”。
Input
輸入分為三部分,首先輸入三個正整數m,n,q,其次是一個m行n列的矩陣A,最後是一個n行q列的矩陣B,矩陣的元素均為整數。m、n、q均不超過100。
Output
輸出一個m行q列的矩陣。矩陣的每行元素輸出為一行,矩陣每列元素間一個用空格分開。
Sample Input
2 2 3
1 1
2 0
0 2 3
1 1 2
Sample Output
1 3 5
0 4 6
HINT
定義多維維陣列做形參時,元素的個數要小心定義。
Append Code
append.c,
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_SIZE 101 int get_matrix(int ma[][MAX_SIZE], int m, int n) { int i,j; for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%d",&ma[i][j]); } int put_matrix(int ma[][MAX_SIZE], int m, int n) { int t1,t2; for(t1=0;t1<m;t1++) for(t2=0;t2<n;t2++) { if(t2==n-1) printf("%d\n",ma[t1][t2]); else printf("%d ",ma[t1][t2]); } } int mul_matrix(int pr[][MAX_SIZE], int m1[][MAX_SIZE], int m2[][MAX_SIZE], int m, int n, int q) { int i,j,k; for(i=0;i<m;i++) for(j=0;j<q;j++) { pr[i][j]=0; for(k=0;k<n;k++) pr[i][j]+=m1[i][k]*m2[k][j]; } } int main() { int m, n, q; int product[MAX_SIZE][MAX_SIZE]; int matrix1[MAX_SIZE][MAX_SIZE]; int matrix2[MAX_SIZE][MAX_SIZE]; scanf("%d%d%d", &m, &n, &q); get_matrix(matrix1, m, n); get_matrix(matrix2, n, q); mul_matrix(product, matrix1, matrix2, m, n, q); put_matrix(product, m, q); return 0; }
- 陣列長度的定義:要統一,不能在主函式裡是matrix1[MAX_SIZE][MAX_SIZE],然後自己寫的函式裡就變成了ma[][1002],裡面寫MAX_SIZE或者101,都可。
- 關於矩陣的乘法其實有一個公式:那個for迴圈包括下面的什麼+=什麼*什麼。推一遍後記住就行了。
for(i=0;i<m;i++)
for(j=0;j<q;j++)
{
pr[i][j]=0;
for(k=0;k<n;k++)
pr[i][j]+=m1[i][k]*m2[k][j];
}
m1:m行n列,m2:n行q列