2012-02-08 30 views
14

Actualmente estoy creando prototipos de algunos algoritmos en Matlab que se basan en la matriz, DSP, estadísticas y funcionalidad de análisis de imágenes.¿Qué biblioteca numérica usar para trasladar de Matlab a C++?

Algunos ejemplos de lo que puede necesitar:

  • vectores propios
  • convolución en 2D y 3D
  • FFT
  • Short Time Fourier Transform
  • transformada de Hilbert
  • polinomios
  • Chebyshev
  • filtro de paso bajo
  • números aleatorios gaussianos multivariantes
  • KMeans

Más adelante voy a necesitar para implementar estos algoritmos en C++.

También tengo una licencia para Recetas Numéricas en C++, que me gusta porque está bien documentada y tiene una gran variedad de algoritmos. También encontré una clase que ayuda a envolver las funciones NR en MEX: nr3matlab.h. Entonces, usando esta clase debería ser capaz de generar envoltorios que me permitan llamar a funciones NR de Matlab. Esto es muy importante para mí, de modo que pueda verificar cada paso al pasar de Matlab a C++. Sin embargo Recetas Numéricas en C++ tienen algunas deficiencias importantes:

  • algoritmos implementados de una manera sencilla, y no necesariamente muy eficientes manner
  • sin rosca

por lo tanto, estoy pensando en utilizar otra biblioteca numérica. La biblioteca ideal debe:

  • sea tan amplia en alcance y la funcionalidad como sea posible
  • estar bien documentado
  • (tener soporte comercial)
  • ya han hecho envolturas Matlab
  • muy robustos
  • muy eficiente
  • roscado
  • (tener una implementación GPU que se puede convertir en lugar de la CPU con un "switch")

qué biblioteca numérica (bibliotecas) sugeriría usted?

¡Gracias de antemano por cualquier respuesta!

+2

Enumere algunas funciones/algoritmos específicos que está buscando, en este momento esta pregunta es demasiado vaga. –

+0

Gracias. Enumerado algunos que saltaron a la mente. – Andy

+0

Solo pensé en mencionar para referencia futura que preguntas como esta encuentran un buen hogar en [scicomp.SE]. –

Respuesta

3

En realidad debería echar un vistazo a openCV.

Aunque su primer objetivo es el procesamiento de visión/imagen por computadora, esta biblioteca tiene muchas herramientas de álgebra lineal (casi todo lo que usted solicita). Al principio, esta biblioteca ha sido implementada por Intel, con un gran enfoque en el rendimiento. Puede manejar múltiples hilos, IPP, ... La sintaxis es bastante más fácil de usar que la biblioteca habitual de C++.

Deberías echarle un vistazo a este cheat sheet. La sintaxis ha cambiado desde la versión 2.0 para imitar a matlab. Esta biblioteca se usa ampliamente y está muy activa (última gran actualización, agosto de 2011).

+0

Me sorprende que haya sugerido OpenCV en lugar de Eigen. – CroCo

3

NAG podría ser una buena opción. Un gran número de instituciones financieras lo utilizan en sus bibliotecas matemáticas. Sin embargo, no tengo una implementación de GPU la última vez que la utilicé.

+0

Gracias. Se ve muy bien. ¿Sabes cuánto cuesta aproximadamente 1 licencia de desarrollador? – Andy

+0

@ Andreas Werner Paulsen: Google descubrió esto. http://www.eduserv.org.uk/lns/agreements/nag/nag-pricing. No estoy seguro de cuánto te ayuda. Las instituciones educativas obtienen precios preferenciales, parece desde su sitio web. – DumbCoder

4

Tiene una larga lista de requisitos, y puede ser un reto cubrirlos todos con una sola biblioteca.

Para transiciones generales de Matlab a C++, puedo recomendar Armadillo que es una biblioteca de plantillas de C++ con un enfoque en álgebra lineal --- y un enfoque dado para facilitar la escritura de expresiones similares a Matlab. Tiene un muy buen rendimiento, está muy bien documentado y se mantiene activamente. Podría comenzar allí e intentar completar las piezas faltantes para su tarea.

+0

Gracias. También se ve muy bien. Me gusta especialmente que esté basado en Lapack a la vez que proporciona una interfaz mucho más fácil y similar a Matlab. – Andy

+0

Encima de BLAS, que es una interfaz. Por lo tanto, siempre puede ingresar un BLAS más rápido en lugar de un LAPACK predeterminado. Y Conrad conoce sus cosas y es un placer trabajar con él. –

2

También existe la biblioteca Eigen: http://eigen.tuxfamily.org pero se usa principalmente como parte de un marco más grande. Ofrece álgebra básica (y un poco más compleja)

+0

Es un tour de force de la creación de plantillas C++, pero las compilaciones son lentas y los mensajes de error pueden ser terriblemente largos (terrible * y * largo). – denis

Cuestiones relacionadas