2014-01-20 9 views
5

Es gibt eine Reihe von Matrix-Bibliotheken gibt für clojure:Welche Leistungseinbußen gibt es zwischen verschiedenen Clojure-Matrix-Bibliotheken?

Was sind die Leistungskompromisse zwischen diesen Bibliotheken? Ich habe gehört, dass es bei einigen der zugrundeliegenden Implementierungen Kompromisse zwischen (zum Beispiel) Matrixinstanziierung und Betriebsleistung gibt, aber ich konnte keine umfassende Ressource finden, die diese Überlegungen aufführt.

Dank

Antwort

6

Wenn Sie wollen von core.matrix, gibt es nur zwei Implementierungen derzeit die vernünftigerweise reif sind und performant machen:

  • Clatrix - Verwendungen, von denen Anrufe nativen BLAS
  • vectorz-clj - eine flexible und schnelle pure-JVM implementation

Es kommt wirklich auf Ihre Anwendungsfälle an. Wenn Sie sich hauptsächlich für große lineare Algebra-Operationen interessieren und die nativen Abhängigkeiten nicht stören, dann ist Clatrix derzeit Ihre beste Wahl - einfach weil BLAS-Implementierungen so schnell sind. Dies ist besonders nützlich für:

  • Große Matrixmultiplikation
  • Lineare Algebra (Matrizenzerlegung usw.)

Wenn Sie allgemeine Array-Programmierung Arbeit tun wollen, dann vectorz-clj den Vorteil hat, zu sein reiner JVM-Code und viel flexibler in Bezug auf Array/Matrix-Formate. Beispiele für Dinge, die vectorz-CLJ unterstützt auch, dass Sie nicht in Clatrix tun können:

  • N-dimensionale Arrays
  • Verschiedene spezialisierte Arten von spärlichen Arrays (Diagonalmatrizen, verschiedene Sparse Speicherformate etc.)
  • Arrays mit beliebigem Zugriff strided (wie Numpy)
  • Leichtbau „Ansichten“ in größere Arrays

Insgesamt vectorz-clj wird nicht so schnell sein für Dinge wie große Matrix multipl Icing, aber ist wahrscheinlich schneller als Clatrix für viele andere Operationen und kleine/mittlere Vektorarbeit. Ich würde normalerweise vectorz-clj wählen, es sei denn, ich dachte, dass die lineare Algebra-Leistung der größte Engpass wäre.

Die anderen core.matrix Implementierungen sind weniger ausgereift, können aber immer noch für bestimmte Anwendungsfälle nützlich sein. Eine nette Eigenschaft von core.matrix ist die Fähigkeit, Implementierungen zu mischen und anzupassen, während die gleiche allgemeine API verwendet wird, also ist es keine "Alles oder Nichts" -Auswahl.

Haftungsausschluss: Ich habe viele der oben genannten Projekte erstellt oder beigetragen. Ich hoffe, ich habe eine unvoreingenommene und objektive Bewertung abgegeben.

Wenn Sie keine core.matrix Unterstützung benötigen, dann haben Sie viele weitere Optionen - Sie können jede der Java-Matrixbibliotheken über Clojures Java-Interop verwenden. In der Theorie könnten dies auch core.matrix Implementierungen werden - die einzige Einschränkung ist, dass jemand die Arbeit machen muss, um die core.matrix-Protokolle zu erweitern, um die neuen Matrixtypen zu unterstützen.

+0

Danke! Ich bin definitiv geneigt, bei core.matrix für genau die "mix and match" -Fähigkeit zu bleiben, die Sie erwähnen. Auch, vielen Dank für all Ihre harte Arbeit an diesen! – metasoarous

Verwandte Themen