2013-04-01 103 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