Domanda

Che cosa è una buona rappresentazione per le matrici in Clojure?Sono interessato a trattare con un fitto matrici di numeri a virgola mobile.La "lista delle liste" rappresentazione in mente, ma c'è qualcosa di meglio?

Alcuni criteri per una buona rappresentazione sono:

  • Efficienza:Essi non saranno utilizzati per la costante elaborazione di enormi set di dati, ma non voglio passare ore di calcolo del risultato che poteva essere fatto in pochi minuti con un design migliore.
  • Java Interoperabilità:Sarebbe bello per passare i dati avanti e indietro tra le due lingue facilmente.
  • Facile Parallelizzazione:Se posso usare tutti i core disponibili semplicemente sostituendo map con pmap, che sarebbe bello.
  • Suscettibili all'uso di reduce:Sembra che un sacco di calcoli che sto facendo lavorare molto bene con reduce.
  • Capacità di Rappresentare l'Immagine di Linee di Scansione in Righe della Matrice:Non è davvero molto importante, ma sarebbe bello avere.

Ogni pensiero?

È stato utile?

Soluzione

Incanter fornisce un wrapper per alcune delle Colt Parallel , tra cui quello che sembra essere un abbastanza decente attuazione parallela e rapida matrici dense che si interfacciano con le librerie ss-based di Clojure. Io non ho usato, ma dovrebbe essere quello che stai cercando.

Esempio .

Altri suggerimenti

Sto scrivendo un involucro biblioteca matrice jblas chiamata, a titolo di prova, Clatrix. E 'manca un sacco di funzioni ho ancora voglia di aggiungere, ma ha la maggior parte di quello che si potrebbe essere alla ricerca di. Date un'occhiata, http://github.com/tel/clatrix .

Controlla la proposta core.matrix + implementazione sperimentale qui:

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

giorni Molto presto al momento della scrittura, ma vale la pena tenere d'occhio.

Attualmente sto usando l'elenco delle liste approccio in cryptovide perché è molto importante per la questa applicazione per mantenere le cose pigro . Sono anche considerando di passare ad un approccio più efficiente purché mantenuto almeno rappresentazione esteriore artificiale.

Ricca Hickey è Clojure è una JVM a base di Lisp che rappresenta ad un persistent vector (non PersistentList) con 32 ad albero.

Se volete scrivere la vostra propria matrice di Tipo vorrei utilizzare ad un persistent vector altrimenti la scelta migliore è quello di utilizzare in Parallelo Colt con Incanter.

Di recente ho scritto un codice che serve la matematica matrice, e inizialmente ho usato vettore-di-vettori, la mappa e ridurre, ma ha trovato il codice risultante difficile capire quando sono tornato ad esso (Sono nuovo di Clojure mente). Incanter fatto lo stesso codice molto concisa, facile da capire (ops standard delle matrici) e molto molto più veloce.

le risposte possono avere bisogno di essere aggiornato come 8 anni passati. Una veloce ricerca su Google mostra che se avete bisogno di essere compatibile con Clojure core.matrix API, è possibile utilizzare core.matrix stesso o altre implementazioni, come vectorz-CLJ.

Inoltre ho trovato Neanderthal che è ottimizzata per GPU

Non sono un esperto, ma ecco il mio parere comunque:)

list-of-liste è probabilmente il più naturale linguaggio Clojure per rappresentare matrici. Questa struttura si presta anche bene per mappare / ridurre i tipi di operazioni. Clojure è anche piuttosto efficiente nel gestire le sequenze -. Probabilmente meglio della maggior parte delle alternative

Non posso giurare di questo, ma penso che ho visto Clojure di lavoro 3 o tutti e 4 i miei CPU duro sui programmi che ho scritto che erano funzionali nello stile, ma non ha fatto alcun tentativo di essere parallele. Ho il sospetto che il compilatore è trovare qualche opportunità per l'elaborazione parallela da solo.

Credo che i tipi di sequenze create da Clojure lavoreranno come liste in Java, o almeno essere Iterable. Questo è probabilmente abbastanza buono per quello che si vuole, se si può incorrere in problemi se si tenta di trattare quelle strutture come modificabili in Java.

Le liste sono meglio raggiungibili in modo sequenziale. Se hai intenzione di saltare in giro un sacco nella matrice, un vettore-di-vettori può soddisfare un po 'meglio, prestazioni-saggio. Ho il sospetto che batte con il esimo la funzione.

Come un ex programmatore C, ho brevemente considerato che è possibile implementare vostra matrice come una struttura unidimensionale (vale a dire una sequenza diritta o meglio un vettore), e fare i propri calcoli indice di trovare l'elemento giusto. È possibile utilizzare il partizione per scorrere ... beh, che potrebbe essere fatto per lavorare, ma ho il sospetto che ci sono buone ragioni per non farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top