In maniera molto simile a quanto è stato fatto per creare una funzione per eseguire velocemente moltiplicazioni tra grandi matrici con l'algoritmo di Strassen (vedi post precedente), scriviamo adesso funzioni per calcolare velocemente l'inversa di una matrice.
Per evitare di scrivere pagine e pagine di commenti e formule, come ho fatto per la moltiplicazione tra matrici, questa volta posto direttamente il codice delle funzioni create (il ragionamento che sta alla base è del tutto analogo). Copiate e incollate tutto il codice per poterlo visualizzare correttamente.
Proviamo a fare qualche prova. Innanzitutto controlliamo che la funzione esegua correttamente i calcoli, confrontandoli con il risultato della funzione standard di R (solve):
La funzione esegue correttamente i calcoli. Esiste però un problema di approssimazione, per cui le prime due funzioni riportano il risultato identico fino alla ottava cifra decimale, mentre il secondo fino alla sesta. Più che un problema di calcoli, è un problema di espressione dei numeri in formato binario e 32 bit, che determina questi errori.
Ora analizziamo i tempi di esecuzione. Riporto in tabella il risultato ottenuto eseguendo il seguente codice:
Time computation
A <- matrix(trunc(rnorm(512*512)*100), 512,512) system.time(solve(A)) system.time(strassenInv(A)) system.time(strassenInv2(A)) system.time(strassenInv3(A))
A <- matrix(trunc(rnorm(1024*1024)*100), 1024,1024) system.time(solve(A)) system.time(strassenInv(A)) system.time(strassenInv2(A)) system.time(strassenInv3(A))
A <- matrix(trunc(rnorm(2048*2048)*100), 2048,2048) system.time(solve(A)) system.time(strassenInv(A)) system.time(strassenInv2(A)) system.time(strassenInv3(A))
A <- matrix(trunc(rnorm(4096*4096)*100), 4096,4096) system.time(solve(A)) system.time(strassenInv(A)) system.time(strassenInv2(A)) system.time(strassenInv3(A))
I risultati sono abbastanza evidenti, e utilizzando una modificazione dell'algoritmo di Strassen per l'inversione di matrici, esiste un effettivo risparmio di tempo.
Nuovamente valgono le due raccomandazioni già fatte: - il codice è da migliorare; se qualcuno vuole aiutarmi, sarò lieto di aggiornare il mio codice - se ritenete utili queste funzioni e le usate per qualche lavoro, una citazione è sempre gradita
Nessun commento:
Posta un commento