2016-02-28 162 views
1

breeze.linalg.Vector[breeze.linalg.Vector[Double]]轉換爲DenseMatrix的最有效方法是什麼?將矢量矢量轉換爲斯卡拉的矩陣

我嘗試使用asDenseMatrix,toBreezeMatrix,創建一個新的DenseMatrix等,但它好像我缺少最簡單明顯的方法來做到這一點。

回答

2

不是真正的漂亮,但是這將工作和可能是相當有效:

val v: Vector[Vector[Double]] = ??? 
val matrix = DenseMatrix(v.valuesIterator.map(_.valuesIterator.toArray).toSeq: _*) 

你能做出這樣更好一點通過定義隱含LiteralRowVector子類,像這樣:

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: _*) 

從它的行向量構造一個矩陣似乎很自然,所以我不確定爲什麼微風庫不會爲Vector的子類定義implcit LiteralRows。也許有更多的微風庫知識的人可以對此發表評論。