2010-02-08 21 views
8

Estoy buscando una buena (en el mejor de los casos mantenida activamente) biblioteca de matriz C++. Por lo tanto, debe ser una plantilla, porque quiero usar un complejo de racionales como tipo numérico. Las matrices con las que estoy tratando son principalmente dispersas y unitarias.Mejor biblioteca de matriz C++ para matrices unitarias dispersas

Puede sugerir bibliotecas y también dar una pequeña explicación de por qué usarlas, porque sé cómo encontrarlas, pero realmente no puedo decidir lo que es adecuado para mí porque me falta la experiencia con ellas.

EDIT:

Las principales operaciones que trato son multiplicación de matrices, multiplicación escalar con un vector y producto de Kronecker. El tamaño de las matrices es exponencial y al menos puedo tratar con matrices de hasta 1024x1024 entradas.

+0

¿Para qué necesita la biblioteca de matriz? Álgebra lineal básica, solucionadores, o ...? ¿Qué tan grandes son tus matrices? – stephan

+0

La mayoría de las veces hago multiplicación de matrices, multiplicación escalar y uso el producto kronecker. Las matrices pueden ser bastante pequeñas, al menos quiero poder lidiar con matrices de 1024x1024. –

Respuesta

10

Mucha gente haciendo cosas matriz de "grave", se basan en BLAS, añadiendo LAPACK/ATLAS (matrices normales) o UMFPACK (matrices dispersas) para las matemáticas más avanzadas. La razón es que este código está bien probado, estable, confiable y bastante rápido. Además, puede comprarlos directamente de un proveedor (por ejemplo, Intel MKL) sintonizados con su arquitectura, pero también obtenerlos de forma gratuita. uBLAS mencionado en Manuel's answer es probablemente la implementación estándar de C++ BLAS. Y si necesita algo como LAPACK más adelante, hay bindings para hacerlo.

Sin embargo, ninguna de estas bibliotecas estándar (BLAS/LAPACK/ATLAS o uBLAS + bindings + LAPACK/ATLAS) cumple la función de plantilla y fácil de usar (a menos que uBLAS sea lo único que necesite). De hecho, debo admitir que tiendo a llamar directamente a la interfaz C/Fortran cuando uso una implementación BLAS/LAPACK, ya que a menudo no veo mucha ventaja adicional en la combinación uBLAS + bindings.

Si necesito una biblioteca de matriz de C++ de uso general, fácil de usar, tiendo a usar Eigen (solía usar NewMat en el pasado). Ventajas:

  • bastante rápido en la arquitectura Intel, probablemente la más rápida de las matrices más pequeñas
  • interfaz agradable
  • casi todo lo que se espera de una biblioteca matriz
  • usted puede agregar fácilmente new types

Desventajas (OMI):

  • un solo procesador [Edit: parcialmente fijado en Eigen 3.0]
  • más lento para matrices más grandes y algunas matemáticas avanzadas que ATLAS o Intel MKL (p. Ej. Descomposición de LU) [Edit: también mejorado en Eigen 3.0]
  • único soporte experimental para matrices dispersas [Edición: mejorado en la próxima versión 3.1].

Editar: La próxima Eigen 3.1 permite algunas funciones para utilizar el Intel MKL (o cualquier otra aplicación/LAPACK Blas).

+1

Una ventaja obvia de un contenedor de C++ es la ganancia de rendimiento proporcionada por las plantillas de expresión – Manuel

+0

@Manuel: de acuerdo. Evitar las temperaturas es la principal promesa de las bibliotecas de plantillas de matriz como http://www.oonumerics.org/blitz/, http://www.osl.iu.edu/research/mtl/, etc. Pero puede hacer la mayor parte de esto también en código C, ya que las rutinas BLAS no copian matrices sino que funcionan in situ siempre que sea posible. – stephan

+0

puede ahorrar algunos temporales haciendo todo lo que está en su lugar, pero hay otras cosas que optimizan las plantillas de expresión. Por ejemplo, en una biblioteca C si agrega (A, agregue (B, agregue (C, D))), entonces los resultados intermedios deben ser calculados, y cada paso involucra un ciclo, por lo que en total tiene 3 bucles. Con plantillas de expresión, el resultado solo se evalúa una vez: 1 ciclo. – Manuel

4

Boost uBLAS, porque pasó el filtro Boost.

Existen algunas librerías de plantillas que admiten matrices dispersas, por lo que es realmente difícil encontrar una mejor justificación si no es más específico acerca de sus necesidades.

1

También debe probar MLT y HASEM Matrix C++ Library. El último está muy bien documentado.

Cuestiones relacionadas