2011-01-01 2 views
4

pour commencer, je suis débutant en C++.Lapackpp vs Boost BLAS

Je suis en train d'écrire un programme pour ma thèse de Master dont une partie suppose de résoudre la régression de manière récursive.

Je voudrais résoudre:

Ax = y 

Dans ma vitesse de calcul de cas n'est pas négligeable, c'est ainsi je voudrais savoir si Boost :: BLAS utilisant

x = (A^T A)^{-1}A^Ty 

nécessitera moins temps de calcul puis Lapackpp (j'utilise gentoo).

P.S. J'ai pu trouver au site du projet Lapackpp des documentations de classe mais pas des exemples. Quelqu'un pourrait-il me donne quelques exemples dans le cas où Lapack est plus rapide alors boost :: BLAS

Merci

+0

Les matrices sont denses ou clairsemées, vérifiez les liaisons numériques uBlas, elles ont implémenté de nombreuses fixations AFAIK. Puisque vous essayez d'utiliser lapack, je présume que les matrices sont denses ... Pourquoi nous étranges (A^T A)^{- 1} A^T ?? –

+0

tous les éléments sont différents de zéro et les mesures de covariance doivent être doubles (2x2). Si vous pouviez me dire comment mettre des équations mathématiques dans stackoverflow, je serais plus heureux de changer ma notation (A^TA)^{- 1} A^T) – Eagle

+1

'(A^TA)^{- 1} A^T' est le psudo-inverse de A. Vous voulez probablement utiliser la fonction psudo-inverse qui vient avec la bibliothèque, plutôt que de le calculer avec cette formule. – Alejandro

Répondre

2

l'interface haut niveau et des optimisations bas niveau sont deux choses différentes. LAPACK et uBLAS fournissent une interface de haut niveau et une implémentation de bas niveau non optimisée. Les routines (ou liaisons) de bas niveau optimisées pour le matériel devraient provenir d'ailleurs. Une fois les liaisons fournies, LAPACK et uBLAS peuvent utiliser des routines de bas niveau optimisées au lieu de leurs propres implémentations non optimisées. Par exemple, ATLAS fournit des routines de bas niveau optimisées, mais seulement une interface de haut niveau (niveau 3 BLAS et etc.) limitée. Vous pouvez lier ATLAS à LAPACK. Alors LAPACK utiliserait ATLAS pour le travail de bas niveau. Pensez à LAPACK en tant que cadre supérieur qui délègue du travail technique à des ingénieurs expérimentés (ATLAS). La même chose pour UBLAS. Vous pouvez lier uBLAS et MKL. Le résultat serait une bibliothèque C++ optimisée. Consultez la documentation et utilisez google pour savoir comment le faire.

3

Avez-vous vraiment besoin d'implémenter avec C++? Est-ce que python/numpy serait par exemple une alternative pour vous? Et pour la régression récursive (moindres carrés), je recommanderai de consulter les conférences du professeur Strang sur l'algèbre linéaire et/ou ses livres.

4

Du point de vue de l'analyse numérique, vous ne voulez jamais d'écrire du code qui

  • intervertit Explicitement une matrice ou
  • forme la matrice des équations normales (A^T A) pour une régression

Les deux sont plus de travail et moins précis (et probablement moins stable) que les alternatives qui résolvent directement le même problème. Chaque fois que vous voyez des maths montrant une inversion matricielle, cela devrait être lu pour signifier «résoudre un système d'équations linéaires», ou factoriser la matrice et utiliser la factorisation pour résoudre le système. Les deux BLAS et Lapack ont ​​des routines pour le faire.

De même, pour la régression, appelez une fonction de bibliothèque qui calcule une régression, ou lisez comment le faire vous-même. La méthode des équations normales est le manuel mauvais sens pour le faire.

2

Armadillo enveloppements BLAS et LAPACK dans une interface agréable C++ et fournit les fonctions de Matlab suivantes directement liés à votre problème:

  • solve(), pour résoudre un système d'équations linéaires
  • pinv(), pseudo -inverse (qui utilise SVD en interne)
Questions connexes