Ce qui est une bonne bibliothèque C++ pour les opérations matricielles
J'ai besoin de faire la multiplication sur les matrices. Je suis à la recherche d'une bibliothèque qui peut le faire vite. Je suis à l'aide de Visual C++ 2008 compilateur et j'ai un core i7 860 donc, si la bibliothèque est optimisé pour ma configuration, c'est parfait.
LAPACK+BLAS obtient le plus de choses
OriginalL'auteur user558209 | 2010-12-30
Vous devez vous connecter pour publier un commentaire.
FWIW, Eigen 3 utilise des threads (OpenMP) pour les produits de matrice (en réponse à la déclaration ci-dessus à propos de Eigen pas à l'aide de threads).
OriginalL'auteur
BLAS est, de facto, la norme Fortran pour tous d'algèbre linéaire de base de l'exploitation (essentiellement des multiplications de matrices et de vecteurs). Il existe de nombreuses implémentations disponibles. Par exemple:
Ensuite, vous souhaiterez peut-être utiliser un wrapper C++, par exemple
boost::ublas
.Si vous programmez sur des systèmes distribués, il y a PBLAS et ScaLAPACK qui permettent l'utilisation de la transmission de message pour distribué les opérations d'algèbre linéaire. Sur une machine multicœur, généralement mises en œuvre de BLAS (au moins Intel MKL) utiliser des threads pour assez grand matrices.
Si vous voulez plus avancés des routines d'algèbre linéaire (vecteurs propres, systèmes linéaires, moins carré, ...), puis il y a les autres, de facto, norme Fortran LAPACK. À ma connaissance, il n'y a rien pour l'intégrer élégamment avec le C++, autres que l'appel de la nue-routines Fortran. Vous devez écrire des wrappers pour masquer le Fortran appels et de fournir un type de son-la vérification de la mise en œuvre.
OriginalL'auteur
Regarder dans Eigen. Il devrait avoir tout ce dont vous avez besoin.
Eigen est seulement bon pour les petites matrices. Ne pas utiliser des threads pour les grandes matrices. Mais il utilise SSE2 lorsqu'ils sont disponibles.
Eh bien, leur propre indice de référence présente les différentes... Diable, le filetage peut être mis en œuvre en faisant bloc de produits si vous en avez vraiment besoin.
OriginalL'auteur
J'ai eu une bonne expérience avec de Boost uBLAS. C'est une bonne option si vous utilisez déjà des coup de pouce.
Il utilise tout ce qui BLAS bibliothèque qui est installé sur votre système. Intel fournit un qui utilise des threads et vecteur instructions: google, Intel MKL. Il n'est pas libre.
J'ai eu une expérience terrible avec de Boost uBLAS. Il est entièrement non-intuitif et difficile à comprendre. Par exemple, comment suis-je censé savoir que le vecteur-matrice de la multiplication est effectuée à l'aide de
prod()
-- pourquoi pas un*
opérateur? Aussi, je ne peux même pas multiplier deux vecteurs.OriginalL'auteur
Vous pouvez utiliser le Bibliothèque Scientifique GNU(GSL).
Voici une page décrivant la matrice des opérations disponibles dans la bibliothèque, y compris de multiplication(gsl_matrix_mul_elements()):
http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html
Et voici quelques liens pour vous aider à démarrer avec l'aide de GSL avec visual studio:
http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php
http://www.quantcode.com/modules/smartfaq/faq.php?faqid=33
math-atlas.sourceforge.net/errata.html#gccCrazy
OriginalL'auteur
il ne peut pas la course avec les bibliothèques scientifiques, mais avec visual c++, il est à portée de main
donc, avec cela, vous pouvez facilement prendre la multiplication de matrice obstacle (sur Windows)
GdiPlus De La Matrice De La Documentation
OriginalL'auteur
pour la plus récente version de Visual Studio, vous pouvez utiliser ScaLapack + MKL.
Un exemple de code est fourni ici , avec un tutoriel sur la façon de le faire fonctionner.
http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content
OriginalL'auteur
Il y a une option pour mettre en œuvre vous-même, peut-être en utilisant std::valarray parce que peut être parallélisé en utilisant OpenMP: gcc a certainement une telle version, MSVC++ n'est probablement trop.
Sinon, les astuces suivantes: l'un des matrices doit être transposée. Ensuite, vous avez:
AB[i,j] = Sum(k) A[i,k] B^t [j,k]
où vous êtes à la numérisation de la mémoire contiguë. Si vous avez 8 cœurs, vous pouvez assez facilement diviser la série de [i,j] indices en 8, et de donner à chaque cœur de 1/8 du total des emplois. Pour le rendre encore plus rapide, vous pouvez utiliser le vecteur instructions de multiplication, la plupart des compilateurs fournir une fonction spéciale pour cela. Le résultat ne sera pas aussi rapide qu'une écoute de la bibliothèque, mais il devrait être OK.
Si vous êtes en train de faire plus de calculs tels que le polynôme d'évaluation, un enfilage de l'évaluateur qui a aussi le support des threads (gak, deux types de threads) va faire du bon boulot, même si il ne le fera pas à faible niveau de réglage. Si vous voulez vraiment faire des trucs rapide, vous devez utiliser correctement à l'écoute de la bibliothèque comme Atlas, mais alors, vous n'auriez probablement pas être en cours d'exécution de Windows si vous avez été sérieux au sujet de la CPS.
OriginalL'auteur