Problemas de memoria y tiempo al dividir dos matrices

tengo dos matrices dispersas en matlab

M1 de tamaño 9milx1.8millones y M2 de tamaño 1.8millonesx1.8millones.

Ahora necesito calcular la expresión.

M1/M2

y me tomo como una hora. ¿Es normal? ¿Hay alguna manera eficiente en matlab para que pueda superar este problema de tiempo? Quiero decir que es mucho y si hago varias iteraciones, seguirá tomando 1 hora. ¿Cualquier sugerencia?

preguntado el 12 de junio de 12 a las 11:06

Para las matrices generales M1 y M2, probablemente no haya nada que pueda hacer. Si sabe algo acerca de la estructura dispersa de las matrices, es posible que pueda hacer muchas cosas. También puede expresar las iteraciones como actualizaciones en lugar de resolver la respuesta completa. ¿Puede proporcionar más detalles sobre las matrices y sobre sus iteraciones? -

Estás tratando con algunas entidades decentemente grandes aquí. 1 hora suena bien. ¿Puede ser más rápido? Seguro. ¿Puede ser más lento? Seguro. -

Uhm, 1.8 millones por 1.8 millones, asumiendo variables de 64 bits, hace 23 TB para M2y 120 GB para M1 y tu resultado. ¿Es una matriz lógica, tal vez? -

Es más como una matriz tridiagonal -

@LucaGeretti Dijo que eran matrices dispersas, así que dudo M1 and M2 ocupar tanto espacio. -

1 Respuestas

Un cálculo rápido de la parte posterior del sobre basado en la suposición de que se usa algún método iterativo como el gradiente conjugado o el método Kaczmarz, y conectar los tamaños me hace creer que una hora no está mal.

Debido a la tridiagonalidad de la matriz que se "invierte" (si no explícitamente), ambos métodos van a tomar una cantidad de instrucciones cerca de "algún factor escalar cercano a la unidad" multiplicado por ~9000 multiplicado por 1.8e6 multiplicado por "el número de iteraciones necesarios para la convergencia". El producto de las dos cosas entre comillas es probablemente alrededor de 50 (mínimo) a alrededor de 1000 (máximo). No los elegí para hacer que sus matemáticas funcionen, se trata de lo que esperaría de haber hecho esto. Si asume alrededor de 1e9 instrucciones por segundo (lo que no tiene mucho en cuenta para el acceso a la memoria, etc.), obtiene alrededor de 13 minutos a alrededor de 4.5 horas.

Por lo tanto, parece estar en el rango correcto para un algoritmo que explota la escasez.

Podría explotarlo mejor usted mismo si conoce la estructura, pero probablemente no mucho.

Tenga en cuenta que esto no quiere decir que se puedan lograr 13 minutos.

Editar: una nota al margen, no estoy seguro de qué se está usando, pero asumí métodos iterativos. También es posible que se utilicen métodos directos. (como se explica aquí). Estos métodos pueden ser eficiente para sistemas dispersos si explota la escasez correctamente. Es muy posible que Matlab los esté usando de manera predeterminada, pero vale la pena investigar qué está haciendo Matlab en su caso.

En mi experiencia limitada, los métodos iterativos generalmente se preferían a los métodos directos a medida que el tamaño de los sistemas aumenta (el suyo es grande). Nuestros sistemas lineales también resultaron ser tridiagonales en bloque, como suele ocurrir en el procesamiento de imágenes.

Respondido el 13 de junio de 12 a las 14:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.