2009-12-10 17 views
5

Ich habe festgestellt, dass Matlab einige Matrix-Funktion wirklich schnell zum Beispiel Hinzufügen von 5 zu allen Elementen eines n * n Array geschieht fast sofort, auch wenn die Matrix groß ist, weil Sie nicht durchlaufen müssen Jedes Element, das in Java dasselbe tut, dauert die For-Schleife für immer, wenn die Matrix groß ist.Matlab Matrix Funktionen in Java

Ich habe zwei Fragen, gibt es effiziente integrierte Klassen in Java für die Durchführung von Matrix-Operationen, zweitens, wie kann ich etwas kodieren, um alle Elemente einer großen Matrix in Java effizienter zu aktualisieren.

+0

Sie können Matlab-Schleife nicht wirklich mit Java-Schleife vergleichen, Java ist viel schneller. Ohne Zweifel ist Java-Schleife immer noch langsamer als spezielle Math-Bibliothek in C geschrieben. Aber sind Sie sicher, dass Ihre größte Ineffizienz in den Matrix-Operationen ist? Aus meiner Erfahrung für die gleichen Anwendungen, die von Matlab auf Java portiert wurden, mit mittelgroßen Matrizen und ohne Matrixinversion, ist die kumulative Leistung ähnlich.Sicher, wir verlieren die Leistung bei der Matrixmultiplikation/-addition, aber wir bekommen Leistung bei allem anderen, wie Methodenversand und GUI. – Mikhail

+0

Hier finden Sie eine Liste der Matlab-Funktionen und deren Entsprechung in EJML http://code.google.com/p/efficient-java-matrix-library/wiki/MatlabFunctions. Die meisten sind sehr direkte Conversions. –

Antwort

7

Colt kann der schnellste sein.

"Colt stellt eine Reihe von Open-Source-Bibliotheken für wissenschaftliche und technische High-Performance-Berechnungen in Java bereit." Zum Beispiel zeigte das Ninja-Projekt von IBM Watson, dass Java BLAS-Matrixberechnungen in der Tat bis zu 90% schneller ausführen kann als Fortran . "

JAMA!

"JAMA ist ein grundlegendes lineares Algebra-Paket für Java. Es bietet Klassen auf Benutzerebene zum Konstruieren und Manipulieren realer, dichter Matrizen."

Oder die Efficient Java Matrix Librar y

„Effiziente Java Matrix Library (EJML) eine lineare Algebra-Bibliothek zur Manipulation von dichten Matrizen Sein Design Ziele sind;. 1) für kleine und große Matrizen als rechnerisch effizient wie möglich zu sein und 2) sowohl für Anfänger als auch für Experten zugänglich zu sein. "

+0

danke. Weißt du, wie sie die Effizienz erreichen? Ich meine, was im Code passiert, denn wenn ich etwas wie Matlab oder JAMA schreiben würde, könnte ich mir keinen Weg vorstellen, die ganze Matrix zu aktualisieren, außer super langsame Schleifen zu laufen. – anon

+0

Auf der Colt-Seite stellen sie fest, dass es sich um eine Kombination aus Algorithmuswahl und Datenstruktur handelt. Sie stellen den Quellcode in ihrer Distribution zur Verfügung. Du könntest es sehen und sehen. –

+0

Ich spekuliere nur, aber sie sollten irgendwie gepackte Anweisungen (auch SIMD genannt) verwenden, um eine gewisse Parallelität zu erreichen. zum Beispiel: http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example – Amro

9

Ich bin gerade in diesen Beitrag gestolpert und dachte, ich würde meine zwei Cent in werfen. Ich bin Autor von EJML und ich arbeite auch an einer Performance und Stabilität Benchmark für Java-Bibliotheken. Während einige Probleme bei der Bestimmung der Geschwindigkeit eines Algorithmus eine Rolle spielen, hat Mikhail Recht, dass Caching ein sehr wichtiges Problem bei der Leistung großer Matrizen ist. Bei kleineren Matrizen wird der Overhead der Bibliotheken wichtiger.

Aufgrund des Overheads im Array-Zugriff sind reine Java-Bibliotheken langsamer als hoch optimierte c-Bibliotheken, selbst wenn die Algorithmen exakt gleich sind. Einige Bibliotheken umgehen dieses Problem, indem sie auf nativen Code zugreifen. Sie könnten

http://code.google.com/p/matrix-toolkits-java/

was tut genau das zu sehen. Beim Kopieren von Speicher von Java in die native Bibliothek wird ein gewisser Aufwand anfallen, bei großen Matrizen ist dies jedoch unbedeutend.

Für eine Benchmark auf reine Java-Leistung (die, die ich auf gerade arbeite) check out:

http://code.google.com/p/java-matrix-benchmark/

Ein weiterer Maßstab ist hier:

http://www.ujmp.org/java-matrix/benchmark/

davon Entweder Benchmarks sollten Ihnen eine gute Vorstellung von der Leistung für große Matrizen geben.

+0

Ich habe die Links für Sie repariert, und jetzt, da Sie mehr als 10 Rep haben, sollten Sie keine Probleme mehr haben mehr als 1 Link in Ihren Antworten zu veröffentlichen. =) – gnovice