La rutina QR de LAPACK almacena Q como reflectores de cabeza de familia. Escala el vector de reflexión con , por lo que el primer elemento del resultado se convierte en , por lo que no tiene que almacenarse. Y almacena un vector separado , que contiene los factores de escala necesarios. Entonces una matriz reflectora es así:
donde no está normalizado. Mientras que, en los libros de texto, la matriz reflectora es
donde está normalizado.
¿Por qué LAPACK escala con , en lugar de normalizarlo?
(La razón de mi pregunta es que estoy escribiendo una rutina QR y SVD, y me gustaría saber la razón de esta decisión, si necesito seguirla o no)
fuente
No tiene que almacenar , puede volver a calcularlo desde el resto del vector. (Puede calcular desde las otras entradas también en la versión normalizada, pero es claramente un cálculo inestable debido a esas sustracciones).τ v1
En realidad, puede reutilizar la parte triangular inferior de para almacenar , de modo que la factorización se calcule completamente en el lugar. Lapack se preocupa mucho por estas versiones in situ de algoritmos.R v2,...vn
fuente
Mi sugerencia se basa en la documentación para Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Parece que los valores en y por encima de la diagonal de la salida almacenan R, por lo que solo queda un triángulo inferior para Q. Parece natural usar almacenamiento adicional para los factores de escala.
fuente