La routine QR de LAPACK stocke Q en tant que réflecteurs domestiques. Il met à l'échelle le vecteur de réflexion avec , de sorte que le premier élément du résultat devient , il n'a donc pas besoin d'être stocké. Et il stocke un vecteur séparé , qui contient les facteurs d'échelle nécessaires. Donc, une matrice de réflecteur est comme ceci:
où n'est pas normalisé. Alors que, dans les manuels, la matrice du réflecteur est
où est normalisé.
Pourquoi LAPACK met-il à l'échelle avec , au lieu de le normaliser?
(La raison de ma question est que j'écris une routine QR et SVD, et j'aimerais connaître la raison de cette décision, si je dois la suivre ou non)
Vous n'avez pas besoin de stocker , vous pouvez le recalculer à partir du reste du vecteur. (Vous pouvez recalculer partir des autres entrées également dans la version normalisée, mais il s'agit clairement d'un calcul instable en raison de ces soustractions.)τ v1
En fait, vous pouvez réutiliser la partie triangulaire inférieure de pour stocker , afin que la factorisation soit entièrement calculée en place. Lapack se soucie beaucoup de ces versions d'algorithmes en place.R v2,...vn
la source
Ma suggestion est basée sur la documentation d'Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Il ressemble aux valeurs sur et au-dessus de la diagonale du magasin de sortie R, il ne reste donc que le triangle inférieur pour Q. Il semble naturel d'utiliser un stockage supplémentaire pour les facteurs d'échelle.
la source