2009-11-04 7 views
7

Was ist eine gute Darstellung für Matrizen in Clojure? Ich interessiere mich für dichte Matrizen von Gleitkommazahlen. Man denke nur an die Darstellung der "Liste der Listen", aber gibt es da etwas Besseres?Clojure Matrixdarstellung

Einige Kriterien für eine gute Darstellung sind:

  • Effizienz: Sie werden nicht für eine konstante Verarbeitung von großen Datenmengen verwendet werden, aber ich will nicht Stunden Rechenergebnisse verbringen, die getan hätten in Minuten mit einem besseren Design.
  • Java Interoperabilität: Es wäre schön, die Daten einfach zwischen den beiden Sprachen hin und her zu übergeben.
  • Einfache Parallelisierung: Wenn ich alle verfügbaren Kerne einfach durch Ersetzen von map durch pmap verwenden kann, wäre das nett.
  • Geeignet für die Verwendung von reduce: Es scheint, dass viele der Berechnungen, die ich mache, sehr gut mit reduce arbeiten.
  • Fähigkeit, Bildscanzeilen in Matrixzeilen darzustellen: Nicht wirklich sehr wichtig, aber wäre nett zu haben.

Irgendwelche Gedanken?

+0

Welche Art von Operationen mit diesen Matrizen tun Sie tun möchten? Sie als Liste von Listen darzustellen ist eine gute Wahl für einige Operationen, aber es wird Sie umbringen, wenn Sie häufig auf Arbitrary-Elemente des Arrays zugreifen müssen. – Pillsy

Antwort

10

Incanter liefert einen Wrapper um einige von Parallel Colt, einschließlich, was aussieht, eine ziemlich anständige Implementierung von schnellen, parallelisierten dichten Matrizen zu sein, die mit Clojures Seq-basierten Bibliotheken zusammenarbeiten. Ich habe es nicht benutzt, aber es sollte das sein, wonach du suchst.

Example.

+1

Hinweis: Diese Antwort ist jetzt ziemlich veraltet. Incanter verwendet jetzt Clatrix, und es gibt neue erweiterte Matrix-Implementierungen, die verfügbar sind (siehe 'core.matrix' und seine verschiedenen Implementierungen, zB' vectorz-clj'. – mikera

-1

Ich bin kein Experte, aber hier ist meiner Meinung nach sowieso :)

list-of-Listen ist wahrscheinlich die natürlichste Clojure Idiom für Matrizen darstellen. Diese Struktur eignet sich auch gut zum Abbilden/Reduzieren von Arten von Operationen. Clojure ist auch sehr effizient im Umgang mit Sequenzen - wahrscheinlich besser als die meisten Alternativen.

Ich kann nicht dazu schwören, aber ich denke, Clojure arbeitete 3 oder alle 4 meiner CPUs hart auf Programme, die ich geschrieben habe, die funktionell waren, aber keinen Versuch gemacht haben, parallel zu sein. Ich vermute, dass der Compiler einige Möglichkeiten für die parallele Verarbeitung selbst findet.

Ich denke, die von Clojure erstellten Sequenztypen funktionieren als Listen in Java, oder zumindest als Iterable. Das ist wahrscheinlich gut genug für das, was Sie wollen, obwohl Sie möglicherweise Probleme bekommen, wenn Sie versuchen, diese Strukturen als in Java modifizierbar zu behandeln.

Auf Listen kann am besten sequenziell zugegriffen werden. Wenn Sie planen, in der Matrix viel herumzuspringen, könnte Ihnen ein Vektorvektor etwas leistungsfähiger sein. Ich vermute, dass das mit der nth Funktion funktioniert.

Als ehemaliger C-Programmierer habe ich kurz überlegt, dass Sie Ihre Matrix als eindimensionale Struktur (d. H. Eine gerade Sequenz oder besser einen Vektor) implementieren und eigene Indexberechnungen durchführen können, um das richtige Element zu finden. Sie könnten die Partition Funktion verwenden, um durch sie zu gehen ... nun, das könnte gemacht werden, um zu arbeiten, aber ich vermute, es gibt sehr gute Gründe nicht zu.

2

Ich verwende derzeit die Liste der Listen Ansatz in cryptovide, weil es sehr wichtig für diese Anwendung halten Dinge faul. Ich überlege auch, auf einen effizienteren Ansatz zu wechseln, solange er mindestens die Außendarstellung faul hält.

0

Rich Hickey Clojure ist eine JVM-basierte Lisp, die PersistentVector (keine PersistentList) mit einem 32-Wege-Baum darstellt.

Wenn Sie Ihre eigene Matrix Typ schreiben möchten, würde ich PersistentVector verwenden, ansonsten ist die beste Wahl, Parallel Colt mit Incanter zu verwenden.

5

Ich schreibe eine Matrix-Bibliothek umhüllt jblas genannt, vorläufig, Clatrix. Es fehlen viele Funktionen, die ich hinzufügen möchte, aber es hat das meiste, wonach Sie suchen. Schau mal, http://github.com/tel/clatrix.

0

Ich schrieb vor kurzem einen Code, der Matrix Mathematik benötigt, und zunächst verwendete ich Vector-of-Vektoren, Karte & zu reduzieren, aber fand den resultierenden Code schwer zu verstehen, wenn ich darauf zurückkehrte (ich bin neu zu Clojure Geist) . Incanter machte den gleichen Code sehr knapp, einfach zu verstehen (Standard-Matrix-Ops) und viel viel schneller.

4

Schauen Sie sich die core.matrix Vorschlag + experimentelle Umsetzung hier:

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

Sehr früh Tage zum Zeitpunkt des Schreibens, aber es lohnt sich auf ein Auge zu halten.

+2

Seit März 2014 habe ich dies zu einem ziemlich umfassenden Array-Programmiersystem entwickelt namens 'core.matrix' – mikera

0

Die Antworten müssen möglicherweise aktualisiert werden, da 8 Jahre vergangen sind. Eine schnelle Google-Suche zeigt, dass Sie core.matrix selbst oder andere Implementierungen wie vectorz-clj verwenden können, wenn Sie mit der Clojure core.matrix-API kompatibel sein müssen.

Außerdem fand ich Neanderthal die für GPU optimiert