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: Breeze ライブラリの DenseMatrix クラスであり、2 次元配列と見なすことができます。

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 に答える