Clojure Matrixdarstellung

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 "Liste der Listen", aber gibt es etwas Besseres?

Einige Kriterien für eine gute Darstellung sind:

  • Effizienz: Sie werden nicht für die konstante Verarbeitung großer Datenmengen verwendet, aber ich möchte nicht stundenlang Berechnungen durchführen, die mit einem besseren Design in wenigen Minuten hätten durchgeführt werden können.
  • Java-Interoperabilität: Es wäre schön, die Daten einfach zwischen den beiden Sprachen hin- und herzuübertragen.
  • Einfache Parallelisierung: Wenn ich alle verfügbaren Kerne verwenden kann, indem ich map durch pmap ersetze, wäre das nett.
  • Zugänglich für die Verwendung von reduce : Es sieht so aus, als ob viele der Berechnungen, die ich mache, sehr gut mit reduce funktionieren.
  • Fähigkeit, Bildscanzeilen in Matrixzeilen darzustellen: Nicht wirklich sehr wichtig, aber wäre nett zu haben.

Irgendwelche Gedanken?

    
clartaq 04.11.2009, 14:59
quelle

8 Antworten

10

Incanter liefert einen Wrapper für einige Parallele Colt , einschließlich einer ziemlich anständigen Implementierung schneller, parallelisierter dichter Matrizen, die mit den seq-basierten Bibliotheken von Clojure verbunden sind. Ich habe es nicht benutzt, aber es sollte das sein, wonach du suchst.

Beispiel .

    
Mike Douglas 04.11.2009, 17:03
quelle
5

Ich schreibe eine Matrixbibliothek, die jblas genannt wird, vorläufig, Clatrix. Es fehlen viele Funktionen, die ich hinzufügen möchte, aber es hat das meiste, wonach Sie suchen. Schauen Sie sich Ссылка um.

    
J. Abrahamson 30.04.2012 22:47
quelle
4

Sehen Sie sich den core.matrix-Vorschlag + die experimentelle Implementierung hier an:

Ссылка

Sehr frühe Tage zum Zeitpunkt des Schreibens, aber es lohnt sich, im Auge zu behalten.

    
u-phoria 24.01.2013 21:55
quelle
2

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

    
Arthur Ulfeldt 04.11.2009 17:45
quelle
0

Rich Hickey's Clojure ist ein JVM-basiertes Lisp, das PersistentVector (keine PersistentList) mit einer 32-way-Struktur darstellt.

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

    
skyde 23.02.2010 13:30
quelle
0

Ich habe vor kurzem einen Code geschrieben, der Matrix-Mathe benötigt, und anfangs habe ich Vector-of-Vektoren, map & amp; zu reduzieren, aber ich fand den resultierenden Code schwer zu verstehen, als ich darauf zurückkehrte (ich bin neu bei Clojure). Incanter machte den gleichen Code sehr knapp, einfach zu verstehen (Standard-Matrix-Ops) und viel viel schneller.

    
Hendekagon 01.05.2012 00:21
quelle
0

Die Antworten müssen möglicherweise aktualisiert werden, wenn 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 habe ich Neandertaler gefunden, der für GPU optimiert ist

    
danny 11.08.2017 04:17
quelle
-1

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

Liste von Listen ist wahrscheinlich das natürlichste Clojure-Idiom für die Darstellung von Matrizen. 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 das nicht schwören, aber ich glaube, ich habe gesehen, wie Clojure 3 oder alle 4 meiner CPUs hart an Programmen arbeitete, die funktional waren, aber keinen Versuch unternahmen, 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 sind zumindest iterierbar. 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 schlägt mit der Funktion nth .

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 Funktion Partition verwenden, um durch sie hindurchzugehen ... nun, das könnte funktionieren, aber ich vermute, es gibt sehr gute Gründe dafür.

    
Carl Smotricz 04.11.2009 16:22
quelle