En primer lugar, permítanme ofrecer una derivación puramente matemática, y luego intentaremos abordar el problema del almacenamiento una vez que obtenga respuestas a las preguntas que planteé en los comentarios anteriores. Editaré esta respuesta según sea necesario.
Desde A es simétrica y definida positiva, admite una factorización Cholesky A=LLT , donde L es triangular inferior; y A=L−TL−1 . Definamos M=L−1 que también es una matriz triangular inferior, por lo que A−1=MTM ; y dejar que mk denotan el k columna de M .
Además, usted dice que B es simétrica con dos elementos no nulos. Esto significa que B puede adoptar una de estas dos formas: B=α(eieTj+ejeTi)orB=αeieTi+βejeTj donde ek es un vector con un uno en el k y ceros en el resto. Consideremos por un momento la primera forma: Tr(A−1B)=αTr(A−1(eieTj+ejeTi))=αTr(A−1eieTj)+αTr(A−1ejeTi)=αeTjA−1ei+αeTiA−1ej=2α[A−1]ij=2αeTjMTMei=2α⟨mi,mj⟩ Así que, como puede ver, el trazado requiere exactamente un elemento de A−1 , o el producto interior de dos columnas de M . Una derivación similar para el segundo caso da como resultado Tr(A−1B)=α[A−1]ii+β[A−1]jj+α⟨mi,mi⟩+β⟨mj,mj⟩
Así que espero que ahora quede claro por qué he preguntado: ¿cuántos B ¿hay matrices? ¿Cómo es A ¿Guardado? ¿Qué tipo de operaciones podemos realizar con A ? Estas preguntas son esenciales para determinar qué hacer en este caso. Por ejemplo, si sólo hay un puñado de índices únicos i,j anterior, entonces un enfoque es calcular cada fi≜A−1ei utilizando algún tipo de método iterativo, y luego utilizar eTjA−1eI=eTjfi .
Pero si la mayoría de los índices i=1,2,…,10000 se representan, puede ser más conveniente hacer algún tipo de factorización Cholesky en la matriz. Sí, puede que no tengas suficiente memoria para hacer una en el núcleo factorización. Pero las factorizaciones Cholesky se pueden hacer fuera del núcleo . Esto implica realizar los cálculos en bloques, leer en memoria sólo los datos suficientes para resolver ese bloque concreto y escribir cada bloque en el disco antes de proceder al siguiente.
0 votos
Empieza por descomponer A=LL⊤ utilizando una descomposición Cholesky con L una matriz diagonal inferior, y B=∑eie⊤j con ei un vector unitario con un 1 en el i -y cero en el resto.
0 votos
Cuando dice "un montón de B", ¿de cuántas estamos hablando? Va a ser difícil encontrar una solución que no requiera O(n2) almacenamiento; ciertamente, ni la solución ofrecida a continuación ni la de los comentarios lo evitan.
0 votos
¿Cómo es A ¿se almacena actualmente? En doble precisión requiere 80GiB de memoria (40GiB si se utiliza un formato empaquetado que aprovecha la simetría). ¿Tiene realmente la versión completa de A ¿se almacena en algún lugar, o se determina algorítmicamente?
0 votos
He calculado y almacenado inversiones de matrices densas de 10K x 10K usando MATLAB o C++/LAPACK, y el almacenamiento es de 8 * 10^4 * 10^4 = 800MB (no 80GB), así que si tienes un ordenador decente el almacenamiento no debería ser un problema. Si aprovechas la simetría y usas float en lugar de double el almacenamiento es de sólo 200MB para almacenar los inversos. Usando el comentario de @MichaelC.Grant más abajo parece que no deberías tener problemas.
0 votos
¡Ja, ja! Mi error, creo que hice 100K x 100K en mis cálculos.