scala替代使用索引变量

时间:2013-04-08 20:30:06

标签: scala

假设我们有矩阵,它有基础列和非基础列。并且我们需要能够获得矩阵或非基础的基础部分。 哪些列是在声明为var base: Array[Boolean]

的数组中指定的基数

目前我这样做:

  def getMatrix(matrix: DenseMatrix[Double], pred: Boolean, m: Int, n: Int): DenseMatrix[Double] = {
    var a = DenseMatrix.zeros[Double](m, n)
    var scanPos: Int = 0
    var insertPos: Int = 0
    for (el <- base) {
      if (el == pred) {
        a(::, insertPos) := matrix(::, scanPos)
        insertPos += 1
      }
      scanPos += 1
    }
    return a
  }

但这段代码很难看,我真的讨厌它。必须有一个更优雅的解决方案,我要求它

PS:来自breeze库的DenseMatrix类,可以认为是二维数组

1 个答案:

答案 0 :(得分:0)

我不确定微风是否提供了更好的方法,但你可以这样做:

  def getMatrix(matrix: DenseMatrix[Double], pred: Boolean, m: Int, n: Int): DenseMatrix[Double] = {
    val data = base
      .zipWithIndex
      .filter(_._1 == pred)
      .map(b => matrix(::, b._2).toArray)
      .flatten

    new DenseMatrix(m, n, data)
  }

这样的事也应该有效:

  def getMatrix(matrix: DenseMatrix[Double], pred: Boolean, m: Int, n: Int): DenseMatrix[Double] = {
    val a = DenseMatrix.zeros[Double](m, n)

    for {
      x <- base.zipWithIndex.filter(_._1 == pred).zipWithIndex
      ((el, matrixIndex), newIndex) = x
    } yield a(::, newIndex) := matrix(::, matrixIndex)

    a
  }