将Map [Int,Double]转换为breeze.linalg.SparseVector

时间:2016-12-14 18:54:17

标签: scala-breeze

我是Breeze图书馆的新手,我想将Map[Int, Double]转换为breeze.linalg.SparseVector,理想情况下无需指定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 }

不仅我必须指定固定长度10,000,而且代码在O(n)中运行,其中n是地图的大小。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用VectorBuilder。有一个(遗憾的)未记录的功能,如果你告诉它长度是-1,它会很乐意让你添加东西。在构造结果之前,您必须(恼人地)设置长度...

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

(你的代码实际上是n ^ 2,因为必须对SparseVector进行排序,以便你在数组中重复移动元素.VectorBuilder为你提供n log n,这是你能做的最好的。)