7
votes

Représentation de la matrice de clojure

Qu'est-ce qu'une bonne représentation pour les matrices dans le clojure? Je suis intéressé à traiter avec des matrices denses de nombres de points flottants. La "liste des listes" représente des sources à l'esprit, mais y a-t-il quelque chose de mieux?

Certains critères pour une bonne représentation incluent:

  • Efficacité: ils ne seront pas utilisés pour une transformation constante d'énormes ensembles de données, mais je ne veux pas passer des heures à calculer les résultats qui auraient pu être effectués en quelques minutes avec un meilleur design.
  • Interopérabilité Java: Il serait agréable de transmettre facilement les données entre les deux langues.
  • Parallèle facile: Si je peux utiliser tous les cœurs disponibles simplement en remplaçant mapper avec PMAP , ce serait bien.
  • APENABLE À L'UTILISATION DE Réduire : Cela ressemble à beaucoup de calculs que je travaille très bien avec Réduire .
  • capacité à représenter les lignes d'analyse d'image dans les lignes matricielles: pas vraiment très important, mais serait bien d'avoir.

    Toutes les pensées?


1 commentaires

Quel genre d'opérations voulez-vous faire avec ces matrices? Les représenter comme une liste de listes constitueront un choix décent pour certaines opérations, mais cela vous tuera morts si vous devez accéder aux éléments arbitrares du tableau fréquemment.


8 Réponses :


-1
votes

Je ne suis pas expert, mais voici mon avis quand même :)

Liste des listes est probablement l'idiome de clojure le plus naturel pour représenter des matrices. Cette structure se prête également bien à mapper / réduire les types d'opérations. Clojure est également assez efficace lors de la manipulation des séquences - probablement mieux que la plupart des alternatives.

Je ne peux pas jurer à cela, mais je pense que j'ai vu Clojure Travailler 3 ou tous les 4 de mes processeurs difficiles sur les programmes que j'ai écrites qui étaient fonctionnels dans le style mais n'ont pas tenté d'être parallèle. Je soupçonne que le compilateur trouve certaines possibilités de traitement parallèle seul.

Je pense que les types de séquence créés par Clojure fonctionneront comme des listes de Java, ou du moins être iblatères. C'est probablement assez bon pour ce que vous voulez, bien que vous puissiez rencontrer des problèmes si vous essayez de traiter ces structures aussi modifiables en Java.

Les listes sont mieux accessibles séquentiellement. Si vous envisagez de sauter beaucoup dans la matrice, un vecteur de vecteurs peut vous convenir un peu mieux, de la performance. Je soupçonne que les battements utilisant la fonction nième .

En tant qu'ancien programmeur C, j'ai brièvement considéré que vous pouviez implémenter votre matrice comme une structure unidimensionnelle (c'est-à-dire une séquence droite ou un vecteur meilleur), et faites vos propres calculs d'index pour trouver le bon élément. Vous pouvez utiliser la fonction la fonction pour passer à travers elle ... Eh bien, cela pourrait être fait pour travailler mais je soupçonne qu'il y a de très bonnes raisons de ne pas.


0 commentaires

10
votes

Incanter fournit une enveloppe autour de certains des Colt parallèle , y compris ce qui semble être une jolie implémentation décente de matrices denses rapides et parallèles qui interface avec les bibliothèques SEQ de Clojure. Je ne l'ai pas utilisé, mais ce devrait être ce que vous recherchez.

exemple .


1 commentaires

Remarque: cette réponse est maintenant assez obsolète. L'inchangeur utilise maintenant CLATRIX, et il existe de nouvelles implémentations matricielles plus avancées avialisables (voir core.matrix et ses différentes implémentations E.g. vectorz-clj .



2
votes

J'utilise actuellement la liste des listes approche dans Cryptovide parce que c'est très important pour Cette application à garde les choses paresseuses . Je envisage également de passer à une approche plus efficace tant qu'elle empêchait au moins la représentation extérieure paresseuse.


0 commentaires

0
votes

Rich Hickey's Clojure est un LISP basé sur la JVM qui représente persistentvector (pas une persistance) avec un arbre de 32 voies.

Si vous souhaitez écrire votre propre type matriciel, j'utiliserais persistavervector Sinon, le meilleur choix est d'utiliser du colt parallèle avec inchant.


0 commentaires

5
votes

J'écris une bibliothèque de matrice d'emballage Jblas appelé, provisoirement, Cratrix. Il manque beaucoup de fonctionnalités que je veux toujours ajouter, mais il a la plupart de ce que vous recherchez. Jetez un coup d'œil, http://github.com/tel/clatrix .


0 commentaires

0
votes

J'ai récemment écrit du code qui nécessitait des mathématiques matricielles, et j'ai d'abord utilisé des vecteurs de vecteurs, map & réduction, mais j'ai trouvé le code qui en résulte difficile à comprendre quand je suis rentré (je suis nouveau dans l'esprit de Clojure). Incanter a fait le même code très terres, facile à comprendre (ops de matrice standard) et beaucoup plus rapidement.


0 commentaires

4
votes

Consultez la proposition Core.Matrix + Mise en œuvre expérimentale ici:

https://github.com/mikera/matrix-api

Très tôt, au moment de l'écriture, mais la peine de garder un œil sur.


1 commentaires

À partir de mars 2014, je l'ai développé dans un système de programmation de matrice assez complet appelé core.matrix



0
votes

Les réponses peuvent devoir être mises à jour 8 ans. Une recherche rapide de Google montre que si vous devez être compatible avec Clojure Core.Matrix API, vous pouvez utiliser Core.Matrix elle-même ou d'autres implémentations telles que vectorz-clj.

En plus j'ai trouvé NEANDERTHAL qui est optimisé pour GPU


0 commentaires