Extraindo a diagonal de uma matriz aproximadamente diagonal quando não sabemos suas entradas

8

Qual é uma boa maneira de extrair a diagonal de uma matriz simétrica que já é quase diagonal, mas onde você não possui os elementos da matriz (apenas a capacidade de aplicá-la a vetores)?

Outras restrições são: (1) aplicar a matriz n-por-n n-vezes para construir explicitamente a diagonal seria proibitivamente caro e (2) os pequenos elementos da diagonal são importantes além dos grandes.

Aqui está uma imagem de exemplo do tipo de matriz da qual desejo extrair a diagonal (em um caso de teste em pequena escala):

insira a descrição da imagem aqui

Nick Alger
fonte

Respostas:

9

Vou responder minha própria pergunta, pois o método a seguir parece ser muito eficaz. Estou fazendo uma resposta para que as pessoas possam votar de forma positiva ou negativa, independentemente da pergunta, se acham que é bom ou ruim.

Resposta: use a sondagem aleatória da matriz aplicada à diagonal da matriz.

ω 1 , Q 2 , . . , Ω kAω1,ω2,..,ωkAAω1,Aω2,...,Aωk

mindiagonal D||Dω1Aω1||2+||Dω2Aω2||2+...+||DωkAωk||2.

O mínimo tem a fórmula exata,

di=ω1iAω11+ω2iAω2i...+ωkiAωki(ω1i)2+(ω2i)2+...+(ωki)2.

Código Matlab, por exemplo:

omegas = randn(16,3); 
dprobe=sum(omegas.*(A*omegas),2)./sum(omegas.^2,2);

Na minha matriz de exemplo, com 3 vetores de sondagem, a diagonal exata e a diagonal sondada são comparadas da seguinte forma:

[dprobe, diag(A)]

ans =

1.0e+04 *

2.3297    2.4985
0.4596    0.4921
0.1322    0.0897
0.2838    0.1764
0.0989    0.0999
0.0106    0.0071
0.0068    0.0068
0.0469    0.0571
0.0070    0.0070
0.0355    0.0372
0.0059    0.0060
0.0071    0.0064
0.0067    0.0067
0.0026    0.0021
0.0012    0.0012
0.0015    0.0013

Atualização: Eu tenho experimentado aplicar essas idéias a matrizes de bloco simétricas, pois uma matriz com a qual estou trabalhando é quase diagonal de bloco em uma base semelhante a uma wavelet. Parece funcionar muito bem para a construção de pré-condicionadores, desde que a matriz seja "dominante na diagonal do bloco" (a definição é um pouco complicada), e desde que você simetrize os blocos reconstruídos dos mínimos quadrados.

Lembre-se de que uma matriz particionada nos blocos é dominante na diagonal do bloco se Ai,j

||Ai,i1||1j||Ai,j||.

Dados os aleatórios gaussianos como acima, procuramos encontrar a seguinte reconstrução diagonal do bloco dos mínimos quadrados:ω

minblock diagonals B||Bω1Aω1||2+||Bω2Aω2||2+...+||BωkAωk||2.

Após algumas manipulações de produto tensorial, você pode encontrar a fórmula exata para o 'ésimo bloco , resolvendo os problemas locais:lB~(l)

B~(l)=[(Aω1)(l)ω1(l)T+...+(Aωk)(l)ωk(l)T][ω1(l)ω1(l)T+...+ωk(l)ωk(l)T]1,

onde e são as partes de e correspondentes aos índices do 'ésimo bloco. ω ( l ) i A ω i ω i l(Aωi)(l)ωi(l)Aωiωil

Se eu apenas usar esses , o pré-condicionamento parecerá muito ruim, mas se eu simetrizar da seguinte maneira,B~

B(l)=(B~(l)+B~(l)T)/2,

nas minhas experiências, torna-se quase tão bom quanto se eu tivesse usado os verdadeiros blocos diagonais (geralmente melhores!). Aqui está um exemplo de matriz em imagens, insira a descrição da imagem aqui

Nick Alger
fonte
3
Não hesite em responder sua própria pergunta. Este é exatamente o tipo de coisa que queremos no SciComp (eu já fiz). Você pode esperar por aceitar sua própria resposta, caso uma resposta melhor apareça. É muito melhor responder sua própria pergunta (quando você tem uma resposta) do que deixá-la sem resposta; incentivamos todos os usuários a seguir seu exemplo, se possível.
Geoff Oxberry
Ok, fico feliz em ouvir isso! Vou esperar por alguns dias, caso alguém tenha uma resposta melhor.
Nick Alger