2016-12-14 2 views
1

Je suis nouveau à la bibliothèque Breeze et je voudrais convertir un Map[Int, Double] en breeze.linalg.SparseVector, et idéalement sans avoir à spécifier une longueur fixe du SparseVector. J'ai réussi à atteindre l'objectif avec ce code maladroit:Conversion de carte [Int, Double] à breeze.linalg.SparseVector

import breeze.linalg.{SparseVector => SBV} 
val mySparseVector: SBV[Double] = new SBV[Double](Array.empty, Array.empty, 10000) 
myMap foreach { e => mySparseVector(e._1) = e._2 } 

Non seulement je dois spécifier une longueur fixe de 10 000, mais le code fonctionne en O (n), où n est la taille de la carte. Y a-t-il un meilleur moyen?

Répondre

1

Vous pouvez utiliser VectorBuilder. Il y a une caractéristique (malheureusement) non documentée où si vous lui dites que la longueur est -1, il vous permettra heureusement d'ajouter des choses. Vous devrez (fâcheusement) définir la longueur avant de construire le résultat ...

val vb = new VectorBuilder(length = -1) 
myMap foreach { e => vb.add(e._1, e._2) } 
vb.length = myMap.keys.max + 1 
vb.toSparseVector 

(Votre code est en fait n^2 parce que sparsevector doit être trié de sorte que vous êtes à plusieurs reprises des éléments se déplacer dans un tableau VectorBuilder vous donne n log n, ce que vous pouvez faire de mieux.)