先講解一下相乘的規則,最簡單的兩陣列(A行等於A列等於B行等於B列)
A00 A01 B00 B01 C00 C01
* =
A10 A11 B10 B11 C10 C11
C00 = A00 * B00 + A01 * B10
C01 = A00 * B01 + A01 * B11
C10 = A10 * B00 + A11 * B10
C11 = A10 * B01 + A11 * B11
用 i 與 j 來代表行與列,可簡化出以下的規則
Cij = Ai0 * B0j + Ai1 * Bj1
再將 0 與 1 以一變數 k 在迴圈裡運作
for(k=0;k<2;k++)
Cij += Aik * Bkj
完整的程式運作如下
複製內容到剪貼板
代碼:
// 假設己準備好兩陣列分別為陣列A陣列B,陣列C各元素己用0初始化
int i,j,k
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(k=0;k<2;k++)
C[i][j] += A[i][k] * B[k][j];
變化題...
若兩陣列的行與列不同,也是可以相乘,相乘後的陣列行列規則如下(aj必須要等於bi)
A[ai][aj] * B[bi][bj] = C[ai][bj]
由於 aj 必須要等於 bi 簡化成以下
A[m][n] * B[n][p] = C[m][p]
A[00] A[01] A[02] B[00] B[01] C[00] C[01]
A[10] A[11] A[12] * B[10] B[11] = C[10] C[11]
B[20] B[21]
c[00] = a[00] * b[00] + a[01] * b[10] + a[02] * a[20]
c[01] = a[00] * b[01] + a[01] * b[11] + a[02] * a[21]
c[10] = a[10] * b[00] + a[11] * b[10] + a[12] * a[20]
c[11] = a[10] * b[01] + a[11] * b[11] + a[12] * a[21]
套用簡化的規則完整的程式運作如下
複製內容到剪貼板
代碼:
// 假設己準備好兩陣列分別為陣列A陣列B,陣列C各元素己用0初始化
// m n p 分別代表陣列的行列
int i,j,k
for(i=0;i<m;i++)
for(j=0;j<p;j++)
for(k=0;k<n;k++)
C[i][j] += A[i][k] * B[k][j];
複製內容到剪貼板
代碼:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int i,j,k,m,n,n1,p,c[10][10]={0},a[10][10]={0},b[10][10]={0};
cout<<"請輸入二維矩陣 a[m][n]之m與n值:";
cin>>m>>n;
cout<<"請輸入二矩陣a的元素值(按列之順序):"<<endl;
for(i = 0;i < m;i++){
for(j = 0;j < n;j++){
cin>>a[i][j];
}
}
cout<<endl;
while(true){
cout<<"請輸入二維矩陣b[n][p]之n與p值:";
cin>>n1>>p;
if(n != n1)
cout<<"a陣列之行數必須等於b陣列之列數,請重新輸入!"<<endl;
else
break;
}
cout<<"請輸入矩陣b的元素值(按列之順序):"<<endl;
for(i = 0;i < n;i++){
for(j = 0;j < p;j++){
cin>>b[i][j];
}
}
for(i = 0;i < m;i++)
for(j = 0;j < p;j++)
for(k = 0;k < n;k++){
c[i][j] += a[i][k] * b[k][j];
}
cout<<"a*b之結果如下:"<<endl;
for(i = 0;i < m;i++){
for(j = 0;j < p;j++){
cout<<setw(3)<<c[i][j];
}
cout<<endl;
}
system("PAUSE");
}
[
本帖最後由 philxyz0316 於 2006-8-27 13:07 編輯 ]