2010-02-08 16 views
8

Sto cercando una buona libreria C++ (nel migliore dei casi mantenuta attivamente). Quindi dovrebbe essere un modello, perché voglio usare un complesso di razionali come tipo numerico. Le matrici con cui ho a che fare sono principalmente sparse e unitarie.Migliore libreria Matrix C++ per matrici unitarie sparse

Potete per favore suggerire le librerie e anche dare una piccola spiegazione del perché usarle, perché so come trovarle, ma non posso davvero decidere cosa è adatto per me perché mi manca l'esperienza con loro.

EDIT:

Le principali operazioni sto occupando sono moltiplicazione matriciale, moltiplicazione scalare con un vettore e prodotto Kronecker. La dimensione delle matrici è esponenziale e voglio almeno essere in grado di gestire matrici fino a 1024x1024 voci.

+0

A cosa serve la libreria Matrix? Algebra lineare di base, risolutori o ...? Quanto sono grandi le tue matrici? – stephan

+0

La maggior parte delle volte eseguo la moltiplicazione della matrice, la moltiplicazione scalare e utilizzo del prodotto kronecker. Le matrici possono essere piuttosto piccole, almeno voglio essere in grado di gestire matrici 1024x1024. –

risposta

10

Molte persone che fanno cose matrice "seria", si basano su BLAS, aggiungendo LAPACK/ATLAS (matrici normali) o UMFPACK (matrici sparse) per la matematica più avanzata. Il motivo è che questo codice è ben testato, stabile, affidabile e abbastanza veloce. Inoltre, puoi acquistarli direttamente da un fornitore (ad esempio Intel MKL) ottimizzato per la tua architettura, ma anche ottenerli gratuitamente. uBLAS menzionato in Manuel's answer è probabilmente l'implementazione standard di BLAS C++. E se hai bisogno di qualcosa come LAPACK in seguito, ci sono bindings per farlo.

Tuttavia, nessuna di queste librerie standard (BLAS/LAPACK/ATLAS o uBLAS + bindings + LAPACK/ATLAS) spunta la casella per essere basata su modelli e facile da usare (a meno che uBLAS non sia tutto ciò di cui avrete bisogno). In realtà, devo ammettere che tendo a chiamare l'interfaccia C/Fortran direttamente quando utilizzo un'implementazione BLAS/LAPACK, poiché spesso non vedo molti vantaggi aggiuntivi nella combinazione uBLAS + binding.

Se ho bisogno di una libreria di matrice C++ per uso generico, semplice da usare, tendo a utilizzare Eigen (in passato utilizzavo lo NewMat). Vantaggi:

  • abbastanza veloce su architettura Intel, probabilmente il più veloce per le matrici più piccole
  • bella interfaccia
  • quasi tutto ciò che ci si aspetta da una libreria di matrice
  • è possibile aggiungere facilmente new types

Svantaggi (IMO):

  • single processor [Modifica: parzialmente risolto in Eigen 3.0]
  • più lento per matrici più grandi e alcuni matematici avanzati rispetto ad ATLAS o Intel MKL (ad es. Decomposizione LU) [Modifica: anche migliorata in Eigen 3.0]
  • solo supporto sperimentale per matrici sparse [Modifica: migliorata nella prossima versione 3.1].

Edit: L'imminente Eigen 3.1 permette alcune funzioni di utilizzare il processore Intel MKL (o qualsiasi altra applicazione/LAPACK BLAS).

+1

Un ovvio vantaggio di un wrapper C++ è il guadagno di prestazioni fornito dai modelli di espressione – Manuel

+0

@Manuel: agree. Evitare i temp è la principale promessa delle librerie di template matrix come http://www.oonumerics.org/blitz/, http://www.osl.iu.edu/research/mtl/, ecc. Ma puoi fare la maggior parte di questo anche nel codice C, poiché le routine BLAS non copiano le matrici ma funzionano sul posto dove possibile. – stephan

+0

puoi risparmiare un po 'di tempo facendo tutto a posto, ma ci sono altre cose che i modelli di espressione ottimizzano. Ad esempio, in una libreria C se si aggiunge (A, aggiungi (B, aggiungi (C, D)), allora i risultati intermedi devono essere calcolati, e ogni passo comporta un ciclo, quindi in totale si hanno 3 cicli. Con i modelli di espressione il risultato viene valutato solo una volta: 1 ciclo. – Manuel

4

Boost uBLAS, perché ha superato il filtro Boost.

Esistono alcune librerie modello che supportano le matrici sparse, quindi è davvero difficile trovare una motivazione migliore se non si è più specifici delle proprie esigenze.

1

Provare anche MLT e HASEM Libreria Matrix C++. L'ultimo è molto ben documentato.

Problemi correlati