好久沒寫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循環