Atualização diagonal de uma matriz definida positiva simétrica

19

é umamatriz esparsa n × n simétrica positiva positiva definida (SPD). G é uma matriz diagonal esparsa. n é grande (UMAn×nGn > 10000) e o número de não-zeros no G é geralmente 100 ~ 1000.nG

foi fatorado na forma cholesky comoUMA .euDeuT

Como atualizar e D com eficiência quando A se tornaeuDUMA ?UMA+G


fonte
G tem apenas elementos positivos? Nesse caso, aqui está um limite superior trivial: visualize a atualização diagonal como uma soma das atualizações da classificação um. Existem métodos O (n ^ 2) para calcular a fatoração LDL ^ t de uma atualização de classificação um (a pesquisa do Google fornece exemplos). Sua atualização diagonal será executada em O (rn ^ 2), onde r é o número de elementos diagonais diferentes de zero de G. Dada a natureza específica dessas atualizações, existem atalhos para salvar alguns cálculos, mas não está claro se é possível reduza a ordem abaixo de O (rn ^ 2).
3
Concordo - não acredito que exista alguma maneira de fazer atualizações diagonais em uma fatoração de Cholesky mais rápido do que apenas repetir a fatoração, mas as atualizações de classificação um podem ser feitas em e você só precisa fazer uma para cada diferente de zero na diagonal de L . O(m2)G
Brian Borchers
10
Para e n n z ( G ) na ordem das centenas, que vai ser difícil de vencer refatorando Uma . Se o tamanho de A se tornar muito maior e G for muito esparso, poderá valer a pena. De qualquer forma, as possíveis atualizações e aproximações são abordadas em profundidade. Os sistemas lineares simétricos e lineares simétricos fixos podem ser resolvidos em tempo quadrático após a pré-computação? . n104nnz(G)UMAUMAG
precisa
5
Jed, acho que você deve promover seu comentário para uma resposta aqui.
Michael Grant

Respostas:

3

A versão mais recente do pacote CHOLMOD SuiteSparse (beta 4.4.5) suporta a modificação de uma linha / coluna simétrica (atualização do rank2) para decomposição euDeuT , usando uma API matlab (e C). Eu usei com sucesso em um dos meus projetos.

Você pode usá-lo para fazer atualizações nnz(G) na fatoração. É baseado neste artigo.

Portanto, a complexidade será O(nnz(G)nnz(eu)) . Onde nnz(eu) pode ser reduzido significativamente ao usar uma permutação de redução de preenchimento para um A esparsoUMA

O pacote pode ser baixado aqui

Abaixo estão algumas notas que o proprietário do pacote deu (Prof. Tim Davis):

API:

LD = ldlrowmod (LD, k) exclui a linha / coluna k, configurando A (:, k) e A (k, :) para a quinta linha / coluna de identidade.

LD = ldlrowmod (LD, k, C) substitui a enésima linha / coluna de A (que deve ser a enésima linha / coluna de identidade) pela coluna esparsa C.

Complexidade:

A linha adicionar / excluir demora no máximo O(nnz(eu)) , portanto, se nnz(eu) é O(n) , então o tempo é no máximo O(n) .

Permutação de redução de preenchimento:

euDeuTeuDeuTPUMAPTeu

Yuval Atzmon
fonte