發新話題

[教學]二維矩陣相乘

[教學]二維矩陣相乘

先講解一下相乘的規則,最簡單的兩陣列(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 編輯 ]

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。