6

Für eine Forschungsarbeit wurde ich beauftragt, den schnellsten Algorithmus zur Berechnung der Determinante einer Matrix zu untersuchen.Schnellster Algorithmus zur Berechnung der Determinante einer Matrix?

Ich weiß schon über LU-Zerlegung und Bareiss Algorithmus, die beide laufen in O (n^3), aber nach einigen graben tun, es scheint, dass es einige Algorithmen sind, die irgendwo zwischen n^2 und n Run^3.

Dieses source (siehe Seite 113-114) und dieses source (siehe Seite 198) sagt, dass ein Algorithmus existiert, läuft in O (n^2,376), weil es zum Multiplizieren Matrix auf der Schmied-Winograd-Algorithmus basiert. Ich konnte jedoch keine Details zu einem solchen Algorithmus finden.

Meine Fragen sind:

  1. Was der schnellsten erstellt (nicht-theoretische) Algorithmus zur Berechnung der Determinante einer Matrix ist?
  2. Wo finde ich Informationen zu diesem schnellsten Algorithmus?

Vielen Dank.

+0

Wie groß sind die Matrizen? Wie viele Determinanten möchten Sie berechnen? –

+0

Ich würde annehmen, dass die Matrizen sehr groß sind (N> 22 ist wahrscheinlich groß genug?). Und wie viel? Nur die eine Determinante für die gegebene Matrix. Eingabe: 1 Große Matrix Ausgabe: Die einzige Bestimmtheit für die Eingabematrix. –

+0

Ist numerische Stabilität auch ein Problem? – Henry

Antwort

4

Ich glaube, der schnellste in der Praxis (und häufig verwendete) Algorithmus ist der Strassen-Algorithmus. Sie können die Erklärung zu Wikipedia zusammen mit Beispiel-C-Code finden.

Algorithmen basierend auf Coppersmith-Winograd's multiplication algorithms sind zu komplex, um praktisch zu sein, obwohl sie die beste asymptotische Komplexität haben.

+0

Es ist erwähnenswert, dass die aktuelle Grenze "O (n^{2.3728639})" ist, aber wie Sopel sagt, ist es unwahrscheinlich, dass der kleinere Exponent es wert ist, gespitzt zu werden auf einer praktischen Berechnung, da sie einen _enormous_ konstanten Faktor vor haben. – Hooked

+0

@Sopel Ich glaube, dass Strassen für Matrix Inversion verwendet wird. siehe http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations Und wie für Algorithmen basierend auf Kupferschmiede-Winograd, Sie sind richtig - ich fragte meinen Professor und er sagte, sie sind die schnellsten, aber sind zu komplex, um praktisch zu sein. Vielen Dank! –

+0

Ich glaube, dass sie sehr ähnliche Probleme sind (ich schließe daraus, dass der Algorithmus von Coppersmith-Winograd zur Matrixmultiplikation transformiert werden kann, um Determinanten zu berechnen), aber ich habe kein großes Wissen darüber, damit ich falsch liegen kann. – Sopel

2

Ich weiß, dass dies keine direkte Antwort auf meine Frage ist, aber für die Zwecke meiner Abschlussarbeit reicht es. ich gerade zu Ende gegangen meinem Professor zu fragen, und ich werde zusammenfassen, was er sagte:

Zusammenfassung:

  • Die schnellste Matrix-Multiplikation Algorithmen (zB Kupferschmiede-Winograd und neuere Verbesserungen) mit O verwendet werden (n^~ 2.376) arithmetische Operationen, verwenden aber schwere mathematische Werkzeuge und sind oft unpraktisch.
  • LU Zerlegung und Bareiss do O verwenden (n^3) Operationen, sind aber praktisch

Kurz gesagt, obwohl LU Zerlegung und Bareiss sind nicht so schnell wie die effizientesten Algorithmen sind sie praktischer und ich sollte meine Forschungsarbeit auf diese beiden konzentrieren.

Danke für alle, die kommentiert und geholfen haben!

+0

Es ist ein Nit, aber "LU Dekomposition und Bareiss sind nicht so schnell" ist nicht wirklich richtig. Was du meinst ist "LU Decomposition und Bareiss sind nicht so schnell _asymptotisch_". Die asymptotisch überlegenen Algorithmen haben in ihren tatsächlichen Ausführungszeitfunktionen so hohe Konstanten, dass die "langsameren" Algorithmen in der Praxis schneller sind. Zum Beispiel ist 1e6 * n größer als 0,0001 * n^2 für alle n <1e5. – Gene

0

Siehe folgende Matlab Testskript, die Determinanten von beliebigen quadratische Matrizen berechnet (Vergleiche mit Matlab eingebauten Funktion ist ebenfalls enthalten):

nMin = 2; % Start with 2-by-2 matrices 
nMax = 50; % Quit with 50-by-50 matrices 
nTests = 10000; 
detsOfL = NaN*zeros(nTests, nMax - nMin + 1); 
detsOfA = NaN*zeros(nTests, nMax - nMin + 1); 
disp(' '); 
for n = nMin:nMax 
    tStart = tic; 
    for j = 1:nTests 
     A = randn(n, n); 
     detA1 = det(A); % Matlab's built-in function 
     if n == 1 
      detsOfL(j, 1) = 1; 
      detsOfA(j, 1) = A; 
      continue; % Trivial case => Quick return 
     end 
     [L, U, P] = lu(A); 
     PtL = P'*L; 
     realEigenvaluesOfPtL = real(eig(PtL)); 
     if min(prod(realEigenvaluesOfPtL)) < 0 % det(L) is always +1 or -1 
      detL = -1; 
     else 
      detL = 1; 
     end 
     detU = prod(diag(U)); 
     detA2 = detL * detU; % Determinant of A using LU decomposition 
     if detA1 ~= detA2 
      error(['Determinant computation failed at n = ' num2str(n) ', j = ' num2str(j)]); 
     end 
     detsOfL(j, n - nMin + 1) = detL; 
     detsOfA(j, n - nMin + 1) = detA2; 
    end 
    tElapsed = toc(tStart); 
    disp(sprintf('Determinant computation was successful for n = %d!! Elapsed time was %.3f seconds', n, tElapsed)); 
end 
disp(' '); 
Verwandte Themen