2009-12-10 5 views
5

J'ai remarqué que matlab fait une fonction de matrice très rapide par exemple ajouter 5 à tous les éléments d'un tableau n * n arrive presque instantanément même si la matrice est grande car vous n'avez pas besoin de boucler chaque élément, faisant la même chose en java, la boucle for prend une éternité si la matrice est grande.matlab matrix fonctions en java

J'ai deux questions, y at-il des classes intégrées efficaces en Java pour faire des opérations matricielles, en second lieu comment puis-je coder quelque chose pour mettre à jour tous les éléments d'une grande matrice dans Java plus efficacement.

+0

Vous ne pouvez pas vraiment comparer la boucle matlab avec la boucle java, java est beaucoup plus rapide. Sans doute, la boucle java est encore plus lente que la bibliothèque Math spéciale écrite en C. Mais êtes-vous sûr que votre plus grande inefficacité est dans les opérations matricielles? De mon expérience pour les mêmes applications portées à Java de matlab, avec des matrices de taille moyenne et sans inversion de matrice, la performance cumulative est similaire.Bien sûr, nous perdons de la performance sur la multiplication/addition matricielle, mais nous gagnons en performance sur tout le reste, comme la répartition des méthodes et l'interface graphique. – Mikhail

+0

Voici une liste des fonctions Matlab et leur équivalent en EJML http://code.google.com/p/efficient-java-matrix-library/wiki/MatlabFunctions. La plupart sont des conversions très simples. –

Répondre

7

Colt peut être le plus rapide. «Colt fournit un ensemble de bibliothèques Open Source pour l'informatique scientifique et technique haute performance en Java.» «Par exemple, le projet Ninja d'IBM Watson a montré que Java pouvait en effet effectuer des calculs matriciels BLAS jusqu'à 90% aussi rapidement que Fortran optimisé "

JAMA! "JAMA est un module d'algèbre linéaire de base pour Java, qui fournit des classes au niveau de l'utilisateur pour construire et manipuler des matrices réelles et denses."

Ou le Efficient Java Matrix Librar y

« efficace Java matrice Library (EJML) est une bibliothèque d'algèbre linéaire pour manipuler des matrices denses Ses objectifs de conception sont:. 1) d'être aussi efficace informatiquement possible pour les petites et grandes matrices et 2) être accessible aux novices et aux experts. "

+0

merci. savez-vous comment ils atteignent l'efficacité? Je veux dire ce qui se passe dans le code, parce que si je devais écrire quelque chose comme matlab ou JAMA, je ne pourrais pas penser à un moyen de mettre à jour toute la matrice sauf de lancer des boucles super-lentes. – anon

+0

À partir de la page Colt, ils notent que c'est à la fois une combinaison de choix d'algorithme et de structure de données. Ils fournissent le code source dans leur distribution. Vous pouvez vérifier et voir. –

+0

Je ne fais que spéculer, mais ils devraient utiliser des instructions condensées (aussi appelées SIMD) pour obtenir un certain parallélisme. par exemple: http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example – Amro

9

Je suis tombé sur cette publication et j'ai pensé que j'y mettrais mes deux cents. Je suis auteur d'EJML et je travaille également sur un benchmark de performances et de stabilité pour les bibliothèques Java. Alors que plusieurs questions entrent en ligne de compte pour déterminer la rapidité d'un algorithme, Mikhail a raison de dire que la mise en cache est un problème très important dans la performance des grandes matrices. Pour les matrices plus petites, les frais généraux des bibliothèques deviennent plus importants. En raison de la surcharge de l'accès au tableau, les bibliothèques Java pures sont plus lentes que les bibliothèques c hautement optimisées, même si les algorithmes sont exactement les mêmes. Certaines bibliothèques contourner ce problème en effectuant des appels au code natif. Vous pouvez consulter

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

qui fait exactement cela. Il y aura un peu de surcharge dans la copie de la mémoire de Java vers la bibliothèque native, mais pour les grandes matrices c'est insignifiant.

Pour une référence sur les performances Java pur (celui que je travaille) vérifier:

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

Une autre référence est ici:

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

Chacune de ces Les benchmarks devraient vous donner une bonne idée de la performance pour les grandes matrices.

+0

J'ai corrigé les liens pour vous, et maintenant que vous avez plus de 10 Rep, vous ne devriez plus rencontrer de problèmes en postant plus d'un lien dans vos réponses. =) – gnovice