Je travaille sur une bibliothèque de matrices uniquement en-tête pour fournir un certain degré raisonnable de capacité d'algèbre linéaire dans un package aussi simple que possible, et j'essaie de faire le point sur l'état actuel de la technique: le calcul de la SVD d'un matrice complexe.
Je fais une décomposition en deux phases, une bidiagonalisation suivie d'un calcul de valeurs singulières. En ce moment, j'utilise la méthode des ménages pour la bidiagonalisation (je crois que LAPACK l'utilise également), et je pense que c'est à peu près aussi bon qu'il l'est actuellement (à moins que quelqu'un ne connaisse un algorithme pour ça..).
Le calcul des valeurs singulières est le suivant sur ma liste, et je suis un peu en dehors de la boucle sur les algorithmes courants pour ce faire. J'ai lu ici que la recherche se dirigeait vers une méthode d'itération inverse qui garantit l'orthogonalité avec la complexité . Je serais intéressé d'en entendre parler ou d'autres avancées.
Réponses:
Les "algorithmes randomisés" sont récemment devenus très populaires pour les SVD partiels. Une implémentation uniquement en-tête peut être téléchargée ici: http://code.google.com/p/redsvd/
Une revue des méthodes actuelles peut être trouvée ici: http://arxiv.org/abs/0909.4061
Pour les svd complets, je ne sais pas si vous pouvez faire mieux que Householder.
la source
(Je voulais juste faire quelques commentaires car je n'ai pas le temps d'écrire les détails, mais c'est devenu assez gros pour la zone de commentaire.)
Je pense que ce serait l' algorithme MRRR (plusieurs représentations relativement robustes) de Dhillon et Parlett. Ceci est enraciné dans les travaux antérieurs de Fernando, qui à son tour a été inspiré par un problème posé par Jim Wilkinson dans son livre monumental sur les problèmes de valeurs propres. La partie "itération inverse" pour obtenir des vecteurs singuliers est enracinée dans le concept de "factorisations torsadées" par Fernando , qui utilise des matrices de factorisation en et décompositions .U D U ⊤LDL⊤ UDU⊤
La partie "valeur singulière" de l'algorithme, d'autre part, provient de l'algorithme (décalé) de différence de quotient différentiel (dqd (s)) , qui est l'aboutissement de travaux antérieurs de Fernando, Parlett , Demmel et Kahan (avec inspiration de Heinz Rutishauser).
Comme vous le savez peut-être, les méthodes SVD procèdent généralement à une décomposition bidiagonale avant que les valeurs singulières soient obtenues à partir de la matrice bidiagonale. Malheureusement, je ne suis pas trop à jour sur la meilleure méthode actuelle pour la décomposition bidiagonale frontale; la dernière fois que j'ai vérifié, la méthode habituelle est de commencer par la décomposition QR avec pivotement des colonnes, puis d'appliquer les transformations orthogonales de manière appropriée au facteur triangulaire pour finalement obtenir la décomposition bidiagonale.
Je comprends que j'ai été maigre avec les détails; J'essaierai d'étoffer cette réponse une fois que j'aurai accès à ma bibliothèque ...
la source
Il existe les bibliothèques PROPACK et nu-TRLan.
http://soi.stanford.edu/~rmunk/PROPACK/
http://crd-legacy.lbl.gov/~kewu/trlan/
la source