2016-05-14 10 views
5

Sono abituato a Eigen per quasi tutta la mia opera di algebra lineare matematica. Recentemente, ho scoperto che Boost fornisce anche una libreria di classi template C++ che fornisce la libreria di algebra lineare di base (Boost::uBLAS). Questo mi ha fatto chiedere se riesco a ottenere tutto il mio lavoro basandomi solo su boost dato che è già una libreria importante per il mio codice.Boost :: uBLAS vs Eigen

Uno sguardo più da vicino sia in realtà non mi ha fatto una distinzione più chiara tra di loro:

  • boost :: uBLAS:

uBLAS fornisce classi su modelli C++ per denso, dell'unità e vettori sparsi, matrici dense, identitarie, triangolari, a bande, simmetriche, eremitiche e sparse. Le viste in vettori e matrici possono essere costruite tramite intervalli, sezioni, classi dell'adattatore e matrici indirette. La libreria copre le solite operazioni di algebra lineare di base su vettori e matrici: riduzioni come norme diverse, addizione e sottrazione di vettori e matrici e moltiplicazione con prodotti scalari, interni ed esterni di vettori, prodotti a matrice e matrice e risolutore triangolare.

...

  • Eigen:

Supporta tutte le dimensioni della matrice, dalle piccole matrici di dimensione fissa per arbitrariamente grandi matrici dense, e anche matrici sparse.

Supporta tutti i tipi numerici standard, inclusi std :: complex, interi ed è facilmente estendibile ai tipi numerici personalizzati.

Supporta varie scomposizioni della matrice e caratteristiche geometriche.

L'ecosistema di moduli non supportati offre molte funzioni specializzate come l'ottimizzazione non lineare, le funzioni di matrice, un risolutore polinomiale, FFT e molto altro.

...

Qualcuno ha una migliore idea circa le loro differenze fondamentali e sulla cui base possiamo scegliere tra loro?

risposta

2

Scegliere Eigen se si cura le prestazioni e il guadagno di prestazioni introdotte dai modelli di espressione e scegliere uBlas se si desidera solo imparare i modelli di espressione.

http://eigen.tuxfamily.org/index.php?title=Benchmark

+0

Eigen utilizza anche modelli di espressioni. –

+0

@quant_dev l'ho reso più chiaro. – kangshiyin

+0

Si noti che questi benchmark sono piuttosto vecchi (dal 2011) e non indipendenti. –

1

Ho appena fatto un confronto tra la complessità temporale boost e Eigen per calcoli di matrice abbastanza banale. Questi risultati, per quanto limitati, sembrano indicare che l'aumento è un'alternativa molto migliore. Avevo un codice FEM che esegue le parti di pre-elaborazione (impostando le matrici degli elementi e unendole insieme). Quindi, naturalmente, questo comporterebbe un sacco di allocazioni di memoria.

enter image description here

ho scritto pezzi identici di codici con Boost e Eigen su C++ (gcc 5.4.0, ubuntu 16.04, Intel Quad Core i3, 2.40 GHz, RAM: 4 Gb) e li eseguiva separatamente per le diverse dimensioni dei nodi (N) e il tempo calcolato usando l'utility linux cl. Per quanto mi riguarda, ho deciso di procedere con il mio codice in Boost.

+0

Le allocazioni di memoria influiscono sul risultato? –

+4

Quale operazione è quella che stai eseguendo qui? – myradio

+1

Dovresti assolutamente mostrare la fonte di questo benchmark! – Synxis