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:
map
durch pmap
ersetze, wäre das nett. reduce
: Es sieht so aus, als ob viele der Berechnungen, die ich mache, sehr gut mit reduce
funktionieren. Irgendwelche Gedanken?
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 .
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.
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.
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.
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
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.
Tags und Links math clojure linear-algebra matrix