1. 程式人生 > >編寫函式:矩陣乘法 (Append Code)

編寫函式:矩陣乘法 (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;
}
  1. 陣列長度的定義:要統一,不能在主函式裡是matrix1[MAX_SIZE][MAX_SIZE],然後自己寫的函式裡就變成了ma[][1002],裡面寫MAX_SIZE或者101,都可。
  2. 關於矩陣的乘法其實有一個公式:那個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列