Estou trabalhando em uma biblioteca de matriz somente de cabeçalho para fornecer um grau razoável de capacidade de álgebra linear em um pacote o mais simples possível e estou tentando pesquisar o que o estado da arte atual está re: computando o SVD de um matriz complexa.
Estou fazendo uma decomposição em duas fases, bidiagonalização seguida de cálculo de valor singular. No momento, estou usando o método de proprietário para a bidiagonalização (acredito que o LAPACK também use isso), e acho que é tão bom quanto é atualmente (a menos que alguém conheça um algoritmo para isso ..) .
O cálculo do valor singular é o próximo na minha lista, e estou um pouco fora do circuito sobre quais são os algoritmos comuns para fazer isso. Li aqui que a pesquisa estava caminhando para um método de iteração inversa que garante ortogonalidade com complexidade . Eu estaria interessado em ouvir sobre esse ou outros avanços.
fonte
Respostas:
"Algoritmos aleatórios" recentemente se tornaram bastante populares para svds parciais. Uma implementação apenas de cabeçalho pode ser baixada aqui: http://code.google.com/p/redsvd/
Uma revisão dos métodos atuais pode ser encontrada aqui: http://arxiv.org/abs/0909.4061
Para svds completos, não tenho certeza se você pode fazer melhor que o Household.
fonte
(Eu queria fazer apenas alguns comentários, já que não tenho tempo para escrever detalhes, mas ficou muito grande para a caixa de comentários.)
A parte "valor singular" do algoritmo, por outro lado, vem do algoritmo de diferença diferencial de quociente (deslocada) (dqd (s)) , que é o culminar de trabalhos anteriores de Fernando, Parlett , Demmel e Kahan (com inspiração Heinz Rutishauser).
Como você deve saber, os métodos SVD geralmente procedem primeiro à decomposição bidiagonal antes que os valores singulares sejam obtidos da matriz bidiagonal. Infelizmente, não estou muito atualizado sobre o melhor método atual para a decomposição bidiagonal do front-end; Por último, verifiquei que o método usual é começar com a decomposição QR com o pivô da coluna e depois aplicar transformações ortogonais apropriadamente ao fator triangular para finalmente obter a decomposição bidiagonal.
Entendo que tenho sido minucioso com os detalhes; Vou tentar aprofundar essa resposta assim que tiver acesso à minha biblioteca ...
fonte
Existem as bibliotecas PROPACK e nu-TRLan.
http://soi.stanford.edu/~rmunk/PROPACK/
http://crd-legacy.lbl.gov/~kewu/trlan/
fonte