2010-11-15 6 views
10

Estoy usando ublas :: Matriz comprimida para trabajar con UMFPACK, un solucionador lineal disperso. Como realizo una simulación, cada vez que el sistema lineal se construye de forma ligeramente diferente puede implicar aumentar/reducir la matriz de coeficientes y algunas multiplicaciones de matrices dispersas. La escala del sistema lineal es alrededor de 25k.¿Hay alguna manera eficiente de cambiar dinámicamente la compress_matrix en boost?

Incluso hay un parche de encuadernación para impulsar el trabajo con UMFPACK, todavía tengo que cambiar la matriz de vez en cuando, a veces incluso averiguar el número de valores distintos de cero llevaría mucho tiempo (idealmente, tengo para dar la cantidad de valores distintos de cero cuando inicializo una matriz). Además, utilizo ublas :: range para anexar columnas/filas dinámicamente.

Entonces mi pregunta es: ¿hay alguna manera eficiente de hacer esto? En este momento es demasiado lento para mí. Transponer una matriz con dimensiones como 15k cuesta casi 6s y agregar aproximadamente 12k filas es rápido (porque supongo que es una matriz principal), pero agregar el mismo número de columnas a la matriz puede costar hasta 20s (supongo que por el mismo razonar como arriba, así que incluso usé una matriz columna-principal, el tiempo total requerido sería el mismo).

Un poco desesperado aquí. Cualquier sugerencia es bienvenida.

Saludos.

+0

Como tenía casi 30 vistas pero no había respuestas, creo que mi pregunta no es muy clara. Así que aquí hay algunos detalles. – He01

+0

Como estoy haciendo simulación, para cada paso de tiempo, he ensamblado un sistema lineal y lo he solucionado, que básicamente es AX = B. Sin embargo, la matriz de coeficientes A generalmente está compuesta por tres matrices. Una matriz de pesos, dos matrices de coeficientes para restricciones blandas y restricciones duras, respectivamente, que no se pueden calcular previamente. (ver el siguiente comentario) – He01

+0

Como resolver el sistema lineal es el resultado de minimizar una función cuadrática en un sentido al menos cuadrado, tengo que hacer una multiplicación matriz-matriz para hacer una matriz T y una multiplicación matriz-vector para hacer B para integrar la matriz de restricción suave el sistema lineal. Luego tengo que agregar la matriz de restricción dura a la parte inferior y a la derecha de T para hacer A. Finalmente, después de que A y B terminen, puedo ingresarlos en UMFPack. (Ver el siguiente comentario) – He01

Respuesta

0

¿Cómo construyes la matriz cada vez? ¿Estás interactuando con algún tipo de software diferente? En este caso, creo que el tiempo dedicado a la interfaz es bastante bajo.

Y usas -DNDEBUG bandera, para uBlas, ¿verdad?

No estoy seguro todavía cuál es el problema ...

mejor, Umut

+0

Hola Umut, gracias por su atención, lo probaré más y trataré de dar una imagen completa aquí. – He01

1

No estoy familiarizado con sus paquetes, pero ¿por qué usted (idealmente) tiene que especificar el número de no cero elementos en tu matriz? ¿No puedes sobreespecificar y luego reducir el tamaño?

También estoy confundido por qué agregar columnas debería costar tanto. Un formato disperso debería ser capaz de manejar eso. Concluiría que una de dos cosas está sucediendo. O bien su matriz se convierte de alguna manera a una matriz no dispersa antes de ser convertida de nuevo (parece horrible e imposible en cualquier paquete decente de matriz dispersa) o el código de inserción es cuadrático porque inserta valores repetidamente, desplazándose sobre todos los demás hora.

Lo último parece probable. Trataría de rodar mi propio código de "insertar columna" que toma la matriz dispersa actual, calcula cuántas entradas más hay, asigna un bloque más grande y las copia secuencialmente, insertando las nuevas columnas sobre la marcha. Esto es lineal, y esencialmente debe ser instantáneo. No sé si eso es suficiente para resolver todo el problema, pero debería ser un comienzo.

Además, si la matriz tiene del orden de 25k entradas, no hay una respuesta razonable de por qué copiarla o transponerla debería tomar más de un par de milisegundos. Creo que es necesario comparar las piezas individuales de este problema y determinar exactamente a dónde va el tiempo, a menos que la solución anterior para agregar las columnas resuelva su problema.

+0

Gracias Dov, he estado muy ocupado desde entonces, dejé el problema ahí por un tiempo. Voy a probar tus sugerencias, pieza por pieza. – He01

+0

Hola Dov, para la parte de transposición, traté de transponer una matriz escasa principal de fila y asignarla a una matriz dispersa mayor de fila, es mucho más lenta que si la asigno a una matriz escasa principal de columna. Supongo que de alguna manera tal vez la representación interna también se modifique al transponer. – He01

0

En lugar de construir A al unir varios conjuntos diferentes de valores, ¿ha considerado mantenerlos en matrices separadas y usar las rutinas de solucionador existentes para construir su propio solucionador global? Básicamente, aplicarías la descomposición adecuada (LU, QR, lo que sea) a una matriz de componentes, ejecuta la actualización/transformación correspondiente en los componentes subsiguientes y repites para cada matriz posterior.Luego, usaría las matrices de componentes factorizados para calcular su solución. Sin embargo, no está claro si la biblioteca con la que ha estado trabajando admitiría esto directamente, o si tendría que escribir algunas/todas las rutinas numéricas usted mismo.

0

¿Has probado Eigen para este tipo de problema? Recientemente completaron el soporte de matrices dispersas.

Cuestiones relacionadas