2013-03-31 183 views
2

我目前正在開發一個類來表示矩陣,它代表任何一般的mxn矩陣。我已經完成了加法和標量乘法,但我正在努力開發兩個矩陣的乘法。矩陣的數據保存在一個二維數組中。在Java中乘以兩個矩陣

的方法看起來有點像這樣:

public Matrix multiply(Matrix A) { 
      ////code 
    } 

它將返回產品矩陣。這是右邊的乘法。所以,如果我叫A.multiply(B),那麼它會返回矩陣AB,B在右邊。

我還不需要擔心檢查乘法是否在給定矩陣的定義,我認爲我將得到正確的尺寸的矩陣。

有誰知道一個簡單的算法,甚至可能在僞碼進行乘法處理?

在此先感謝。

+0

你嘗試過什麼嗎?或者你問過叔叔谷歌? – ogzd

+1

我試過Google,但找不到任何我熟悉的東西。我並不關心效率,只是一些很容易編程的東西。我自己嘗試在for循環中使用for循環,但沒有成功。我真的有點麻煩了。我認爲這很疲倦,我最終會到達那裏:p但是網上的一些提示總是有幫助的。 –

回答

10

數學矩陣A(LXM)和B(MXN)的產品被定義爲矩陣C(LXN)由元素:

 m 
c_i_j = ∑ a_i_k * b_k_j 
     k=1 

所以,如果你不是太多了速度你可能會很樂意與直線前進爲O(n^3)執行:

for (int i=0; i<l; ++i) 
    for (int j=0; j<n; ++j) 
     for (int k=0; k<m; ++k) 
     c[i][j] += a[i][k] * b[k][j] 

相反,如果你彌補的速度,你可能想看看像施特拉森算法其他替代品(見:Strassen的算法)。

但被警告 - 特別是如果你在現代的處理器架構乘以小矩陣的速度在很大程度上取決於排列的方式,使最佳利用高速緩存行矩陣數據和乘法的順序。

我強烈懷疑會有任何機會從withing一個VM影響這一因素,所以我不知道這是要考慮的。

+0

非常感謝你:)這個作品。效率並不重要,所以O(n^3)的複雜性就很好。我所需要的只是讓算法正確執行這個過程,不管它需要多長時間,這都是好事。再次感謝 :) –

0

的Java。矩陣乘法。

這裏是「代碼進行乘法處理」。用不同尺寸的基質進行測試。

public class Matrix { 

/** 
* Matrix multiplication method. 
* @param m1 Multiplicand 
* @param m2 Multiplier 
* @return Product 
*/ 
    public static double[][] multiplyByMatrix(double[][] m1, double[][] m2) { 
     int m1ColLength = m1[0].length; // m1 columns length 
     int m2RowLength = m2.length; // m2 rows length 
     if(m1ColLength != m2RowLength) return null; // matrix multiplication is not possible 
     int mRRowLength = m1.length; // m result rows length 
     int mRColLength = m2[0].length; // m result columns length 
     double[][] mResult = new double[mRRowLength][mRColLength]; 
     for(int i = 0; i < mRRowLength; i++) {   // rows from m1 
      for(int j = 0; j < mRColLength; j++) {  // columns from m2 
       for(int k = 0; k < m1ColLength; k++) { // columns from m1 
        mResult[i][j] += m1[i][k] * m2[k][j]; 
       } 
      } 
     } 
     return mResult; 
    } 

    public static String toString(double[][] m) { 
     String result = ""; 
     for(int i = 0; i < m.length; i++) { 
      for(int j = 0; j < m[i].length; j++) { 
       result += String.format("%11.2f", m[i][j]); 
      } 
      result += "\n"; 
     } 
     return result; 
    } 

    public static void main(String[] args) { 
     // #1 
     double[][] multiplicand = new double[][] { 
       {3, -1, 2}, 
       {2, 0, 1}, 
       {1, 2, 1} 
     }; 
     double[][] multiplier = new double[][] { 
       {2, -1, 1}, 
       {0, -2, 3}, 
       {3, 0, 1} 
     }; 
     System.out.println("#1\n" + toString(multiplyByMatrix(multiplicand, multiplier))); 
     // #2 
     multiplicand = new double[][] { 
       {1, 2, 0}, 
       {-1, 3, 1}, 
       {2, -2, 1} 
     }; 
     multiplier = new double[][] { 
       {2}, 
       {-1}, 
       {1} 
     }; 
     System.out.println("#2\n" + toString(multiplyByMatrix(multiplicand, multiplier))); 
     // #3 
     multiplicand = new double[][] { 
       {1, 2, -1}, 
       {0, 1, 0} 
     }; 
     multiplier = new double[][] { 
       {1, 1, 0, 0}, 
       {0, 2, 1, 1}, 
       {1, 1, 2, 2} 
     }; 
     System.out.println("#3\n" + toString(multiplyByMatrix(multiplicand, multiplier))); 
    } 
} 

輸出:

#1 
     12.00  -1.00  2.00 
     7.00  -2.00  3.00 
     5.00  -5.00  8.00 

#2 
     0.00 
     -4.00 
     7.00 

#3 
     0.00  4.00  0.00  0.00 
     0.00  2.00  1.00  1.00