如何在Scala Breeze中压缩两个DenseVectors?

时间:2014-11-13 15:25:41

标签: scala-breeze

我想压缩两个DenseVectors并对每一对执行操作,并获得一个新的向量作为结果。使用scala-breeze实现这一目标的最佳方法是什么?

我可以使用他们的data字段来处理它,但我需要从结果数组中构造一个新的DenseVector

2 个答案:

答案 0 :(得分:3)

我应该在DenseVector上制作一个方法,但是

breeze.linalg.zipValues(dv1, dv2){(v1, v2) => ??? }

应该这样做。

答案 1 :(得分:0)

接受的答案似乎无法正常工作。考虑以下示例,尝试将两个DenseVector值转换为Map[String -> Double],并为每个原始输入指定一个名称。

scala> val dv1 = DenseVector.zeros[Double](4)
dv1: breeze.linalg.DenseVector[Double] = DenseVector(0.0, 0.0, 0.0, 0.0)

scala> val dv2 = DenseVector.ones[Double](4)
dv2: breeze.linalg.DenseVector[Double] = DenseVector(1.0, 1.0, 1.0, 1.0)

scala> breeze.linalg.zipValues(dv1, dv2) {(v1, v2) => Map("f1" -> v1, "f2" -> v2)}
res710: scala.collection.immutable.Map[String,breeze.linalg.DenseVector[Double]] = Map(f1 -> DenseVector(0.0, 0.0, 0.0, 0.0), f2 -> DenseVector(1.0, 1.0, 1.0, 1.0))

scala> (dv1.toScalaVector zip dv2.toScalaVector) map { case (v1, v2) => Map("f1" -> v1, "f2" -> v2)}
res711: scala.collection.immutable.Vector[scala.collection.immutable.Map[String,Double]] = Vector(Map(f1 -> 0.0, f2 -> 1.0), Map(f1 -> 0.0, f2 -> 1.0), Map(f1 -> 0.0, f2 -> 1.0), Map(f1 -> 0.0, f2 -> 1.0))

请注意,breeze.linalg.zipValues的使用是如何将映射的函数视为每个完整DenseVector的函数,因此输出为单个Map,而不是每个Map输入的组成部分(如第二个示例中一样)。

尽管效率低下(由于微风的限制,这是一种不幸的解决方法),但我在上面给出的最后一行通常应该起作用:

(dv1.toScalaVector zip dv2.toScalaVector) map { case (v1, v2) => ... }
相关问题