Je suis nouveau en science informatique et j'ai déjà appris des méthodes de base pour l'intégration, l'interpolation, des méthodes comme RK4, Numerov etc. sur c ++ mais récemment mon professeur m'a demandé d'apprendre à utiliser LAPACK pour résoudre des problèmes liés aux matrices. Comme par exemple trouver des valeurs propres d'une matrice complexe. Je n'ai jamais utilisé de bibliothèques tierces et j'écris presque toujours mes propres fonctions. Je fais des recherches depuis plusieurs jours, mais je ne trouve aucun guide amateur pour lapack. Tous sont écrits avec des mots que je ne comprends pas et je ne sais pas pourquoi l'utilisation de fonctions déjà écrites devrait être aussi compliquée. Ils sont pleins de mots comme zgeev, dtrsv, etc. et je suis frustré. Je veux juste coder quelque chose comme ce pseudo-code:
#include <lapack:matrix>
int main(){
LapackComplexMatrix A(n,n);
for...
for...
cin>>A(i,j);
cout<<LapackEigenValues(A);
return 0;
}
Je ne sais pas si je suis stupide ou amateur. Mais encore une fois, cela ne devrait pas être si difficile non? Je ne sais même pas si je dois utiliser LAPACK ou LAPACK ++. (J'écris des codes en c ++ et je ne connais pas Python ou FORTRAN) et comment les installer.
Réponses:
Je vais être en désaccord avec certaines des autres réponses et dire que je pense que trouver comment utiliser LAPACK est important dans le domaine de l'informatique scientifique.
Cependant, il existe une grande courbe d'apprentissage pour utiliser LAPACK. En effet, il est écrit à un niveau très bas. L'inconvénient de cela est qu'il semble très cryptique et peu agréable aux sens. L'avantage est que l'interface est sans ambiguïté et ne change fondamentalement jamais. De plus, les implémentations de LAPACK, telles que la bibliothèque Intel Math Kernel, sont très rapides.
Pour mes propres besoins, j'ai mes propres classes C ++ de niveau supérieur qui s'enroulent autour des sous-programmes LAPACK. De nombreuses bibliothèques scientifiques utilisent également LAPACK en dessous. Parfois, il est plus facile de simplement les utiliser, mais à mon avis, il est très utile de comprendre l'outil en dessous. À cette fin, j'ai fourni un petit exemple de travail écrit en C ++ à l'aide de LAPACK pour vous aider à démarrer. Cela fonctionne dans Ubuntu, avec le
liblapack3
package installé et d'autres packages nécessaires pour la construction. Il peut probablement être utilisé dans la plupart des distributions Linux, mais l'installation de LAPACK et sa liaison peuvent varier.Voici le dossier
test_lapack.cpp
Cela peut être construit en utilisant la ligne de commande
Cela produira un exécutable nommé
test_lapack
. J'ai configuré cela pour lire dans un fichier d'entrée de texte. Voici un fichier nommématrix.txt
contenant une matrice 3x3.Pour exécuter le programme, tapez simplement
sur la ligne de commande, et la sortie doit être
Commentaires:
extern "C"
section en haut et à laquelle j'ai ajouté un trait de soulignementdgeev_
. C'est parce que la bibliothèque a été écrite et construite en Fortran, donc c'est nécessaire pour faire correspondre les symboles lors de la liaison. Cela dépend du compilateur et du système, donc si vous l'utilisez sous Windows, tout devra changer.la source
Je résiste généralement à dire aux gens ce que je pense qu'ils devraient faire plutôt que de répondre à leur question, mais dans ce cas, je vais faire une exception.
Lapack est écrit en FORTRAN et l'API est très semblable à FORTRAN. Il existe une API C pour Lapack qui rend l'interface un peu moins pénible, mais ce ne sera jamais une expérience agréable d'utiliser Lapack à partir de C ++.
Alternativement, il existe une bibliothèque de classes matricielles C ++ appelée Eigen qui possède de nombreuses capacités de Lapack, fournit des performances de calcul comparables aux meilleures implémentations Lapack et est très pratique à utiliser à partir de C ++. En particulier, voici comment votre exemple de code pourrait être écrit en utilisant Eigen
Cet exemple de problème de valeur propre est un cas de test pour la fonction Lapack
dgeev
. Vous pouvez afficher le code FORTRAN et les résultats de cet exemple de problème dgeev et faire vos propres comparaisons.la source
operator,
! Jamais vu cela fait dans la pratique :-)operator,
surcharge est plus intéressante / meilleure qu'elle n'y paraît à première vue. Il est utilisé pour initialiser les matrices. Les entrées qui initialisent la matrice peuvent être des constantes scalaires mais peuvent également être des matrices ou des sous-matrices définies précédemment. Très semblable à MATLAB. J'aurais aimé que ma capacité de programmation en C ++ soit assez bonne pour implémenter quelque chose de sophistiqué moi-même ;-)Voici une autre réponse dans la même veine que ci-dessus.
Vous devriez regarder dans la bibliothèque d'algèbre linéaire Armadillo C ++ .
Avantages:
DGESV
mumbo-jumbo, justeX = solve( A, B )
(bien qu'il y ait une raison derrière ces noms de fonction LAPACK étrangement ...).Voici à quoi ressemblerait le code de @ BillGreene avec Armadillo:
la source