2016-02-28 4 views
1

Что является наиболее эффективным способом конвертировать breeze.linalg.Vector[breeze.linalg.Vector[Double]] в DenseMatrix?Преобразование вектора векторов в матрицу в scala

Я попытался использовать asDenseMatrix, toBreezeMatrix, создав новую DenseMatrix и т. Д., Но похоже, что мне не хватает самого простого и очевидного способа сделать это.

ответ

2

Не очень красиво, но это будет работать, и, вероятно, довольно эффективным:

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

Вы могли бы сделать это немного лучше, определяя неявное LiteralRow для подклассов Vector так:

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

Кажется довольно естественным построить матрицу из ее векторов строк, поэтому я не уверен, почему библиотека бриза не определяет implcit LiteralRows для подклассов Vector. Может быть, кто-то, кто больше знает библиотеку бриза, мог бы прокомментировать это.