2011年12月8日 星期四

d481: 矩陣乘法

內容 :
    矩陣相乘最重要的方法當然是一般矩陣乘積了,它只有在第一個矩陣的列數 (column)和第二個矩陣的行數(row)相同時才有定義。一般單指矩陣乘積時,指的便是 一般矩陣乘積。若 A 為 m×n 矩陣,B 為 n×p 矩陣,則他們的乘積 AB(有時記做A · B)會是 一個 m×p 矩陣。其乘積矩陣的元素如下面式子得出:

 

    以上是用矩陣單元的代數系統來說明這類乘法的抽象性質。

    由定義直接計算

Matrix multiplication diagram.PNG左邊的圖表示出要如何計算 AB 的 (1,2) 和 (3,3) 元素,當 A 是個 4×2 矩陣和 B 是個 2×3 矩陣時。分別來自兩個矩陣的元素都依箭頭方向而兩兩配對,把每一對中的兩個元素相乘,再把這些乘積加總起來,最後得到的值即為箭頭相交位置的值。

    內容來源:矩陣乘法

(AB)_{1,2} = \sum_{r=1}^2 a_{1,r}b_{r,2} = a_{1,1}b_{1,2}+a_{1,2}b_{2,2}
(AB)_{3,3} = \sum_{r=1}^2 a_{3,r}b_{r,3} = a_{3,1}b_{1,3}+a_{3,2}b_{2,3}

    每組測資有 2 個矩陣,請把他們相乘之後的結果輸出

輸入說明 :
    輸入數據不會超過 231-1
    兩矩陣大小不超過 100 * 100
    每組測資第一行四個數字 a b c d
    代表第一個矩陣有 a 列 b 行
            第二個矩陣有 c 列 d 行
    接下來 a 行,每行 b 個數字
                 c 行,每行 d 個數字
    每個數字以空白隔開
    不懂請參考範例輸入

輸出說明 :
    輸出相乘之後的矩陣
    每個數字以空白隔開
    兩矩陣不能相乘請輸出Error再換下一組測資(不用讀取矩陣)

範例輸入 :
3 2 2 3
1 2
3 4
5 6
1 2 3
4 5 6
1 2 3 4

範例輸出 :
9 12 15
19 26 33
29 40 51
Error

程式碼 :
#include<stdio.h>

int main()
{
    int a,b,c,d,i,j,k,temp;
    long long data1[100][100],data2[100][100],ans[100][100];
    
    while(scanf("%d %d %d %d",&a,&b,&c,&d)==4)
    {
        if(b != c)
            printf("Error\n");
        else
        {
            for(i=0; i<a; i++)
                for(j=0; j<b; j++)
                    scanf("%lld",&data1[i][j]);
            for(i=0; i<c; i++)
                for(j=0; j<d; j++)
                    scanf("%lld",&data2[i][j]);
            
            for(i=0; i<a; i++)
                for(j=0; j<d; j++)
                {
                    ans[i][j] = 0;
                    for(k=0; k<b; k++)
                        ans[i][j]+=data1[i][k]*data2[k][j];
                }
            
            for(i=0; i<a; i++)
            {
                for(j=0; j<d; j++)
                    printf("%lld ",ans[i][j]);
                printf("\n");
            }
        }
    }
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d481

沒有留言:

張貼留言