矩陣相乘的算法


    很久沒寫blog了,感覺人都快變的抑郁了,換工作之后各種揪心,說好了是做Android的,結果讓我搞各種算法,也罷,權當學習了一點知識吧。

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

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

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

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

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

    算法:

  

 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和返回值一並更改。

    就到這里吧。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM