2013-04-01 135 views
0

我正在創建一個類來表示三對角矩陣。這些矩陣在對角線上有一組非零值,在上下對角線上有非零值,在其他地方都是零。三對角矩陣的LU分解(Java)

要存儲它們,我使用三個1D陣列:每個對角線一個。

下面是一個例子:

d_0 u_0 0  0 
l_0 d_1 u_1 0 
0 l_1 d_2 u_2 
0  0 l_2 d_3 

所以這是對A_I一個陣列,一個用於u_i,一個用於L_I。零不存儲。

我需要一個算法來執行LU分解。 LU分解通常會產生以下兩個矩陣:

1  0  0 0 
a_0 1  0 0 
0 a_1 1 0 
0  0 a_2 1 


b_0 c_0 0  0 
0 b_1 c_1 0 
0  0 b_2 c_2 
0  0  0 b_3 

然而,1的是無用的作爲與零,他們只是浪費空間,所以我需要在算法返回以下三對角矩陣充當LU分解:

b_0 c_0 0  0 
a_0 b_1 c_1 0 
0  a_1 b_2 c_2 
0  0 a_2 b_3 

我已經設法獲得下列公式:

c_i = u_i for all i 

b_0=d_0 

l_i = a_i * b_i for all i 

d_(i+1) = a_i * c_i + b(i+1) for i>=1 

但我不知道如何找到一個通式爲所有A_I,b_i和c _i這是我所需要的。

有沒有人知道一個很好的,易於編程的算法來爲我做這個。我沒有尋找任何有效的東西,只是最容易編程的東西。

非常感謝。

回答

0

這是一個家庭作業嗎?

爲什麼重新發明輪子?使用此鏈接瞭解如何使用C#進行LU分解。對不起,你必須轉換爲Java

http://msdn.microsoft.com/en-us/magazine/jj863137.aspx

static double[][] MatrixDecompose(double[][] matrix, 
    out int[] perm, out int toggle) { 
    ... 
} 
+0

與該方法的問題是,它似乎認爲我存儲在我的矩陣中的數據作爲一個二維數組的時候,其實我存儲它在三個1D陣列中。如果我要使用它,那麼我將不得不亂用改變矩陣的結構,這種方式正如我目前所做的那樣破壞了存儲事物的點。我有一個普通矩陣類(非三角對角線),實際上我使用的方法與此類似,因爲我使用的是二維數組。 –

+0

所以你的問題不是特定的LU分解,而是與存儲相關。沒有辦法將元素'lu [i] [j]'轉換爲您的存儲方案? – ja72