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

Converting Map[Int, Double] to breeze.linalg.SparseVector

我是 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是地图的大小。有没有更好的方法?

您可以使用 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,这是您能做的最好的。)