矩陣相乘的算法

    好久沒寫blog了,感受人都快變的抑鬱了,換工做以後各類揪心,說好了是作Android的,結果讓我搞各類算法,也罷,權當學習了一點知識吧。算法

    今天說說矩陣相乘的算法,計算算法很簡單,就是3個for循環。數組

    首先仍是說下矩陣相乘的概念,其實大學的時候線性代數中應該有講到,不過到如今估計都還給老師了。學習

    廢話很少說,矩陣,其實就是一個二維數組,橫豎排列的,好比int[5][6],就是一個矩陣,表示有5行6列。spa

    只有當矩陣A的列數與矩陣B的行數相等時A×B纔有意義。一個m×n的矩陣a(m,n)左乘一個n×p的矩陣b(n,p),會獲得一個m×p的矩陣c(m,p)。左乘:又稱前乘,就是乘在左邊(即乘號前),好比說,A左乘E即AE。code

   在計算機中,一個矩陣實際上就是一個二維數組。一個m行n列的矩陣與一個n行p列的矩陣能夠相乘,獲得的結果是一個m行p列的矩陣,其中的第i行第j列位置上的數爲第一個矩陣第i行上的n個數與第二個矩陣第j列上的n個數對應相乘後所得的n個乘積之和。好比,下面的算式表示一個2行2列的矩陣乘以2行3列的矩陣,其結果是一個2行3列的矩陣。htm

    算法:blog

  

 1 //矩陣相乘
 2     public static float[][] Mul(float[][] a, float[][] b) {
 3         //確保矩陣a的列數和b的行數相等
 4         if(a[0].length != b.length) {
 5             return null;
 6         } 
 7         //用來存放結果的矩陣,axb的結果爲a的行數和b的列數
 8         float[][] result = new float[a.length][b[0].length]; 
 9         //對a的每行進行遍歷
10         for(int i=0; i<a.length; i++) {
11             //對b的每列進行遍歷
12             for(int j=0;j<b[0].length; j++) {
13                 //c爲每個點的值
14                 float c = 0;
15                 //第i行j列的值爲a的第i行上的n個數和b的第j列上的n個數對應相乘之和,其中n爲a的列數,也是b的行數,a的列數和b的行數相等
16                 for(int k=0; k<a[0].length; k++) {
17                     c += (a[i][k]*b[k][j]);
18                 }
19                 result[i][j] = c;
20             }
21         }
22         return result;
23     }

 

    代碼註釋的很清楚了,主要是抓住定義,3個for循環。若是你的二維數組不是float類型,能夠相應的更改,記得將c和返回值一併更改。get

    就到這裏吧。for循環

相關文章
相關標籤/搜索