6

Per un documento di ricerca, sono stato assegnato alla ricerca l'algoritmo più veloce per calcolare il determinante di una matrice.Algoritmo più veloce per calcolare il determinante di una matrice?

so già su decomposizione LU e algoritmo Bareiss che sia eseguito in O (n^3), ma dopo aver fatto qualche scavo, sembra che ci siano alcuni algoritmi che corrono da qualche parte tra n^2 e n^3.

Questo source (vedi pagina 113-114) e questo source (vedi pagina 198) dicono che esiste un algoritmo che viene eseguito in O (n^2.376) perché si basa su un algoritmo del Coppersmith-Winograd per moltiplicare le matrici. Tuttavia, non sono stato in grado di trovare dettagli su tale algoritmo.

Le mie domande sono:

  1. Qual è il più veloce creata (non teorico) algoritmo per il calcolo del determinante di una matrice?
  2. Dove posso trovare informazioni su questo algoritmo più veloce?

Grazie mille.

+0

Quanto sono grandi le matrici? Quanti determinanti vuoi calcolare? –

+0

Immagino che le matrici siano molto grandi (N> 22 è probabilmente abbastanza grande?). E quanti? Solo il determinante per la matrice data. Ingresso: 1 Matrix grande Output: il singolo determinato per la matrice di input. –

+0

Anche la stabilità numerica è un problema? – Henry

risposta

4

Credo che l'algoritmo di pratica più veloce (e comunemente usato) sia lo Strassen Algorithm. Puoi trovare spiegazioni su Wikipedia insieme al codice di esempio C.

Gli algoritmi basati su Coppersmith-Winograd's multiplication algorithms sono troppo complessi per essere pratici, sebbene abbiano la migliore complessità asintotica.

+0

Vale la pena notare che il limite corrente è 'O (n^{2.3728639})' ma come dice Sopel, è improbabile che l'esponente più piccolo valga la pena su un calcolo pratico in quanto hanno un fattore costante enorme di fronte. – Hooked

+0

@Sopel Credo che Strassen sia usato per l'inversione della matrice. vedi http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations E per quanto riguarda gli algoritmi basati su Coppersmith-Winograd, hai ragione - ho chiesto al mio professore e ha detto che sono i più veloci, ma sono troppo complessi per essere pratici. Grazie! –

+0

Credo che siano problemi molto simili (lo sto concludendo con l'algoritmo di Coppersmith-Winograd per la moltiplicazione della matrice che può essere trasformato per calcolare i determinanti), ma non ho una grande conoscenza al riguardo, quindi potrei sbagliarmi. – Sopel

2

So che questa non è una risposta diretta per la mia domanda, ma ai fini del completamento del mio documento di ricerca, è sufficiente. Ho appena finito col chiedere il mio professore e io riassumere quello che ha detto:

Sommario:

  • I più veloci algoritmi di matrice moltiplicazione (ad esempio, Coppersmith-Winograd ei miglioramenti più recenti) può essere utilizzato con O (n^~ 2.376) operazioni aritmetiche, ma usa pesanti strumenti matematici e spesso sono poco pratici.
  • LU decomposizione e Bareiss si avvalgono O (n 3 ^) operazioni, ma sono più pratici

In breve, anche se LU decomposizione e Bareiss non sono veloci come gli algoritmi più efficienti, sono più pratici e dovrei concentrare la mia ricerca su questi due.

Grazie per tutti coloro che hanno commentato e aiutato!

+0

È un nit, ma "Decomposizione LU e Bareiss non sono così veloci" non è proprio corretto. Ciò che intendi è "LU Decomposizione e Bareiss non sono così veloci _simptoticamente_". Gli algoritmi asintoticamente superiori hanno costanti così elevate nelle loro effettive funzioni di tempo di esecuzione, che gli algoritmi "più lenti" sono più veloci nella pratica. Ad esempio, 1e6 * n è maggiore di 0.0001 * n^2 per tutto n <1e5. – Gene

0

vedere il seguente script di test Matlab, che calcola determinanti di matrici quadrate arbitrarie (paragoni per la funzione built-in di Matlab è anche incluso):

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(' '); 
Problemi correlati