Quelle est la fonction LAPACK correspondante derrière Matlab [Q, R, E] = qr (A)?

12

Je tente actuellement de calculer à peu de frais une bonne estimation de rang pour une matrice . Par conséquent, je calcule une décompostion QR pivotante en utilisantA

[Q,R,E]=qr(A)

dans Matlab. J'évalue le rang de utilisantA

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

Cela fonctionne bien et un tracé sur toutes les entrées diagonales de R ressemble à: plot (sort (abs (diag (R)), 1, 'descend'), 'r *')

Si vous portez l'algorithme entier sur C / Fortran, je remplace [Q, R, E] = qr (A) en utilisant DGEQP3 de LAPACK, qui calcule également une décomposition QR pivotante de colonne. Mais si j'utilise la même estimation pour le rang, je me trompe surtout. Le même tracé pour le produit à partir de DGEQP3 ressemble R

La matrice d'entrée est exactement la même pour les deux expériences.

Ma question est maintenant sur quelle fonction LAPACK la décomposition QR pivotante de colonne de Matlab s'appuie-t-elle?

Merci pour toute aide, Grisu

Edit: DGEQPF donne le même mauvais résultat.

Edit2:

Edit3: - En utilisant GDB, j'ai découvert que Matlab 2010b appelle DGEQP3: # 3 0xaa46ce2f dans dgeqp3_ () à partir de /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so Pourquoi est-ce que j'obtiens le mauvais résultat en utilisant LAPACK (3.4.0 inclut les correctifs mentionnés dans la note de travail 176)?

MK aka Grisu
la source
Pouvez-vous provoquer le même comportement avec une matrice plus petite que vous pourriez partager ici?
GertVdE
t -il une structure spéciale? Je veux dire que MATLAB utilise UMFPACK pour l'algèbre linéaire clairsemée mais je ne sais pas quelles sont les bibliothèques d'algèbre linéaire dense sous-jacentes. A
Aron Ahmadia
Est clairsemé? Vous pouvez définir ">> spparms ('spumoni', 1)" et voir que quelque chose appelé "SuiteSparseQR" est utilisé par matlab dans ce cas. A
dranxo
Grisu - J'adorerais regarder ta matrice. Cependant, le lien www-e.uni-magdeburg.de/makoehle/A.mtx.gz n'est plus actif (à l'heure actuelle, de toute façon). Avez-vous un lien actuel vers la matrice? Merci, Les Foster
@LeslieFoster - bienvenue sur scicomp!
Aron Ahmadia

Réponses:

7

Il y a deux problèmes à résoudre ici:

  • Est dense ou clairsemé?A
  • Avez-vous la même pile logicielle que les bibliothèques internes de MATLAB?

Dense ou clairsemé?

MATLAB ne mentionne plus explicitement les routines LAPACK qu'il appelle pour obtenir une factorisation QR si est dense. Si les informations de la documentation de MATLAB R2008b s'appliquent également aux versions ultérieures, MATLAB appelle depuis LAPACK lorsque vous appelez . Si est rare, MATLAB appelle SuiteSparseQR , hors du groupe de Tim Davis, qui est fourni avec UMFPACK dans la bibliothèque SuiteSparse.AADGEQP3[Q,R,E] = qr(A)A

Avez-vous la même pile logicielle que les bibliothèques internes de MATLAB?

Probablement pas, ce qui peut être l'une des raisons pour lesquelles vous obtenez des résultats différents.

J'ai rencontré ce problème lors du test d'unité d'une bibliothèque que j'écrivais et qui utilisait des factorisations QR. J'ai utilisé MATLAB pour prototyper mon travail et j'ai obtenu des résultats différents de ceux utilisant LAPACK ou NumPy. Pour autant que je sache, comme MathWorks ne facilite pas la recherche de ces informations, MATLAB utilise un verson de LAPACK au plus tôt en version 3.1.1 et la bibliothèque MKL BLAS d'Intel (pour Windows, Intel Mac et Linux) version 9.1 ou supérieur (voir ici ). Je n'ai rien trouvé sur la version de SuiteSparse MATLAB. En fouillant en ligne ou en consultant les fichiers de bibliothèque de votre système, vous pourrez glaner des informations supplémentaires. Vous pouvez essayer de changer les bibliothèques auxquelles MATLAB est lié afin de pouvoir comparer avec les mêmes bibliothèques à travers les progiciels; Eric Chu fournit une belle rédactionqui montre au moins comment vous pouvez remplacer la bibliothèque BLAS de MATLAB par la vôtre (bien sûr, vous le faites à vos risques et périls). Il suggère que vous pouvez également faire la même chose avec LAPACK. Il peut même être possible de remplacer la version de SuiteSparse que MATLAB utilise par votre propre version.

Les versions de LAPACK changent, ainsi que les versions de BLAS; ils peuvent utiliser des algorithmes différents d'une version à l'autre ou des conventions de classement différentes, même si avec orthogonal et est triangulaire supérieur, quelle que soit la version. Ces changements rendent la reproductibilité un défi. Même la tolérance que vous utilisez pour votre détermination de rang numérique est un appel au jugement; vous semblez utiliser une tolérance standard.Q RA=QRQR

J'ai fini par utiliser NumPy pour prototyper mes résultats pour la factorisation QR, car il utilise les bibliothèques système BLAS et LAPACK. NumPy et SciPy ne remplacent pas MATLAB, car les deux bibliothèques combinées manquent de certaines fonctionnalités de MATLAB, mais pour cette tâche d'algèbre linéaire particulière, Python + NumPy + SciPy + Matplotlib devrait bien fonctionner.

Geoff Oxberry
la source
Obtenir la même pile logicielle que Matlab est impossible je pense. L'utilisation d'un autre environnement pour le prototypage n'est pas non plus souhaitée. Le problème est que le code fonctionne correctement dans Matlab, mais pas en C.
MK aka Grisu
@Grisu: Je pense qu'il serait très difficile d'obtenir la même pile logicielle, à moins d'essayer de créer un lien dans leurs bibliothèques. Ce qui me dérange, c'est comment vous savez que le résultat dans MATLAB est correct et que le résultat en C est faux. S'agit-il d'une sorte de matrice de test qui a des propriétés connues? Plus précisément, AronAhmadia a raison; au-delà de la réplication de l'architecture et de la pile logicielle, vous ne pouvez pas vous attendre à obtenir les mêmes résultats avec un algorithme instable. On m'a essentiellement dit la même chose dans les forums MATLAB il y a deux ans.
Geoff Oxberry
À mon avis, le QR n'est pas instable. Je ne peux pas vérifier directement quelle décomposition QR est correcte, mais à partir du rang et de la matrice Q, je calcule un projecteur et là, je peux facilement vérifier si les résultats sont bons ou mauvais et celui de Matlab sont bons. Mais j'essaie de créer des liens avec les bibliothèques Matlab.
MK aka Grisu
@Grisu: Il y a une différence nette entre de bons résultats et des résultats corrects. J'ai récemment mis en œuvre un calcul incorrect qui a rendu mes résultats magnifiques. Néanmoins, le calcul était erroné et le calcul correct a rendu mes résultats moins impressionnants (mais heureusement, illustre que mes résultats sont corrects). Essayez-vous de calculer un projecteur orthogonal ou un projecteur oblique? (Je demande parce que des parties importantes de ma thèse sont sur des projecteurs obliques.)
Geoff Oxberry
1
@GeoffOxberry: fwiw, sur ma version de MATLAB, je peux appeler internal.matlab.language.versionPlugins.blaset internal.matlab.language.versionPlugins.lapackobtenir les versions BLAS et LAPACK
Amro
6

Voir la page de Leslie Foster sur les logiciels révélateurs de rang . Voir également cette note de travail LAPACK analysant les échecs des QR révélateurs de rangxGEQP3 .

Vous devriez être en mesure de savoir quelles routines MATLAB utilise en définissant des points d'arrêt dans un débogueur et en examinant la pile. La dernière fois que j'ai regardé, il y a plusieurs années, MATLAB a utilisé des bibliothèques partagées, auquel cas les noms des symboles ne peuvent pas être supprimés, vous verrez donc les noms des fonctions sur la pile des appels (mais pas les arguments car ils ne conservent définitivement pas les informations de débogage).

Jed Brown
la source
La page sur les logiciels révélateurs de rang n'a pas aidé. La procédure RRQR décrite il y a eu la première chose que j'utilise dans mon idée, mais elle donne des résultats encore pires que l'idée de pivotement de colonne.
MK aka Grisu
2
@Grisu - Cela aurait dû vous aider. L' xGEQP3algorithme n'est pas complètement sûr pour révéler le rang. Si vous voulez garantir que vous obtenez le bon résultat, vous devez utiliser le SVD ou un QR plus sûr tel que xGEQPXou xGEQPY. Vous ne pouvez pas vous attendre à ce qu'un algorithme instable renvoie le même résultat sur différentes architectures ou dans différentes implémentations (MATLAB utilise probablement un LAPACK plus ancien).
Aron Ahmadia
Je sais que le GEQP3 n'est pas révélateur de rang, mais il donne des résultats plus corrects que les sous-programmes RRQR. Utiliser un SVD est trop cher dans mon algorithme externe. Je parlerai également à l'un des auteurs de LAWN-176 et il pense que cette erreur n'est pas couverte par le bogue. J'ai également essayé DGEQPF / DGEQP3 de LAPACK 3.0.0 avec les mêmes résultats.
MK aka Grisu