3 votos

Descomposición de valores propios para una matriz muy grande de imágenes médicas (como las coordenadas físicas de píxeles de las imágenes de TC).

<a href="https://scicomp.stackexchange.com/q/37267">Crossposted </a>sobre Ciencia Computacional SE


Estoy tratando de hacer la descomposición de valores propios para una matriz enorme más grande que $78.8 \cdot 10^4 \times 78.8 \cdot 10^4$ para el análisis de imágenes médicas. La matriz no es dispersa y cada elemento de la matriz tiene un valor real. Y, por ejemplo, quiero obtener el primer $20$ vectores propios correspondientes al primer $20$ mayores valores propios.

El ordenador no es capaz de hacer la descomposición de valores propios para la enorme matriz y la memoria se desborda, aunque la configuración de mi ordenador es muy excelente. Escribo los códigos informáticos con lenguaje Python y otros paquetes relacionados (como NumPy, OpenCV, Matplotlib, etc.). ¿Hay alguna otra biblioteca de Python o paquete relacionado que puede hacer la descomposición de valores propios y resolver el problema de cálculo? O, ¿hay algún otro método que pueda resolver este problema con Python?

Ahora me encuentro en una situación difícil y espero que alguien pueda ayudarme. Muchas gracias.

Perdón, escribí mal, la matriz enorme también es simétrica.

0voto

mathreadler Puntos 3517

Sería recomendable un método basado en Krylov, ya que se puede prescindir de las operaciones entre matrices y vectores.

Cualquier método que intente almacenar y manipular matrices reales requerirá demasiada memoria.

Puede obtener más información sobre los métodos de subespacios de Krylov, por ejemplo, en Wikipedia

0voto

CiaranWelsh Puntos 108

Los valores propios de una matriz triangular superior o inferior son las entradas diagonales de la matriz

Así que el problema ahora es cómo convertir tu matriz original en una triangular.

Como tu matriz es enorme, te sugiero una forma casera.
El método más básico consiste en encontrar k factores entre fila j-1 y fila j que hace matrix[j,k]=0 para k<j . Hay mucha literatura al respecto, así que me salto las explicaciones aquí.

La cuestión es que con este sencillo método no tienes que cargar toda la matriz en memoria, sino sólo las dos filas con las que estás trabajando.
Pero debe almacenar las filas modificadas porque se utilizarán en posteriores modificaciones de filas.

Este método es lento, y probablemente propenso a valores erróneos debido a los redondeos en los cálculos. Para que los resultados sean un poco menos erróneos, puedes calcular las triangulaciones superior e inferior y obtener los valores diagonales medios.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X