2016-12-14 127 views
1

我是Breeze库的新手,我想将Map[Int, Double]转换为breeze.linalg.SparseVector,理想情况下无需指定固定长度的SparseVector。我成功地实现这种笨拙的代码的目标:将映射[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 } 

不仅我有指定的10,000固定长度,但代码运行在O(n),其中n是地图的大小。有没有更好的办法?

回答

1

您可以使用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,因为斯帕塞夫克托必须进行排序,所以你要反复在数组中移动元素VectorBuilder给你n log n,这是你可以做的最好的。)