矩陣相乘最重要的方法當然是一般矩陣乘積了,它只有在第一個矩陣的列數 (column)和第二個矩陣的行數(row)相同時才有定義。一般單指矩陣乘積時,指的便是 一般矩陣乘積。若 A 為 m×n 矩陣,B 為 n×p 矩陣,則他們的乘積 AB(有時記做A · B)會是 一個 m×p 矩陣。其乘積矩陣的元素如下面式子得出:
以上是用矩陣單元的代數系統來說明這類乘法的抽象性質。
由定義直接計算
左邊的圖表示出要如何計算 AB 的 (1,2) 和 (3,3) 元素,當 A 是個 4×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
沒有留言:
張貼留言