El principal caballo de trabajo detrás del cálculo de SVD es el algoritmo QR . Habiendo dicho que hay muchos algoritmos diferentes para el cálculo de la descomposición de valor singular de un genérico -by- N matriz A . Un gran esquema sobre el problema disponible aquí (de la documentación del MKL de Intel ) es el siguiente:MNA
Como puede ver, dependiendo de su caso de uso, existen diferentes enfoques (las convenciones de nomenclatura de rutina se pueden encontrar aquí ). Esto se debe a que, por ejemplo, hay formas matriciales en las que una reducción de Householder puede ser más costosa que una rotación de Givens (por nombrar dos formas "obvias" de obtener QR). Una referencia estándar sobre el tema son los cálculos matriciales de Golub y Van Loan (sugeriría usar al menos la 3a edición). También he encontrado Å. Los métodos numéricos de Björck para problemas de mínimos cuadrados son un recurso muy bueno al respecto; Si bien SVD no es el foco principal del libro, ayuda a contextualizar el uso.
Si tengo que darle un consejo general al respecto , no intente escribir sus propios algoritmos SVD a menos que ya haya tomado con éxito un par de clases sobre álgebra lineal numérica y sepa lo que está haciendo. Sé que suena contra-intuitivo, pero realmente, hay una tonelada de cosas que pueden salir mal y terminas con (en el mejor de los casos) implementaciones subóptimas (si no está mal). Hay algunas suites gratuitas muy buenas sobre el tema (por ejemplo , Eigen , Armadillo y Trilinos, por nombrar algunas).