2

假设我们有一个矩阵,它有基列和非基列。我们需要能够获得矩阵的基部分或非基部分。哪些列是数组中指定的基数,声明如下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:来自微风库的 DenseMatrix 类,可以被视为二维数组

4

1 回答 1

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
  }
于 2013-04-08T22:45:34.157 回答