Преобразование вектора векторов в матрицу в scala

Каков наиболее эффективный способ преобразования breeze.linalg.Vector[breeze.linalg.Vector[Double]] в DenseMatrix?

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


person Pradeep Vairamani    schedule 28.02.2016    source источник


Ответы (1)


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

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

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

person Jason Lenderman    schedule 29.02.2016