2009-11-04 25 views
7

¿Cuál es una buena representación de matrices en Clojure? Estoy interesado en lidiar con matrices densas de números de coma flotante. La representación de la "lista de listas" me viene a la mente, pero ¿hay algo mejor?Clojure Matrix Representation

Algunos criterios para una buena representación incluyen:

  • Eficiencia: No van a ser utilizados para el procesamiento constante de grandes conjuntos de datos, pero no quieren pasar horas cálculo de los resultados que se podrían haber hecho en minutos con un mejor diseño.
  • Interoperabilidad de Java: Sería bueno pasar la información de ida y vuelta entre los dos idiomas fácilmente.
  • Paralelización fácil: si puedo usar todos los núcleos disponibles simplemente reemplazando map con pmap, sería agradable.
  • Respecto al uso de reduce: Parece que muchos de los cálculos que estoy haciendo funcionan muy bien con reduce.
  • Posibilidad de representar líneas de escaneo de imágenes en filas de matrices: No es realmente muy importante, pero sería bueno tenerlas.

¿Alguna idea?

+0

¿Qué tipo de operaciones qué quiere hacer con estas matrices? Representarlos como una lista de listas será una elección decente para algunas operaciones, pero te matará si necesitas acceder a los elementos arbitraray de la matriz con frecuencia. – Pillsy

Respuesta

10

Incanter proporciona un contenedor alrededor de algunos de Parallel Colt, que incluye lo que parece ser una implementación bastante decente de matrices densas paralelas y rápidas que interactúan con las bibliotecas basadas en seq de Clojure. No lo he usado, pero debería ser lo que estás buscando.

Example.

+1

Nota: Esta respuesta ahora está desactualizada. Incanter ahora usa Clatrix, y hay nuevas implementaciones de matriz más avanzadas disponibles (ver 'core.matrix' y sus diversas implementaciones, por ejemplo' vectorz-clj'. – mikera

-1

No soy un experto, pero aquí es mi opinión de todos modos :)

de lista de listas es probablemente el lenguaje más natural Clojure para representar matrices. Esta estructura también se presta muy bien para mapear/reducir tipos de operaciones. Clojure también es bastante eficiente en el manejo de secuencias, probablemente mejor que la mayoría de las alternativas.

No puedo asegurarlo, pero creo que he visto a Clojure trabajando con 3 o con todas mis 4 CPUs en programas que escribí que eran funcionales pero no intentaban ser paralelos. Sospecho que el compilador está encontrando algunas oportunidades para el procesamiento paralelo por sí mismo.

Creo que los tipos de secuencia creados por Clojure funcionarán como listas en Java, o al menos serán Iterables. Probablemente sea lo suficientemente bueno para lo que desee, aunque puede tener problemas si trata de tratar esas estructuras como modificables en Java.

Se accede mejor a las listas secuencialmente. Si planea saltar mucho en la matriz, un vector de vectores puede serle un poco mejor, en cuanto a rendimiento. Sospecho que late usando la función nth.

Como antiguo programador de C, consideré brevemente que podría implementar su matriz como una estructura unidimensional (es decir, una secuencia recta o mejor un vector), y hacer sus propios cálculos de índice para encontrar el elemento correcto. Puede usar la función de partición para recorrerla ... bueno, eso podría funcionar, pero sospecho que hay muy buenas razones para no hacerlo.

2

Actualmente estoy usando el enfoque de lista de listas en cryptovide porque es muy importante para esta aplicación mantener las cosas vagas. También estoy considerando cambiar a un enfoque más eficiente siempre que mantenga al menos la representación exterior vago.

0

Rich Hickey's Clojure es un Lisp basado en JVM que representa PersistentVector (no una PersistentList) con un árbol de 32 direcciones.

Si desea escribir su propia matriz Tipo i usaría PersistentVector ; de lo contrario, la mejor opción es usar Parallel Colt con Incanter.

5

Estoy escribiendo una biblioteca matricial que envuelve jblas llamada, tentativamente, Clatrix. Le faltan muchas características que aún quiero agregar, pero tiene la mayoría de lo que podría estar buscando. Eche un vistazo, http://github.com/tel/clatrix.

0

Hace poco escribí un código que necesitaba matemáticas matriciales, e inicialmente usé vector-de-vectores, map & reducir, pero encontré el código resultante difícil de entender cuando volví a él (soy nuevo en la mente de Clojure) . Incanter hizo el mismo código muy escueto, fácil de entender (operaciones de matriz estándar) y mucho más rápido.

4

Mira la propuesta core.matrix + implementación experimental aquí:

https://github.com/mikera/matrix-api

primeros días en el momento de la escritura, pero vale la pena mantener un ojo en.

+2

A partir de marzo de 2014, he desarrollado esto en un sistema de programación de matriz bastante completo llamado 'core.matrix' – mikera

0

las respuestas pueden necesitar ser actualizadas a los 8 años. Una búsqueda rápida en Google muestra que si necesita ser compatible con Clojure core.matrix API, puede usar core.matrix en sí mismo u otras implementaciones como vectorz-clj.

Además me pareció Neanderthal que está optimizado para la GPU