2013-05-29 90 views
0

我需要一個函數或類,它在我的C++程序中執行LU分解(分解,有什麼區別?)。我用作編譯器Dev-c最新版本(在Windows上)。我想到了如何安裝armadillo和lapack,但它看起來非常複雜,並帶有一些問題http://icl.cs.utk.edu/lapack-for-windows/lapack/(正如頁面底部的說法)。所以我想有一個庫(使用C++),運行良好,安裝起來並不複雜。我在例子中發現了一些關於特徵的東西,它怎麼樣?任何其他建議?程序中的LU分解(C++)

Thankyou

P.S.矩陣在對角線上和附近密集,其餘部分稀疏,角部(N-E)附近空白。

+0

您的矩陣密集還是稀疏?你用什麼格式來存儲它? –

+0

矩陣非常稀疏,我還沒有推斷過格式,但它不是問題。 –

回答

0

我爲你寫了一些C代碼。也許它可以幫助。這是一個將密集矩陣分解爲L,U的過程,其中L * U = A,L - 下三角,U - 上三角,L [i,i] = U [i,i](對角元素相等) 。這種分解也稱爲LU(sq)。

#include <math.h> 
// A, L, U each allocates at least N*N doubles 
// A contains elements of given matrix, written row by row 
void decompose(unsigned N, double *A, double *L, double *U) { 
#define _(M,i,j) M[N*i + j] 
#define _A(i,j) _(A,i,j) 
#define _L(i,j) _(L,i,j) 
#define _U(i,j) _(U,i,j) 
    _L(0,0) = sqrt(_A(0,0)); 
    _U(0,0) = sqrt(_A(0,0)); 
    for (int i = 0; i < N; ++i) { 
     _L(i,0) = _A(i,0)/_A(0,0); 
     _U(0,i) = _A(0,i)/_A(0,0); 
     _L(0,i) = _U(i,0) = 0.0; 

     double s = 0.0; 
     for (int k = 0; k < i; ++k) { 
      s += _L(i,k) * _U(k,i); 
     } 
     _L(i,i) = _U(i,i) = sqrt(_A(i,i) - s); 

     for (int j = 1; j < i; ++j) { 
      double s = 0.0; 
      for (int k = 0; k < j; ++k) { 
       s += _L(i,k) * _U(k,j); 
      } 
      _L(i,j) = (_A(i,j) - s)/_L(i,i); 
      _L(j,i) = 0.0; 

      double s = 0.0; 
      for (int k = 0; k < i; ++k) { 
       s += _L(i,k) * _U(k,j); 
      } 
      _U(j,i) = (_A(i,j) - s)/_U(i,i); 
      _U(i,j) = 0.0; 
     } 
    } 
} 

不幸的是,我現在沒有時間檢查錯誤代碼。 我有一些公式,我有信心(幾年前使用): enter image description here

我的代碼是基於這些公式。 當然,如果你想使用一些特定的適合你的數據稀疏格式,你需要改變過程,但不是公式。