A rotina QR do LAPACK armazena Q como refletores domésticos. Ele escala o vetor de reflexão com , para que o primeiro elemento do resultado se torne , para que não precise ser armazenado. E ele armazena um vetor separado , que contém os fatores de escala necessários. Portanto, uma matriz refletora é assim:
onde não é normalizado. Enquanto, nos livros didáticos, a matriz refletora é
onde é normalizado.
Por que o LAPACK dimensiona com , em vez de normalizá-lo?
O armazenamento necessário é o mesmo (em vez de , precisa ser armazenado) e, em seguida, a aplicação de pode ser feita mais rapidamente, pois não há necessidade de multiplicar com (a multiplicação com na versão do livro pode ser otimizada, se, em vez da normalização simples, for dimensionado por ).
(O motivo da minha pergunta é que estou escrevendo uma rotina QR e SVD e gostaria de saber o motivo dessa decisão, se preciso segui-la ou não)
fonte
Você não precisa armazenar , pode recalculá-lo do resto do vetor. (Você pode recalcular a das outras entradas também na versão normalizada, mas é claramente uma computação instável por causa dessas subtrações.)τ v1
Na verdade, você pode reutilizar a parte triangular inferior de para armazenar , para que a fatoração seja computada totalmente no local. Lapack se importa muito com essas versões in-loco de algoritmos.R v2,...vn
fonte
Minha sugestão é baseada na documentação do Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Parece com os valores acima e na diagonal do armazenamento de saída R, portanto, resta apenas triângulo inferior para Q. Parece natural usar armazenamento adicional para os fatores de escala.
fonte