2009-09-14 20 views
5

Ich versuche, eine Determinante mit den Boost C++ - Bibliotheken zu berechnen. Ich habe den Code für die Funktion InvertMatrix() gefunden, die ich unten kopiert habe. Jedes Mal, wenn ich diese Umkehrung berechne, möchte ich auch die Determinante. Ich habe eine gute Idee, wie man rechnet, indem man die Diagonale der U-Matrix von der LU-Zerlegung multipliziert. Es gibt ein Problem, ich bin in der Lage, die Determinante richtig zu berechnen, außer für das Zeichen. Je nach Verschwenkung bekomme ich die Hälfte der Zeit falsch angezeigt. Hat jemand einen Vorschlag, wie man das Zeichen jedes Mal richtig macht? Danke im Voraus.Boost-Bibliothek, wie Determinante von lu_factorize() erhalten?

Hier habe ich meinen besten Schuss bei der Berechnung der Determinante eingefügt.

T determinant = 1; 

for(int i = 0; i < A.size1(); i++) 
{ 
    determinant *= A(i,i); 
} 

Beenden Sie meinen Teil des Codes.

// create identity matrix of "inverse" 
inverse.assign(ublas::identity_matrix<T>(A.size1())); 

// backsubstitute to get the inverse 
lu_substitute(A, pm, inverse); 

return true; 
} 

Antwort

3

Die Permutationsmatrix pm enthält die Informationen, die Sie benötigen, die Vorzeichenwechsel zu bestimmen: Sie wollen Ihre Determinante Matrix durch die Determinante der Permutation multiplizieren.

Durch die Quelldatei lu.hpp finden wir eine Funktion namens swap_rows, die beschreibt, wie eine Permutationsmatrix auf eine Matrix angewendet wird. Es ist leicht die Determinante der Permutationsmatrix (das Vorzeichen der Permutation), gegeben zu ergeben modifiziert, dass jeder tatsächliche Swap einen Faktor von -1 trägt:

template <typename size_type, typename A> 
int determinant(const permutation_matrix<size_type,A>& pm) 
{ 
    int pm_sign=1; 
    size_type size=pm.size(); 
    for (size_type i = 0; i < size; ++i) 
     if (i != pm(i)) 
      pm_sign* = -1; // swap_rows would swap a pair of rows here, so we change sign 
    return pm_sign; 
} 

Eine andere Alternative wäre, verwenden Sie die lu_factorize und lu_substitute Methoden, die Pivotieren Sie nicht (konsultieren Sie die Quelle, aber lassen Sie die pm in den Aufrufen zu lu_factorize und lu_substitute grundsätzlich fallen). Diese Änderung würde dazu führen, dass Ihre Determinantenberechnung so funktioniert, wie sie ist. Seien Sie jedoch vorsichtig: Wenn Sie das Pivotieren entfernen, wird der Algorithmus weniger numerisch stabil.

1

Nach http://qiangsong.wordpress.com/2011/07/16/lu-factorisation-in-ublas/:

Gerade determinant *= A(i,i) zu determinant *= (pm(i) == i ? 1 : -1) * A(i,i) ändern. Ich habe diesen Weg versucht und es funktioniert.

Ich weiß, dass es tatsächlich Managu's Antwort sehr ähnlich ist und die Idee ist die gleiche, aber ich glaube, es ist einfacher (und "2 in 1", wenn in InvertMatrix-Funktion verwendet).

Verwandte Themen