2011-03-04 9 views
12

¿Qué necesito? [Una lista desordenada]¿Qué implementación de matriz haskell usar? ¿Cuáles son los pros y contras de cada

  • MUY fácil paralelización
  • apoyo para el mapa, filtra etc.
  • capacidad de realizar cálculos basados ​​matriz eficientemente, como A = B + C, tipo de como MATLAB matrices.
  • Generación del código SIMD. Supongo que esto está fuera de discusión en el futuro cercano para cualquier cosa, pero bueno, puedo preguntar :)
  • El soporte para matrices debería estar ahí como mínimo, las dimensiones más altas son de menor prioridad en este momento.
  • capacidad para obtener un puntero y crear uno desde un puntero C.
  • Asistencia de otras bibliotecas. IE, enlaces a populares paquetes matemáticos C, i/o en disco o imágenes si las matrices son 2D

¿Qué es lo que veo?

  • Paquete de matriz en haskell-platform. Es el bendito y puede hacerlo en paralelo
  • Data.Vector. Tiene fusión de bucle, pero no en plataforma, por lo que su madurez es desconocida para mí.
  • paquete de reparación, contribuido por el equipo de DPH, pero no funciona bien con cualquier ghc estable hoy.
  • Mucha variación en el nivel de soporte para implementaciones de matriz. Por ejemplo, there doesn't seem es una manera fácil de volcar un vector 2D en un archivo de imagen. IOW, la comunidad haskell aparentemente no se ha conformado con una implementación de matriz.

Así que por favor, ayúdame a elegir.

EDITAR A = B + C se refiere a un elemento sabia Además, y no muestra la concatenación

+0

[cons] (http://en.wikipedia.org/wiki/Cons) – nmichaels

+0

Espere, ¿no son sus requisitos pedir una lista * ordenado *? No veo cómo 'A = B + C' podría tener sentido en una lista desordenada a menos que' + 'sea' union'. –

+0

@Dan Creo que lo entendieron mal. La solicitud de 'A = B + C' eficiente se refería a la suma numérica, no a la concatenación. Entonces en Data.Vector eso sería 'zipWith (+)'. –

Respuesta

8

Correcto, la comunidad no se ha conformado con una buena implementación de matriz. Creo que sería una buena presentación de Haskell Prime presentar la Vector API y eliminar Data.Array.

¡El vector es muy maduro! Dispone de:

  • VERY easy parallelization
  • apoyo a map, etc. filter
  • cálculos basados ​​
  • lleva a cabo de manera eficiente gama, al igual que A = B + C (pero no estoy en sintonía con la forma en que haya Matlab)
  • creación
  • vector a partir de un puntero a través de Vector.Storable

no hace:

  • tienen soporte suficiente de otras bibliotecas. IE, enlaces a populares paquetes matemáticos C
  • matrices de soporte, pero puede tener vectores de vectores. Si construyes algunas operaciones matriciales basadas en vectores, entonces quizás puedas subir al hackage como vector-matrix.
  • Generar el código SIMD.

NOTA: Puede activar cadenas de bytes en vectores de lo que sea, por lo que si usted tiene una imagen como una cadena de bytes a continuación, a través de Vector.Storable, usted podría ser capaz de hacer lo que quiera con la imagen como un vector.

+0

El paralelismo parece limitado a vectores encuadrados, perdiendo así una gran parte del beneficio. – rpg

+0

@rpg Sí, hice 'vector-strategies' usando las combinaciones obvias de las herramientas' parallel' y 'deepseq'. No es que puedas obtener vectores paralelos sin un recuadro sin ir a algo respaldado por más investigación (¿está descompuesto?), Las primitivas simplemente no están ahí para respaldar tal trabajo. –

+0

repa está desempaquetado solamente. Ni siquiera revisan los índices antes de hacer referencia a ellos. – rpg

2

Si desea enlaces con bibliotecas de C populares, las mejores opciones son probablemente hmatrix y blas. Blas es solo un enlace a una biblioteca BLAS, mientras que hmatrix proporciona algunas operaciones de nivel superior. También hay muchas bibliotecas construidas sobre hmatrix que ofrecen más funcionalidades. Si estás haciendo algún tipo de trabajo de matriz, eso es con lo que comenzaría.

El paquete de vectores también es una buena opción; es estable y proporciona un excelente rendimiento. Los tipos Data.Vector.Storable se representan como matrices C, por lo que es trivial interactuar con ellos a otras bibliotecas C. El mayor inconveniente es que no hay soporte de matriz, por lo que tendrías que hacer eso tú mismo.

En cuanto a la exportación a un formato de imagen, la mayoría de las bibliotecas de imágenes de haskell parecen usar ByteStrings. Puede convertir a ByteString o vincularse a una biblioteca de C que haga lo que desee. Si encuentra una biblioteca de Haskell que hace lo que desea, debería ser lo suficientemente fácil para convertir los datos de hmatrix al formato adecuado.

+0

¿hmatrix acepta Data.Vector? Tiene un Data.Packed.Vector pero son lo mismo? – rpg

+0

@rpg No pueden ser lo mismo sin 'hmatrix' dependiendo de' vector', entonces no.Si hace clic en la documentación de eglefino, puede ver los enlaces de origen que muestran su 'Vector' [definición] (http://hackage.haskell.org/packages/archive/hmatrix/0.11.0.1/doc/html/src/Data- Packed-Internal-Vector.html # Vector). –

3

(no se me permite hacer comentarios)

rpg: Lo que hmatrix aceptar Data.Vector? Tiene un Data.Packed.Vector pero son lo mismo?

Sí. La última versión de hmatrix usa por defecto Data.Vector.Storable para vectores 1D (anteriormente era opcional). La dependencia del vector no se muestra en Hackage, probablemente porque está en un indicador de configuración.

Para las matrices de compatibilidad LAPACK no son Vector o Vector t, pero se pueden convertir fácilmente (por ejemplo: Data.Vector.fromList . toRows).

+0

Gracias. Eso es muy bueno saber – rpg

Cuestiones relacionadas