Estoy trabajando en una biblioteca matricial de solo encabezado para proporcionar un grado razonable de capacidad de álgebra lineal en un paquete lo más simple posible, y estoy tratando de estudiar cuál es el estado actual de la técnica: calcular la SVD de un matriz compleja
Estoy haciendo una descomposición de dos fases, bidiagonalización seguida de cálculo de valor singular. En este momento estoy usando el método de jefe de familia para la bidiagonalización (creo que LAPACK también lo usa), y creo que es tan bueno como lo es actualmente (a menos que alguien sepa de un algoritmo para ello..).
El cálculo del valor singular es el siguiente en mi lista, y estoy un poco fuera de lugar en cuanto a cuáles son los algoritmos comunes para hacer esto. Leí aquí que la investigación se dirigía hacia un método de iteración inversa que garantiza la ortogonalidad con la complejidad . Me interesaría saber sobre ese u otros avances.
Respuestas:
Los "algoritmos aleatorizados" se han vuelto muy populares recientemente para svds parciales. Aquí se puede descargar una implementación de solo encabezado: http://code.google.com/p/redsvd/
Puede encontrar una revisión de los métodos actuales aquí: http://arxiv.org/abs/0909.4061
Para svds completos, no estoy seguro de si puedes hacerlo mejor que Householder.
fuente
(Solo quería hacer algunos comentarios, ya que no tengo tiempo para escribir detalles, pero se hizo bastante grande para el cuadro de comentarios).
Creo que sería el algoritmo MRRR (múltiples representaciones relativamente robustas) de Dhillon y Parlett. Esto se basa en el trabajo anterior de Fernando, que a su vez se inspiró en un problema planteado por Jim Wilkinson en su monumental libro sobre problemas de valores propios. La parte de "iteración inversa" para obtener vectores singulares se basa en el concepto de "factorizaciones retorcidas" de Fernando , que hace uso de las matrices de factorización en y descomposiciones .U D U ⊤LDL⊤ UDU⊤
La porción de "valor singular" del algoritmo, por otro lado, proviene del algoritmo de diferencia de cociente diferencial (desplazado) (dqd (s)) , que es la culminación del trabajo previo de Fernando, Parlett , Demmel y Kahan (con inspiración de Heinz Rutishauser).
Como sabrán, los métodos SVD generalmente proceden primero con una descomposición bidiagonal antes de obtener los valores singulares de la matriz bidiagonal. Lamentablemente, no estoy demasiado actualizado sobre el mejor método actual para la descomposición bidiagonal frontal; La última vez que verifiqué, el método habitual es comenzar con la descomposición QR con el pivote de la columna y luego aplicar las transformaciones ortogonales de manera apropiada al factor triangular para obtener finalmente la descomposición bidiagonal.
Entiendo que he sido escaso con los detalles; Intentaré desarrollar esta respuesta una vez que tenga acceso a mi biblioteca ...
fuente
Existen las bibliotecas PROPACK y nu-TRLan.
http://soi.stanford.edu/~rmunk/PROPACK/
http://crd-legacy.lbl.gov/~kewu/trlan/
fuente