2017-06-30 28 views
0

到目前爲止,我有用於LU分解的此代碼。它需要一個輸入數組,並返回下三角矩陣和上三角矩陣。將旋轉功能添加到Doolittle算法

void LUFactorization (int d, const double*S, double*L, double*U) 
{ 
    for(int k = 0; k < d; ++k){ 
     if (
     for(int j = k; j < d; ++j){ 
     double sum = 0.; 
     for(int p = 0; p < k; ++p) { 
      sum+=L[k*d+p]*L[p*d+j]; 
      cout << L[k*d+p] << endl; 
     } 
     sum = S[k*d+j] - sum; 
     L[k*d+j]=sum;   
     U[k*d+j]=sum; 
     } 
     for(int i = k + 1; i < d; ++i){ 
     double sum=0.; 
     for(int p = 0; p < k; ++p) sum+=L[i*d+p]*L[p*d+k]; 
     L[i*d+k]=(S[i*d+k]-sum)/L[k*d+k]; 
     } 
    } 

    for(int k = 0; k < d; ++k){ 
     for(int j = k; j < d; ++j){ 
     if (k < j) L[k*d+j]=0; 
     else if (k == j) L[k*d+j]=1; 
     } 
    } 
} 

有沒有什麼方法可以適應這種情況進行行交換?如果沒有,是否還有其他一些算法可以針對?

由於

+0

在我可以提供完整答案之前,您是否知道,由於您從'j = k'迭代到'd',條件'k <= j'始終爲真?因此,你可以在L和U中存儲關於上對角線矩陣的相同信息,以後只用'L'將其歸零。 –

+0

是的,我意識到這一點,我編輯了它。謝謝! – DHuang

回答

0

爲LU通常的方法與樞轉分解是存儲置換陣列P其在S

初始化爲身份置換(P={0,1,2,...,d - 1}),然後交換條目P代替交換行如果你有這個排列數組,對S的每個訪問必須使用P[i]而不是i作爲行號。

注意P本身是輸出的一部分,因爲它代表了置換矩陣,使得
P*A = L*U,所以如果你想用它來求解線性方程組的系統,你必須在正確的應用P在應用反向和正向替換之前,我需要手邊