Bisher habe ich diesen Code für eine LU-Dekomposition. Es nimmt ein Eingabearray auf und gibt die untere und obere Dreiecksmatrix zurück.Hinzufügen von Pivoting-Funktionalität zu einem Doolittle-Algorithmus
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;
}
}
}
Gibt es eine Möglichkeit, dies anzupassen, um Reihenaustausch durchzuführen? Wenn nicht, gibt es einen anderen Algorithmus, auf den ich ausgerichtet sein könnte?
Dank
Bevor ich eine vollständige Antwort geben kann, ist Ihnen bewusst, dass die Bedingung 'k <= j 'immer wahr ist, da Sie von' j = k 'nach' d 'iterieren ? Sie speichern also die gleiche Information über die obere Diagonalmatrix in L und U und setzen sie nur später in "L" auf Null. –
ja, das habe ich realisiert und ich habe es bearbeitet. Vielen Dank! – DHuang