5

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

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

4

2 回答 2

3

我可能应该只在 DenseVector 上创建一个方法,但是

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

应该这样做。

于 2014-11-13T17:56:02.817 回答
0

接受的答案似乎没有按预期工作。考虑这个例子,尝试将两个DenseVector值转换为 a 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) => ... }
于 2018-08-29T14:37:24.723 回答