Cómo aprender cuda en un mes…

…y otros cuentos

Newmat, buena biblioteca para el manejo de matrices en C++

con 4 comentarios

Puede que no sea la mejor, pero he encontrado una gran biblioteca para el manejo de matrices en C++. Todo ha venido porque hasta ahora estaba usando matrices simples 2D y nos ha surgido el problema de que uno de los modelos FEM tenía tantos nodos que una de las matrices que teníamos que usar para simular una deformación llegaba a ocupar 8GB en memoria, lo cual, obviamente, mata la aplicación.

Me habían mencionado la biblioteca LAPACK, pero no he visto que permita almacenar matrices dispersas o simétricas (como es mi caso), aunque sus funciones sí que son capaces de manejar este tipo de matrices, asumo que ignorando aquellas posiciones simétricas o algo así.

He seguido buscando y me he topado con Newmat:

Esta biblioteca C++ está orientada a científicos e ingenieros que necesitan manipular una serie de tipos de matrices usando operaciones estándar. Se ha hecho énfasis en el tipo de operaciones necesarias y cálculos estadísticos como mínimos cuadrados, resolución de sistemas de ecuaciones lineales y eigenvalores.

Por lo que he bajado el código y he empezado a trastear con ello, ha compilado perfectamente en Visual Studio 2008. Crear un nuevo proyecto y añadir los .cpp y .h que se indican en estas instrucciones. Me ha sorprendido que todo funcionara a la primera, en estos casos siempre te falta tal o cual dependencia…

Además, se ejecuta un ejemplo de uso, lo que viene muy bien para comprobar el funcionamiento y ver algo de código siempre es la mejor manera de conocer una herramienta. Hasta me he atrevido a hacer una matriz simétrica e invertirla para ver el funcionamiento, no puede ser más fácil:


SymmetricMatrix SM(2);

SM.Row(1) << 11;
SM.Row(2) << -1 << 22;
SM=SM.i();

cout << "MI MATRIZ PREFERIDA ("<<SM.Storage()<<")\n\n"<<setw(10) << setprecision(5) <<SM<<endl;

El funcionamiento está claro, se crea una matriz simétrica de 2×2 y se rellena. Al ser simétrica, en la fila 1 basta con rellenar el primer valor. Además, con SM.Storage() se puede ver cuántas posiciones en memoria se han reservado, y lo hace optimizando la memoria puesto que para la matriz simétrica va a dar 3 y no 4. Si la imprimiéramos la matriz tendría este aspecto:

11 -1
-1 22

Al invertirla e imprimirla con el cout el resultado es:

 0.09129 0.00415
0.00415 0.04564

¡Fácil y sencillo! Y ahora a darse una vuelta por la documentación y ver todo lo que esta biblioteca permite hacer.

Advertisement

Escrito por cudagpu

24 septiembre 2010 a 12:07

Escrito en Otros cuentos

4 comentarios

Suscríbete a los comentarios mediante RSS.

  1. [...] un comentario » Si bien hablé en otro post sobre la biblioteca Newmat, he seguido buscando alternativas pues Newmat no maneja matrices dispersas. He encontrado tres [...]

  2. [...] un comentario » Si bien anteriormente me entusiasmaron Newmat y MTL4, ninguna de ellas era capaz de resolver lo que necesitaba. La primera no resuelve sistemas y [...]

  3. Nosotros utilizamos Newmat para resolver problemas de estructuras.
    Newmat permite utilizar matrices de miles de elementos (lo hemos chequeado con matrices banda de 9000×9000 y nos ha ido bien)
    Ahora Newmat nos ha fallado para la resolución de una matriz de 18000×18000.
    Si quieres, te cuento nuestra experiencia (muy buena) con Newmat, aunque ahora creo que nos tendremos que pasar al uBLAS+BOOST+CLAPACK (incomparablemente más engorroso de instalar)

    Xabier

    21 octubre 2010 a 15:11

    • Yo al final también me he metido con uBLAS+BOOST+CLAPACK como aparece en una entrada posterior ya que aunque Newmat funciona muy bien y es muy fácil de usar en problemas no muy grandes, yo no descubrí cómo resolver un sistema de ecuaciones directamente (sí para invertirlas, pero no es la resolución directa).

      Además ahora mismo trabajo con sistemas del orden de 30k o 40k ecuaciones y, al ocupar en memoria muchísimo tamaño, el programa no es capaz de continuar.

      Todo esto sería más fácil si consiguiera encontrar alguna biblioteca capaz de almacenar matrices dispersas (BOOST lo es) y de resolver sistemas de ecuaciones con estas matrices (LAPACK no lo es :( ).

      En cualquier caso, si todavía ves esta contestación, sí que me gustaría preguntarte sobre tu experiencia con el trato de matrices de gran tamaño y que sean dispersas. Es el problema principal con el que me estoy topando ahora mismo, resolver un sistema de 40k ecuaciones cuya matriz es dispersa. Necesito una biblioteca que sea capaz de almacenarla de forma dispersa y de resolverla.

      Aún así, para tu problema con 18k ecuaciones, CLAPACK va a irte muy bien y rápido, además te recomiendo que, si tienes tiempo, le eches un vistazo a CULA, te acelerará los cálculos mucho y es muy fácil de usar :D

      cudagpu

      11 noviembre 2010 a 15:05


Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.