2011-03-03 39 views
6

我試圖實現一個Matrix.class來學習一些Java。 現在,我有一些方法應該返回高斯消元之後的矩陣,以後將用於查找矩陣的逆矩陣。
這裏是我想出迄今:Java中的高斯消去

public Matrix gaussianElimination() { 
    Matrix inv = this.clone(); 
    int i = 0; 
    int j = 0; 

    while (i<inv.getHeight() && j<inv.getWidth()) { 
     int pivot = i; 
     for (int k=i+1; k<inv.getHeight(); k++) { 
      if (Math.abs(inv.getArray()[k][j]) > Math.abs(inv.getArray()[pivot][j])) { 
       pivot = k; 
      } 
     } 
     if (inv.getArray()[pivot][j] != 0) { 
      inv = inv.swapRow(i, pivot); 
      double div = inv.getArray()[i][j]; 
      for (double value : inv.getArray()[i]) { 
       value = value/div; 
      } 
      for (int u=i+1; u < inv.getHeight(); u++) { 
       double mult = inv.getArray()[u][j]; 
       for (int l=0; l<inv.getWidth(); l++) { 
        inv.getArray()[u][l] = mult * inv.getArray()[i][l]; 
       } 
      } 
     } 
     j++; 
     i++; 
    } 
    return inv; 
} 

儘管的getArray()函數返回雙[] []矩陣,的getHeight()和的getWidth()返回inv.length和INV [中0] .length。

我跟着這個wikipedia頁面的僞代碼來實現算法。
該方法返回頂部第一個元素的行,但不正確計算下部行的矩陣。

例如:


0.2635522849474877 0.10001114673002853 0.442971040143471
0.2986277338922876 0.7517642579959294 0.09150190333830721
0.8913610667753092 0.8898546572478708 0.25592546060133237

INV
0.8913610667753092 0.8898546572478708 0.25592546060133237
0.26618513545092265 0.26573527978742995 0.07642644034471581
0.062426597261833985 0.9565941264 0.017923775508624545

我會非常感謝任何幫助,因爲我找不到解決方案。我可能在某處混合了一個指針,或者實現了錯誤的算法。

+0

嗨,你可以發佈你的'矩陣'類的來源。 – 2011-03-03 12:41:06

回答

4

我看到兩個問題。

在這些行:

 for (double value : inv.getArray()[i]) { 
      value = value/div; 
     } 

您沒有修改存儲在矩陣中的值;你只需修改value的值然後丟棄它。你想要的東西,如:

for (int idx=0; idx<inv.getWidth(); idx++) { 
    inv.getArray()[i,idx] = inv.getArray()[i,idx]/div; 
} 

而且,在這一行:

inv.getArray()[u][l] = mult * inv.getArray()[i][l]; 

你應該改變=-=。該算法說「從行u減去A [u,j] *行i」。你只是用產品替換行u中的值。

+1

謝謝。你幫了我很多。通過這些修改它可以正常工作。 – anddromedar 2011-03-03 16:37:50