Ho bisogno di fare moltiplicazione sulle matrici. Sto cercando una libreria che possa farlo velocemente. Sto usando il compilatore Visual C++ 2008 e ho un core i7 860, quindi se la libreria è ottimizzata per la mia configurazione è perfetta.Che cos'è una buona libreria C++ per le operazioni con le matrici
risposta
Cerca su Eigen. Dovrebbe avere tutto ciò di cui hai bisogno.
La usa le discussioni (se non non è veloce)? – Yttrill
Eigen è adatto solo alle piccole matrici. Non usa thread per matrici più grandi. Ma usa SSE2 quando disponibile. –
Beh, il loro benchmark mostra diversi ... diamine, il threading può essere implementato dall'utente facendo block products se ne hai davvero bisogno. – rubenvb
Ho avuto una buona esperienza con Boost's uBLAS. È una buona opzione se stai già utilizzando Boost.
Utilizza thread (se non non è veloce)? – Yttrill
Utilizza qualsiasi libreria BLAS installata nel sistema. Intel ne fornisce uno che utilizza thread e istruzioni vettoriali: google per Intel MKL. Tuttavia non è gratuito. –
Ho avuto un'esperienza davvero terribile con gli uBLAS di Boost. È completamente non intuitivo e difficile da capire. Per esempio, come dovrei sapere che la moltiplicazione della matrice vettoriale viene eseguita usando 'prod()' - perché non un operatore '*'? Inoltre, non posso nemmeno moltiplicare due vettori. –
È possibile utilizzare lo GNU Scientific Library(GSL).
ecco una pagina che descrive le operazioni con le matrici disponibili nella biblioteca, tra cui la moltiplicazione (gsl_matrix_mul_elements()):
http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html
e qui ci sono alcuni link per iniziare con l'utilizzo di GSL con Visual Studio:
http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php
Davvero? Compilazione del codice Gnu su MSVC++? Voglio dire, se vuoi davvero ottenere prestazioni, userai un BLAS basato su Atlas ma dubito che sarebbe facile costruire su Windows .. :) – Yttrill
http://math-atlas.sourceforge.net/errata.html# gccCrazy –
C'è un'opzione per implementare questo da soli, magari usando std :: valarray perché potrebbe essere parallelo usando OpenMP: gcc ha sicuramente una tale versione, probabilmente anche MSVC++.
Altrimenti, i seguenti trucchi: una delle matrici deve essere trasposta. Poi ci sono:
AB [i, j] = Sum (k) A [i, k] B^t [j, k]
in cui si esegue la scansione memoria contigua. Se hai 8 core puoi facilmente dividere il set di indici [i, j] in 8, e dare ad ogni core 1/8 del lavoro totale. Per renderlo ancora più veloce è possibile utilizzare le istruzioni di moltiplicazione del vettore, la maggior parte dei compilatori fornirà una funzione speciale per questo. Il risultato non sarà veloce come una libreria sintonizzata, ma dovrebbe essere OK.
Se si eseguono calcoli più lunghi come la valutazione polinomiale, un valutatore di thread che ha anche il supporto per i thread (gak, due tipi di thread) farà un buon lavoro anche se non eseguirà l'accordatura a basso livello. Se vuoi veramente fare cose velocemente, devi usare una libreria opportunamente sintonizzata come Atlas, ma probabilmente non avresti Windows in esecuzione se fossi serio su HPC.
Non implementare mai operazioni a matrice da soli. Utilizzare un'implementazione BLAS. –
non può correre con le biblioteche scientifiche, ma con Visual C++ che è a portata di mano
#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;
int main()
{
ULONG_PTR gpToken = 0;
GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL);
//lib inited
Matrix A;
A.Translate(10,20);
Matrix B;
B.Rotate(35.0);
A.Multiply(&B);
if (A.IsInvertible())
A.Invert();
if (!A.IsIdentity())
A.RotateAt(120.0, PointF(10,10));
//getting values
REAL elements[6];
A.GetElements(elements);
//lib stopped
GdiplusShutdown(gpToken);
return 0;
}
Quindi, con questo si può facilmente prendere l'ostacolo moltiplicazione di matrici (su Windows)
BLAS è uno standard Fortran di fatto per tutte le operazioni di algebra lineare di base (essenzialmente moltiplicazioni di matrici e vettori). Sono disponibili numerose implementazioni. Ad esempio:
- ATLAS è gratuito e presumibilmente auto-ottimizzante. Hai bisogno di compilare te stesso però.
- Goto BLAS è gestito da Kazushige Goto al TACC. È molto bravo a ottenere l'ultima performance dai processori moderni. Però è solo per uso accademico.
- Intel MKL fornisce BLAS ottimizzato per processori Intel. Non è gratuito, anche per uso accademico.
Quindi, è possibile utilizzare un wrapper C++, ad esempio boost::ublas
.
Se si programma su sistemi distribuiti, esistono PBLAS e ScaLAPACK che consentono l'utilizzo del trasferimento di messaggi per operazioni di algebra lineare distribuita. Su una macchina multicore, solitamente le implementazioni di BLAS (almeno Intel MKL) utilizzano thread per matrici abbastanza grandi.
Se si desidera più routine di algebra lineare avanzate (autovalori, sistemi lineari, meno quadrati, ...), quindi c'è l'altro standard FORTRAN LAPACK de facto. Per quanto ne so, non c'è nulla che lo integri elegantemente con C++ oltre a chiamare le semplici routine di Fortran. Devi scrivere alcuni wrapper per nascondere le chiamate Fortran e fornire un'implementazione audio per il controllo dei tipi.
FWIW, Eigen 3 utilizza thread (OpenMP) per prodotti a matrice (in risposta alla dichiarazione precedente su Eigen che non utilizza thread).
per la versione più recente di Visual Studio, è possibile utilizzare ScaLapack + MKL. Viene fornito un esempio di codice here, con un tutorial su come eseguirlo.
http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content
- 1. Quanto è buona la libreria GPU OpenCV per le operazioni con le matrici?
- 2. Esiste una libreria per quaternioni e matrici con tutte le operazioni standard?
- 3. Che cos'è una buona libreria di manipolazione delle matrici disponibile per C?
- 4. operazioni con le matrici e aggiunta di componenti mediante data.table
- 5. Esiste una buona libreria PHP per vettori e matrici?
- 6. Una buona libreria per la matematica 3D in C#?
- 7. Migliore libreria Matrix C++ per matrici unitarie sparse
- 8. Una buona fonte per le librerie Lisp?
- 9. Esiste una classe C++ che implementa le operazioni con le permutazioni?
- 10. Buona libreria HTTP per Objective-C/iPhone?
- 11. Buona libreria di programmazione lineare per C#?
- 12. Dll Importa C++ in C# con le matrici
- 13. Buona libreria di stampa per C?
- 14. Buona tecnica per le connessioni con PostgreSQL
- 15. Una buona API per le citazioni famose
- 16. Che cos'è una buona libreria grafica vettoriale multipiattaforma per C/C++?
- 17. Operazioni booleane su matrici scipy.sparse
- 18. Due operazioni in un ciclo contro due cicli che eseguono le stesse operazioni una per ciclo
- 19. C'è una buona libreria di layout grafico richiamabile da C++?
- 20. Quali sono le migliori pratiche per le librerie di classi che utilizzano l'integrazione delle dipendenze per le operazioni interne?
- 21. Che cos'è una buona libreria di ottimizzazione convessa?
- 22. Buona libreria di manipolazione di stringhe C++
- 23. C'è una buona libreria yaml per Android?
- 24. Esiste una buona libreria Python in grado di analizzare C++?
- 25. Buona libreria SIMD portatile
- 26. Polpa di pitone usando con le matrici
- 27. Per quanto riguarda le prestazioni, quanto è buona la libreria Guava?
- 28. Julia: confronti booleani con le matrici
- 29. Python usa split con le matrici
- 30. Buona libreria di connettori C/C++ per PostgreSQL
LAPACK + BLAS ottiene la maggior parte delle cose fatte –