在 Scala 中将向量的向量转换为矩阵
Converting vector of vectors to Matrix in scala
将 breeze.linalg.Vector[breeze.linalg.Vector[Double]]
转换为 DenseMatrix
的最有效方法是什么?
我尝试使用 asDenseMatrix、toBreezeMatrix、创建新的 DenseMatrix 等,但似乎我错过了最简单明了的方法。
不是很漂亮,但这会起作用并且可能相当有效:
val v: Vector[Vector[Double]] = ???
val matrix = DenseMatrix(v.valuesIterator.map(_.valuesIterator.toArray).toSeq: _*)
您可以通过为 Vector
的子类定义隐式 LiteralRow
来使它更好一些,如下所示:
implicit def vectorLiteralRow[E, V](implicit ev: V <:< Vector[E]) = new LiteralRow[V, E] {
def foreach[X](row: V, fn: (Int, E) => X): Unit = row.foreachPair(fn)
def length(row: V) = row.length
}
现在有了这个隐含的范围,您就可以使用
val matrix = DenseVector(v.toArray: _*)
从行向量构造矩阵似乎很自然,所以我不确定为什么 breeze 库没有为 Vector
的子类定义 implcit LiteralRows
。也许对 breeze 库有更多了解的人可以对此发表评论。
将 breeze.linalg.Vector[breeze.linalg.Vector[Double]]
转换为 DenseMatrix
的最有效方法是什么?
我尝试使用 asDenseMatrix、toBreezeMatrix、创建新的 DenseMatrix 等,但似乎我错过了最简单明了的方法。
不是很漂亮,但这会起作用并且可能相当有效:
val v: Vector[Vector[Double]] = ???
val matrix = DenseMatrix(v.valuesIterator.map(_.valuesIterator.toArray).toSeq: _*)
您可以通过为 Vector
的子类定义隐式 LiteralRow
来使它更好一些,如下所示:
implicit def vectorLiteralRow[E, V](implicit ev: V <:< Vector[E]) = new LiteralRow[V, E] {
def foreach[X](row: V, fn: (Int, E) => X): Unit = row.foreachPair(fn)
def length(row: V) = row.length
}
现在有了这个隐含的范围,您就可以使用
val matrix = DenseVector(v.toArray: _*)
从行向量构造矩阵似乎很自然,所以我不确定为什么 breeze 库没有为 Vector
的子类定义 implcit LiteralRows
。也许对 breeze 库有更多了解的人可以对此发表评论。