Extracción de diagonal de una matriz aproximadamente diagonal cuando no conocemos sus entradas

8

¿Cuál es una buena manera de extraer la diagonal de una matriz simétrica que ya es casi diagonal, pero donde no tiene los elementos de la matriz (solo la capacidad de aplicarla a los vectores)?

Otras restricciones son, (1) aplicar la matriz n-por-n n veces para construir explícitamente la diagonal sería prohibitivamente costoso, y (2) los elementos pequeños de la diagonal son importantes además de los elementos grandes.

Aquí hay una imagen de ejemplo del tipo de matriz de la que quiero extraer la diagonal (en un caso de prueba a pequeña escala):

ingrese la descripción de la imagen aquí

Nick Alger
fuente

Respuestas:

9

Voy a responder mi propia pregunta ya que el siguiente método parece ser muy efectivo. Lo estoy respondiendo para que la gente pueda votar a favor o en contra, independientemente de la pregunta, si piensan que es bueno o malo.

Respuesta: use una prueba de matriz aleatoria aplicada a la diagonal de la matriz.

UNAω1,ω2,..,ωkUNAUNAω1,UNAω2,...,UNAωk

mindiagonal reEl |El |reω1-UNAω1El |El |2+El |El |reω2-UNAω2El |El |2+...+El |El |reωk-UNAωkEl |El |2.

El mínimo tiene la fórmula exacta,

reyo=ω1yoUNAω11+ω2yoUNAω2yo...+ωkyoUNAωkyo(ω1yo)2+(ω2yo)2+...+(ωkyo)2.

Código de Matlab, por ejemplo:

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

En mi matriz de ejemplo, con 3 vectores de sondeo, la diagonal exacta y la diagonal sondada se comparan de la siguiente manera:

[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

Actualización: He estado experimentando aplicando estas ideas a las matrices de bloques simétricos, ya que una matriz con la que estoy trabajando es casi diagonal al bloque en forma de wavelet. Parece funcionar bastante bien para construir preacondicionadores, siempre y cuando la matriz sea "bloque-diagonalmente dominante" (la definición es un poco complicada), y siempre que simimetrice los bloques reconstruidos de mínimos cuadrados.

Recuerde que una matriz dividida en bloques es dominante en diagonal en bloque si UNAyo,j

El |El |UNAyo,yo-1El |El |-1jEl |El |UNAyo,jEl |El |.

Dados ' aleatorios gaussianos como los anteriores, buscamos encontrar la siguiente reconstrucción diagonal del bloque de mínimos cuadrados:ω

minsiloCk reyounasolonorteunals siEl |El |siω1-UNAω1El |El |2+El |El |siω2-UNAω2El |El |2+...+El |El |siωk-UNAωkEl |El |2.

Después de algunas manipulaciones de tensor de producto, puede encontrar la fórmula exacta para el bloque 'th resolviendo los problemas locales:lsi~(l)

si~(l)=[(UNAω1)(l)ω1(l)T+...+(UNAωk)(l)ωk(l)T][ω1(l)ω1(l)T+...+ωk(l)ωk(l)T]-1,

donde y son las porciones de y correspondientes a los índices del bloque ' .(UNAωyo)(l)ωyo(l)UNAωyoωyol

Si solo uso estos 's, el preacondicionamiento parece ser bastante malo, pero si simulo de la siguiente manera,si~

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

en mis experimentos se vuelve casi tan bueno como si hubiera usado los bloques diagonales verdaderos (¡a menudo mejor!). Aquí hay un ejemplo de matriz en imágenes, ingrese la descripción de la imagen aquí

Nick Alger
fuente
3
No dudes en responder tu propia pregunta. Este es exactamente el tipo de cosas que queremos en SciComp (lo he hecho). Es posible que desee esperar para aceptar su propia respuesta, en caso de que aparezca una mejor respuesta. Es mucho mejor responder su propia pregunta (cuando tiene una respuesta) que dejarla sin respuesta; Recomendamos a todos los usuarios que sigan su ejemplo, si es posible.
Geoff Oxberry
Ok, me alegra escuchar eso! Esperaré a aceptar por unos días en caso de que alguien más tenga una mejor respuesta.
Nick Alger